docker搭建redis主從復(fù)制

1、什么是主從復(fù)制?

就是指將一臺Redis服務(wù)器的數(shù)據(jù),復(fù)制到其他的Redis服務(wù)器。前者稱為主節(jié)點(master),后者稱為從節(jié)點(slave),數(shù)據(jù)的復(fù)制是單向的,只能由主節(jié)點到從節(jié)點。默認情況下,每臺Redis服務(wù)器都是主節(jié)點,且一個主節(jié)點可以有多個從節(jié)點(或沒有從節(jié)點),但一個從節(jié)點只能有一個主節(jié)點。簡單的說就是主機數(shù)據(jù)更新后根據(jù)配置和策略, 自動同步到備機的master/slaver機制,Master以寫為主,Slave以讀為主

主從復(fù)制

2、主從復(fù)制有什么作用?
  1. 數(shù)據(jù)冗余:主從復(fù)制實現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。
  2. 故障恢復(fù):當(dāng)主節(jié)點出現(xiàn)問題時,可以由從節(jié)點提供服務(wù),實現(xiàn)快速的故障恢復(fù);實際上是一種服務(wù)的冗余。簡單的說就是主服務(wù)器掛掉了,從服務(wù)器頂上去。
  3. 負載均衡:在主從復(fù)制的基礎(chǔ)上,配合讀寫分離,可以由主節(jié)點提供寫服務(wù),由從節(jié)點提供讀服務(wù)(即寫Redis數(shù)據(jù)時應(yīng)用連接主節(jié)點,讀Redis數(shù)據(jù)時應(yīng)用連接從節(jié)點),分擔(dān)服務(wù)器負載;尤其是在寫少讀多的場景下,通過多個從節(jié)點分擔(dān)讀負載,可以大大提高Redis服務(wù)器的并發(fā)量。
3、配置容器自定義網(wǎng)絡(luò)
  • docker netwoek ls 可以看到 docker 有三種網(wǎng)絡(luò)類型:bridge(橋接網(wǎng)絡(luò))、host(主機網(wǎng)路)、none(無指定網(wǎng)絡(luò))
  • 為什么要配置容器自定義網(wǎng)絡(luò)呢?因為我用的是docker部署,如果不自定義,容器重啟之后網(wǎng)絡(luò)IP就會發(fā)生變化,會導(dǎo)致構(gòu)建的主從配置失效,所以我們需要自定義網(wǎng)絡(luò)。
  • 自定義網(wǎng)絡(luò),下面為創(chuàng)建自定義網(wǎng)絡(luò)的過程


    自定義網(wǎng)絡(luò)
4、配置redis.conf文件
  • 首先是獲取docker鏡像,docker pull redis:6.0.10,然后需要到這里獲取對應(yīng)版本的redid.conf
  • 修改默認redis.conf配置文件:
1、bind 0.0.0.0 //修改為允許所有的ip都能訪問,默認是:127.0.0.1 因為我們要主節(jié)點和從節(jié)點不是同一個ip。
2、proctected-mode no //默認yes,開啟保護模式,這里便于測試不設(shè)密碼,生產(chǎn)就必須為yes。
3、daemonize no //默認no,改為yes意為以守護進程方式啟動,可后臺運行,除非kill進程(可選),改為yes會使以配置文件方式啟動redis失敗。
4、dir ./ //輸入本地redis數(shù)據(jù)庫存放文件夾(可選)。
5、appendonly yes //redis持久化(可選)。
5、啟動容器

前提:將master下的redis.conf文件復(fù)制一份給從節(jié)點使用,如果你在同一個主機本地中運行,必改的標簽為:pidfile、port、dbfilename,因為我這里docker運行,所以可不修改。

// master主節(jié)點
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é)點
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
說明:
  • --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:把宿主機配置好的redis.conf放到容器內(nèi)部的這個位置中 。
  • -v /home/gavin/qxf/redis-docker/master/data/:/data:把redis持久化的數(shù)據(jù)在宿主機內(nèi)顯示,做數(shù)據(jù)備份。
  • redis:6.0.10:鏡像名。
  • redis-server /etc/redis/redis.conf:讓redis不是無配置啟動,而是按照容器內(nèi)部的這個redis.conf的配置啟動。
  • –appendonly yes:redis啟動后數(shù)據(jù)持久化。
6、主從配置

上述中啟動了2個redis的實列,進入容器后用redis-cli 登錄redis可以使用 info replication查看主從信息,發(fā)現(xiàn)所有的redis,role都為master。

image.png

使用slaveof [ip] [port]:
  1. 直接登錄redis,執(zhí)行 slaveof [master-ip] [master-port],如:slaveof 172.50.0.2 6379,這種方式如果容器停止后會失效。
  2. slaveof [master-ip] [master-port]寫入 redis.conf文件中使其永久生效。

經(jīng)過如上操作后,如下所示就說明成功了,可以進行測試了


image.png

說明:這里兩個容器的端口都為6379,是因為docker容器之間都是隔離的所以不影響。

容器名稱                容器IP地址           映射端口號              服務(wù)運行模式
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、測試
簡單測試

從上看出slave執(zhí)行 set k v 命令會出錯,因為從節(jié)點只允許讀,不能寫。

總結(jié)下步驟:
  1. docker安裝好并拉去redis鏡像。
  2. 配置docker的自定義網(wǎng)絡(luò)。
  3. 獲取redis.conf文件,并按上述第四點配置redis.conf文件后,然后放入掛載點即可。
  4. 啟動主從節(jié)點redis容器,命令按上述。
  5. 使用slaveof [master-ip] [master-port]配置主從節(jié)點。
  6. 使用info replication 查看主從情況,最后測試。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容