电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

使用Docker搭建Redis主從復制的集群

瀏覽:3日期:2024-11-19 11:08:29

在主從復制模式的集群里,主節點一般是一個,從節點一般是兩個或多個,寫入主節點的數據會被復制到從節點上,這樣一旦主節點出現故障,應用系統能切換到從節點去讀寫數據,這樣能提升系統的可用性。而且如果再采用主從復制模式里默認的讀寫分離的機制,更能提升系統的緩存讀寫性能。所以對性能和實時性不高的系統而言,主從復制模式足以滿足一般的性能和安全性方面的需求。

1 概述主從復制模式

在實際應用中,如果有相應的設置,在向一臺Redis服務器里寫數據后,這個數據可以復制到另外一臺(或多臺)Redis服務器,這里數據源服務器叫主服務器(Master Server),而復制數據目的地所在的服務器叫從服務器(Slave Server)。

這種主從復制模式能帶來兩個好處,第一,可以把寫操作集中在主服務器上,把讀操作集中到從服務器上,這樣能提升讀寫性能;第二,由于出現了數據備份,所以能提升數據安全性,比如當主Redis服務器失效后,能很快切換到從服務器上讀數據。

如果在項目,并發要求不高,或者說哪怕從Redis緩存里讀不到數據對性能也不會有太大的損害,那么可以用一主一從的復制模式,效果圖如下圖所示。

使用Docker搭建Redis主從復制的集群

也可以設置一主多從的復制效果,在下圖里,給出對應的效果圖,即寫到主節點的數據會同步到兩個從節點上,其它一主多從的模式和這很相似。

使用Docker搭建Redis主從復制的集群

關于主從復制模式,請大家注意如下的要點。

第一, 一個主服務器可以帶一個或多個從服務器,甚至從服務器也可以再帶從服務器,但在復制數據時,只能把主服務器的數據復制到從服務器上,反之不能。

第二, 一臺從服務器只能跟隨一臺主服務器,而不能出現一從多主的模式。

第三, 在 Redis 2.8以后的版本里,是采用異步的復制模式,即進行主從復制時,不會影響主服務器上的讀寫數據操作。

2 用命令搭建主從集群

這里將用Docker容器來搭建一主二從模式的集群,在配置主從關系時,需要在從節點上使用slaveof命令,具體的步驟如下。

第一步,打開一個命令窗口,在其中運行如下命令創建一個名為redis-master的Redis容器,請注意它的端口是6379。

docker run -itd --name redis-master -p 6379:6379 redis:latest

第二步,再新開一個命令窗口,在其中運行如下命令創建一個名為redis-slave1的容器,請注意它的端口是6380。請注意這里是在一臺電腦上運行,所以用端口號來區別一臺主Redis容器和另外兩臺從Redis容器。如果在真實項目里,多臺Redis會部署在不同的服務器上,所以可以都用6379端口。

docker run -itd --name redis-slave1 -p 6380:6380 redis:latest

第三步,回到包含redis-master容器的命令窗口,在其中運行docker inspect redis-master命令,查看redis-master容器的信息,在其中能通過IPAddress項看到改容器的IP地址,這里是172.17.0.2。如果在真實項目里,Redis服務器所在的IP地址是固定的,而通過Docker容器啟動的Redis服務器的IP地址是動態的,所以這里要用上述命令來獲取IP地址。

第四步,在redis-master容器的命令窗口里,運行docker exec -it redis-master /bin/bash命令,進入到命令行窗口,在其中用redis-cli命令進入到Redis客戶端命令行后,再通過info replication命令查看當前的主從模式的狀態,能看到如下所示的部分結果。

c:work>docker exec -it redis-master /bin/bash root@9433cd584d80:/data# redis-cli 127.0.0.1:6379> info replication # Replication role:master connected_slaves:0

從第5行的輸出里能看到,當前reids-master容器在主從模式里的角色是“主服務器”,從第6行的輸出里能看到,當前該主服務器沒有攜帶從服務器。

同樣再到redis-slave1容器的命令窗口里,通過docker exec -it redis-slave1 /bin/bash命令進入容器的命令行窗口,也通過redis-cli命令進入客戶端命令行,也再通過info replication命令查看該Redis服務器的主從模式的狀態,部分結果如下所示。

c:work>docker exec -it redis-slave1 /bin/bash root@2e3237c60211:/data# redis-cli 127.0.0.1:6379> info replication # Replication role:master connected_slaves:0

由于此時還沒有通過命令行設置主從模式,所以從第5行和第6行的輸出結果里,依然看到當前服務器是“主服務器”,同時沒有攜帶從服務器。

第五步,在redis-slave1容器的命令窗口里,運行如下的slaveof命令,指定當前Redis服務器為從服務器。該命令的格式是slaveof IP地址 端口號,這里是指向172.17.0.2:6379所在的主服務器。

slaveof 172.17.0.2 6379

運行完該命令后,還是在redis-slave1客戶端里,再次運行info replication,會看到如下所示的部分結果。從第3行的結果里能看到,該redis-slave1服務器已經成為從服務器,并能從第4行和第5行的輸出里能確認,該從服務器是從屬于172.17.0.2:6379所在的Redis主服務器。

127.0.0.1:6379> info replication # Replication role:slave master_host:172.17.0.2 master_port:6379

此時再回到redis-master容器的命令窗口里,在Redis客戶端里再次運行info replication命令查看主從狀態,能看到如下所示的部分結果。從第4行的輸出里能看到,該Redis主服務器已經攜帶了一個從服務器。

127.0.0.1:6379> info replication # Replication role:master connected_slaves:1

第六步,再打開一個新的命令窗口,在其中運行如下命令,開啟一個新的名為redis-slave2的Redis容器,請注意它的端口是6381。

docker run -itd --name redis-slave2 -p 6381:6381 redis:latest

隨后再運行docker exec -it redis-slave2 /bin/bash命令進入該容器的命令行窗口,再通過redis-cli命令進入客戶端,運行slaveof 172.17.0.2 6379命令,把這個Redis服務器也設為從服務器,并連到redis-master這個容器所在的主Redis服務器上。

連接完成后,再回到redis-master容器所在的命令行窗口,再運行info replication命令,此時能看到如下的部分輸出,從第4行的輸出里能看到,當前該主服務器連接著兩臺從服務器。

127.0.0.1:6379> info replication # Replication role:master connected_slaves:2

至此配置完成一主兩從模式的主從模式,此時如果到兩臺從服務器里運行get name命令,返回是空,如果到redis-master容器所在的命令行窗口,在其中運行set name Peter后,再到兩臺從服務器里運行get name命令,就能看到返回值。這說明主從模式配置成功,主服務器里的數據會自動同步到各從服務器上。

3 通過配置搭建主從集群

在項目里可以用slaveof命令搭建主從模式的集群外,還可以用配置參數的方式來搭建,具體的步驟如下。

第一步,搭建主服務器redis-master的命令不變,依然用如下的命令,這里還是用6379端口。

docker run -itd --name redis-master -p 6379:6379 redis:latest

用docker inspect redis-master命令確認該Redis服務器所在容器的IP地址依然是172.17.0.2。

第二步,到C:workredisredisConf目錄里,創建配置文件redisSlave1.conf,并在其中編寫如下內容。

port 6380

slaveof 172.17.0.2 6379

通過第1行的命令,設置該Redis的端口為6380,通過第2行的slaveof配置,把該Redis服務器設置成“從模式”,并連接到redis-master所在的主服務器上。

第三步,在新的命令窗口里運行如下的命令,創建名為redids-slave1的Redis服務器。該服務器的工作端口是6380,并且用redis-server后的參數指定在啟動Redis服務器時加載redisSlave1.conf配置文件,

docker run -itd --name redis-slave1 -v C:workredisredisConf:/redisConfig:rw -p 6380:6380 redis:latest redis-server /redisConfig/redisSlave1.conf

隨后再通過docker exec -it redis-slave1 /bin/bash命令進入到該容器的命令行,由于這里Redis工作端口已經變成6380,所以需要通過redis-cli -h 127.0.0.1 -p 6380命令來進入Redis客戶端,如果在其中運行info replication命令,能看到如下的部分結果,由此能進一步確認redis-slave1服務器已經從屬于redis-master服務器。

root@80e7ae14a322:/data# redis-cli -h 127.0.0.1 -p 6380 127.0.0.1:6380> info replication # Replication role:slave master_host:172.17.0.2 master_port:6379

第四步,到C:workredisredisConf目錄里,創建配置文件redisSlave2.conf,并在其中編寫如下內容。

port 6381

slaveof 172.17.0.2 6379

這里用到了6381端口,同樣也通過slaveof命令連接到redis-master服務器上。隨后在新的命令窗口里運行如下的命令,創建名為redids-slave2的Redis服務器。該服務器的工作端口是6381,并且用redis-server后的參數指定在啟動Redis服務器時加載redisSlave2.conf配置文件,

docker run -itd --name redis-slave2 -v C:workredisredisConf:/redisConfig:rw -p 6381:6381 redis:latest redis-server /redisConfig/redisSlave2.conf

隨后再通過docker exec -it redis-slave2 /bin/bash命令進入到該容器的命令行,由于這里Redis工作端口已經變成6381,所以需要通過redis-cli -h 127.0.0.1 -p 6381命令來進入Redis客戶端,這里可以再通過info replication命令確認配置效果,部分運行結果如下所示。

root@6017108b97c4:/data# redis-cli -h 127.0.0.1 -p 6381 127.0.0.1:6381> info replication # Replication role:slave master_host:172.17.0.2 master_port:6379

至此完成了以配置文件設置主從復制集群的設置,此時如果到主服務器redis-master所在的客戶端里運行set age 18命令,再到redis-slave1和redis-slave2這兩臺從服務器里運行get age命令,能看到age的值,由此能再次確認主從服務器之間能同步數據。

4 配置讀寫分離效果

如果在上文里配置的redis-slave1和redis-slave2這兩臺從服務器里,運行info replication命令,還能看到“slave_read_only:1”這項配置,說明從服務器默認是“只讀”的,如果到redis-slave1的Redis客戶端命令行里輸入set val 1,會看到如下第2行所示的錯誤,從而能進一步驗證該Redis服務器的“只讀”屬性。

127.0.0.1:6380> set val 1

(error) READONLY You can’t write against a read only replica.

對于Redis從服務器而言,建議采用默認的“只讀”配置,因為在項目里,一般不會向作為數據同步目的地的“從服務器”上寫數據。如果業務上確實需要,可以通過如下的步驟設置“可讀可寫”的效果。

第一步,在上文提到的redisSlave2.conf配置文件里再加入一行“slave-read-only no”的配置,指定該服務器可讀可寫。

第二步,如果上文提到的redis-slave2容器還處于活動狀態,則需要先用docker stop redis-slave2停止該容器,隨后再用docker rm redis-slave2命令刪除該容器,之后可以再用如下的命令再次創建redis-slave2容器。

docker run -itd --name redis-slave2 -v C:workredisredisConf:/redisConfig:rw -p 6381:6381 redis:latest redis-server /redisConfig/redisSlave2.conf

在redis-server命令后所帶的redisSlave2.conf配置文件里,已經用“slave-read-only no”配置項設置了“可讀可寫”的模式。

第三步,再通過docker exec -it redis-slave2 /bin/bash命令進入到該容器的命令行,再通過redis-cli -h 127.0.0.1 -p 6381命令進入Redis客戶端, 此時如果再運行set val 1命令,就能成功寫入數據。

5 用心跳機制提升主從復制可靠性

在Redis主從復制模式里,如果主從服務器之間有數據同步的情況,那么從服務器會默認以一秒一次的頻率,向主服務器發送REPLCONF ACK命令,依次來確保兩者間連接通暢。這種定時交互命令確保連接的機制就叫“心跳”機制。在上文開啟的redis-master這個主服務器的命令行里,如果運行info replication命令,能看到它從屬服務器的“心跳”狀況。

127.0.0.1:6379> info replication 2 # Replication 3 role:master 4 connected_slaves:2 5 slave0:ip=172.17.0.3,port=6380,state=online,offset=16185,lag=1 6 slave1:ip=172.17.0.4,port=6381,state=online,offset=16185,lag=1

其中在第5行和第6行里,能通過lag表示該從屬服務器發送REPLCONF ACK命令的時間,這里均是1秒,這表示兩臺從服務器和主服務器的連接均屬通暢。

這里大家可以想象下,如果從服務器宕機,那么主從復制就沒有意義了。對此,可以通過如下的步驟來關聯心跳機制和主動復制的動作。

第一步,在C:workredisredisConf目錄里新建redisMaster.conf文件,在其中編寫如下的代碼。

min-slaves-to-write 2min-slaves-max-lag 15

第1行的參數表示實現主從復制的從服務器個數最少是2臺,第2行的參數表示,如果有第1行參數指定的從服務器個數(這里是2臺)的心跳延遲時間(即lag值)大于15秒,不執行主從復制。

這兩個條件是“或者”的關系,即只要出現從服務器個數小于2,或者2臺從服務器的心跳延遲時間大于15秒,主服務器即停止主從復制的操作。

第二步,通過如下的命令啟動redis-master容器,由于此時啟動Redis服務器時已經加載了上述配置,所以該Redis主服務器在執行主從復制時,會檢測第一步所設置的條件。從而能提升主從復制的可靠性。

docker run -itd --name redis-master -v C:workredisredisConf:/redisConfig:rw -p 6379:6379 redis:latest redis-server /redisConfig/redisMaster.conf

6 用偏移量檢查數據是否一致

在上文開啟的redis-master主服務器的命令行里,如果運行info replication命令,還能看到表示復制數據偏移量的master_repl_offset數據,效果如下第6行所示。這里數據是276,表示主服務器向從服務器發送數據的字節數。

127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 … master_repl_offset:276

同樣如果到redis-slave1從服務器的命令行里,也能通過info replication查看該偏移量,效果如下第7行所示。

127.0.0.1:6380> info replication # Replication role:slave master_host:172.17.0.2 master_port:6379 … slave_repl_offset:276

在從服務器里,該數據表示從主服務器中接收到的數據字節數,如果主從服務器中兩者數據一致,這說明主從服務器間的數據是同步的。

當在主服務器redis-master里運行set nextVal 1命令后,再用info replication查看master_repl_offset數值,會發現有變化,而此時再到redis-slave1從服務器運行info replication命令,會發現從服務器的master_repl_offset數值依然和主服務器一致,這說明用set nextVal 1命令在主服務器里增加的數據已經成功同步到從服務器。也就是說,如果出現Redis問題,可以通過master_repl_offset數值來檢查同步數據是否正確,由此再進一步排查問題。

總結

到此這篇關于使用Docker搭建Redis主從復制的集群的文章就介紹到這了,更多相關Docker搭建Redis主從復制的集群內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Docker
相關文章:
主站蜘蛛池模板: 河南mpp电力管_mpp电力管生产厂家_mpp电力电缆保护管价格 - 河南晨翀实业 | 创富网-B2B网站|供求信息网|b2b平台|专业电子商务网站 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 仿古瓦,仿古金属瓦,铝瓦,铜瓦,铝合金瓦-西安东申景观艺术工程有限公司 | 西安烟道厂家_排气道厂家_包立管厂家「陕西西安」推荐西安天宇烟道 | RO反渗透设备_厂家_价格_河南郑州江宇环保科技有限公司 | 气动调节阀,电动调节阀,自力式压力调节阀,切断阀「厂家」-浙江利沃夫自控阀门 | GEDORE扭力螺丝刀-GORDON防静电刷-CHEMTRONICS吸锡线-上海卓君电子有限公司 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 合肥白癜风医院_合肥治疗白癜风医院_合肥看白癜风医院哪家好_合肥华研白癜风医院 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 培训中心-海南香蕉蛋糕加盟店技术翰香原中心官网总部 | 博博会2021_中国博物馆及相关产品与技术博览会【博博会】 | 周易算网-八字测算网 - 周易算网-宝宝起名取名测名字周易八字测算网 | 空气净化器租赁,空气净化器出租,全国直租_奥司汀净化器租赁 | 铣刨料沥青破碎机-沥青再生料设备-RAP热再生混合料破碎筛分设备 -江苏锡宝重工 | 德国UST优斯特氢气检漏仪-德国舒赐乙烷检测仪-北京泽钏 | 玻璃钢型材-玻璃钢风管-玻璃钢管道,生产厂家-[江苏欧升玻璃钢制造有限公司] | 都江堰招聘网-都江堰人才网 都江堰人事人才网 都江堰人才招聘网 邢台人才网_邢台招聘网_邢台123招聘【智达人才网】 | 食安观察网| 固诺家居-全屋定制十大品牌_整体衣柜木门橱柜招商加盟 | 糖衣机,除尘式糖衣机,全自动糖衣机,泰州市长江制药机械有限公司 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 石油/泥浆/不锈钢防腐/砂泵/抽砂泵/砂砾泵/吸砂泵/压滤机泵 - 专业石油环保专用泵厂家 | 电加热导热油炉-空气加热器-导热油加热器-翅片电加热管-科安达机械 | 电主轴-高速精密电主轴-高速电机厂家-瑞德沃斯品牌有限公司 | 政府园区专业委托招商平台_助力企业选址项目快速落地_东方龙商务集团 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 温控器生产厂家-提供温度开关/热保护器定制与批发-惠州市华恺威电子科技有限公司 | 铣刨料沥青破碎机-沥青再生料设备-RAP热再生混合料破碎筛分设备 -江苏锡宝重工 | 自动部分收集器,进口无油隔膜真空泵,SPME固相微萃取头-上海楚定分析仪器有限公司 | 超声波电磁流量计-液位计-孔板流量计-料位计-江苏信仪自动化仪表有限公司 | 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 成都LED显示屏丨室内户外全彩led屏厂家方案报价_四川诺显科技 | NBA直播_NBA直播免费观看直播在线_NBA直播免费高清无插件在线观看-24直播网 | PE拉伸缠绕膜,拉伸缠绕膜厂家,纳米缠绕膜-山东凯祥包装 | 滤芯,过滤器,滤油机,贺德克滤芯,精密滤芯_新乡市宇清流体净化技术有限公司 |