1、什么是主從復(fù)制?
就是指將一臺(tái)Redis服務(wù)器的數(shù)據(jù),復(fù)制到其他的Redis服務(wù)器。前者稱(chēng)為主節(jié)點(diǎn)(master),后者稱(chēng)為從節(jié)點(diǎn)(slave),數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點(diǎn)到從節(jié)點(diǎn)。默認(rèn)情況下,每臺(tái)Redis服務(wù)器都是主節(jié)點(diǎn),且一個(gè)主節(jié)點(diǎn)可以有多個(gè)從節(jié)點(diǎn)(或沒(méi)有從節(jié)點(diǎn)),但一個(gè)從節(jié)點(diǎn)只能有一個(gè)主節(jié)點(diǎn)。簡(jiǎn)單的說(shuō)就是主機(jī)數(shù)據(jù)更新后根據(jù)配置和策略, 自動(dòng)同步到備機(jī)的master/slaver機(jī)制,Master以寫(xiě)為主,Slave以讀為主。

2、主從復(fù)制有什么作用?
- 數(shù)據(jù)冗余:主從復(fù)制實(shí)現(xiàn)了數(shù)據(jù)的
熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。 - 故障恢復(fù):當(dāng)主節(jié)點(diǎn)出現(xiàn)問(wèn)題時(shí),可以由從節(jié)點(diǎn)提供服務(wù),實(shí)現(xiàn)快速的故障恢復(fù);實(shí)際上是一種服務(wù)的冗余。簡(jiǎn)單的說(shuō)就是
主服務(wù)器掛掉了,從服務(wù)器頂上去。 - 負(fù)載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫(xiě)分離,可以由主節(jié)點(diǎn)提供寫(xiě)服務(wù),由從節(jié)點(diǎn)提供讀服務(wù)(即寫(xiě)Redis數(shù)據(jù)時(shí)應(yīng)用連接主節(jié)點(diǎn),讀Redis數(shù)據(jù)時(shí)應(yīng)用連接從節(jié)點(diǎn)),分擔(dān)服務(wù)器負(fù)載;尤其是在寫(xiě)少讀多的場(chǎng)景下,通過(guò)多個(gè)從節(jié)點(diǎn)分擔(dān)讀負(fù)載,可以大大提高Redis服務(wù)器的并發(fā)量。
3、配置容器自定義網(wǎng)絡(luò)
-
docker netwoek ls可以看到 docker 有三種網(wǎng)絡(luò)類(lèi)型:bridge(橋接網(wǎng)絡(luò))、host(主機(jī)網(wǎng)路)、none(無(wú)指定網(wǎng)絡(luò))。 - 為什么要配置容器自定義網(wǎng)絡(luò)呢?因?yàn)槲矣玫氖莇ocker部署,如果不自定義,
容器重啟之后網(wǎng)絡(luò)IP就會(huì)發(fā)生變化,會(huì)導(dǎo)致構(gòu)建的主從配置失效,所以我們需要自定義網(wǎng)絡(luò)。 -
自定義網(wǎng)絡(luò),下面為創(chuàng)建自定義網(wǎng)絡(luò)的過(guò)程
自定義網(wǎng)絡(luò)
4、配置redis.conf文件
- 首先是獲取docker鏡像,docker pull redis:6.0.10,然后需要到這里獲取對(duì)應(yīng)版本的
redid.conf。 - 修改默認(rèn)
redis.conf配置文件:
1、bind 0.0.0.0 //修改為允許所有的ip都能訪問(wèn),默認(rèn)是:127.0.0.1 因?yàn)槲覀円鞴?jié)點(diǎn)和從節(jié)點(diǎn)不是同一個(gè)ip。
2、proctected-mode no //默認(rèn)yes,開(kāi)啟保護(hù)模式,這里便于測(cè)試不設(shè)密碼,生產(chǎn)就必須為yes。
3、daemonize no //默認(rèn)no,改為yes意為以守護(hù)進(jìn)程方式啟動(dòng),可后臺(tái)運(yùn)行,除非kill進(jìn)程(可選),改為yes會(huì)使以配置文件方式啟動(dòng)redis失敗。
4、dir ./ //輸入本地redis數(shù)據(jù)庫(kù)存放文件夾(可選)。
5、appendonly yes //redis持久化(可選)。
5、啟動(dòng)容器
前提:將master下的redis.conf文件復(fù)制一份給從節(jié)點(diǎn)使用,如果你在同一個(gè)主機(jī)本地中運(yùn)行,必改的標(biāo)簽為:pidfile、port、dbfilename,因?yàn)槲疫@里docker運(yùn)行,所以可不修改。
// master主節(jié)點(diǎn)
docker run -d --name redis-master --net redis-network --ip 172.50.0.2 -p 6379:6379 -v /home/gavin/qxf/redis-docker/master/conf/redis.conf:/etc/redis/redis.conf -v /home/gavin/qxf/redis-docker/master/data/:/data redis:6.0.10 redis-server /etc/redis/redis.conf --appendonly yes
// 從節(jié)點(diǎn)
docker run -d --name redis-slave1 --net redis-network --ip 172.50.0.3 -p 6380:6379 -v /home/gavin/qxf/redis-docker/slave1/conf/redis.conf:/etc/redis/redis.conf -v /home/gavin/qxf/redis-docker/slave1/data/:/data redis:6.0.10 redis-server /etc/redis/redis.conf --appendonly yes
說(shuō)明:
-
--name redis-master:容器名。 -
--net redis-network:自定義網(wǎng)絡(luò)。 -
--ip 172.50.0.2:ip地址。 -
-p 6379:6379:端口映射。 -
-v /home/gavin/qxf/redis-docker/master/conf/redis.conf:/etc/redis/redis.conf:把宿主機(jī)配置好的redis.conf放到容器內(nèi)部的這個(gè)位置中 。 -
-v /home/gavin/qxf/redis-docker/master/data/:/data:把redis持久化的數(shù)據(jù)在宿主機(jī)內(nèi)顯示,做數(shù)據(jù)備份。 -
redis:6.0.10:鏡像名。 -
redis-server /etc/redis/redis.conf:讓redis不是無(wú)配置啟動(dòng),而是按照容器內(nèi)部的這個(gè)redis.conf的配置啟動(dòng)。 -
–appendonly yes:redis啟動(dòng)后數(shù)據(jù)持久化。
6、主從配置
上述中啟動(dòng)了2個(gè)redis的實(shí)列,進(jìn)入容器后用redis-cli 登錄redis可以使用 info replication查看主從信息,發(fā)現(xiàn)所有的redis,role都為master。

使用slaveof [ip] [port]:
- 直接登錄redis,執(zhí)行
slaveof [master-ip] [master-port],如:slaveof 172.50.0.2 6379,這種方式如果容器停止后會(huì)失效。 - 將
slaveof [master-ip] [master-port]寫(xiě)入redis.conf文件中使其永久生效。
經(jīng)過(guò)如上操作后,如下所示就說(shuō)明成功了,可以進(jìn)行測(cè)試了

說(shuō)明:這里兩個(gè)容器的端口都為6379,是因?yàn)閐ocker容器之間都是隔離的所以不影響。
容器名稱(chēng) 容器IP地址 映射端口號(hào) 服務(wù)運(yùn)行模式
redis-master 172.50.0.2 6379 -> 6379 master
redis-slave1 172.50.0.3 6380 -> 6379 slave1
redis-slave1 172.50.0.4 6381 -> 6379 slave2
7、測(cè)試

從上看出slave執(zhí)行 set k v 命令會(huì)出錯(cuò),因?yàn)閺墓?jié)點(diǎn)只允許讀,不能寫(xiě)。
總結(jié)下步驟:
- docker安裝好并拉去redis鏡像。
- 配置docker的
自定義網(wǎng)絡(luò)。 - 獲取
redis.conf文件,并按上述第四點(diǎn)配置redis.conf文件后,然后放入掛載點(diǎn)即可。 - 啟動(dòng)主從節(jié)點(diǎn)redis容器,命令按上述。
- 使用
slaveof [master-ip] [master-port]配置主從節(jié)點(diǎn)。 - 使用
info replication查看主從情況,最后測(cè)試。
