Redis主從復(fù)制搭建、哨兵搭建、集群搭建全過程
主從復(fù)制
此模式的優(yōu)勢:讀寫分離,性能擴(kuò)展;容災(zāi)快速恢復(fù)
搭建步驟(例子:一主兩從)
首先定義一個(gè)目錄便于后期區(qū)分主從,單節(jié)點(diǎn)服務(wù),集群模式。我就在//home/scene/installPackage目錄下定義了一個(gè)redis-master-slave目錄
將redis.conf拷貝一份到剛剛的redis-master-slave目錄下
cp /etc/redis.conf /home/scene/installPackage/redis-master-slave
配置一主兩從,創(chuàng)建3個(gè)配置文件:redis6379.conf、redis6380.conf、redis6381.conf
先關(guān)閉aof開關(guān),將公共的redis.conf配置文件里的appendonly的值改為no即可;appendonly不關(guān)也可以,或者換名字即可
在三個(gè)文件中寫入配置內(nèi)容
首先第一個(gè),vi redis6379.conf
# 首先引入公共部分配置 include /home/scene/installPackage/redis-master-slave/redis.conf # 配置pid文件 pidfile /var/run/redis_master_slave_6379.pid # 配置啟動的端口 port 6379 # RDB文件名稱,保存在當(dāng)前目錄下了 dbfilename dump_master_slave_6379.rdb
參照redis6379.conf配置文件再配置redis6380.conf、redis6381.conf即可,快速的方式
cp redis6379.conf redis6380.conf ##然后使用vi編輯,此處無需實(shí)際編輯,輸入 :%s/6379/6380 即可全局將6379替換成6380,省去時(shí)間,然后再保存即可
啟動服務(wù),分別執(zhí)行(在/home/scene/installPackage/redis-master-slave目錄下)
redis-server redis6379.conf redis-server redis6380.conf redis-server redis6381.conf
使用客戶端連接其中服務(wù)redis-cli -p 6379,隨便哪個(gè)端口的服務(wù)都是,在客戶端使用指令info replication查看主從效果,發(fā)現(xiàn)都是獨(dú)立的主服務(wù)
在從機(jī)上(比如此處選擇6379為主節(jié)點(diǎn),6380,6381為從節(jié)點(diǎn))執(zhí)行slaveof 127.0.0.1 6379,即可實(shí)現(xiàn)主從模式,再執(zhí)行info replication查看信息,便可看到主從信息
注意,主從一旦搭建完成,主節(jié)點(diǎn)可讀可寫,從節(jié)點(diǎn)只能讀取,不能寫入,寫入會報(bào)錯(cuò)
永久化實(shí)現(xiàn)6379為主節(jié)點(diǎn),其余兩個(gè)為從節(jié)點(diǎn),配置剛剛的redis6379.conf、redis6380.conf、redis6381.conf
redis6379.conf的內(nèi)容
# 首先引入公共部分配置 include /home/scene/installPackage/redis-master-slave/redis.conf #任意ip都可以連接 bind 0.0.0.0 #關(guān)閉保護(hù),允許非本地連接 protected-mode no #進(jìn)程守護(hù)文件,存放該服務(wù)進(jìn)程號相關(guān)信息文件 pidfile /var/run/redis_master_slave_6379.pid # 配置啟動的端口 port 6379 # RDB文件名稱,保存在當(dāng)前目錄下了 dbfilename dump_master_slave_6379.rdb #日志文件保存地址 logfile "/var/run/redisms/log/6379/redis_master_slave_6379.log" #開啟aof日志形式 appendonly yes #requirepass 密碼設(shè)置可以不設(shè)置,不配置的話,密碼沒有,配置的話密碼是有的 requirepass 123456
redis6380.conf的內(nèi)容
# 首先引入公共部分配置 include /home/scene/installPackage/redis-master-slave/redis.conf #任意ip都可以連接 bind 0.0.0.0 #關(guān)閉保護(hù),允許非本地連接 protected-mode no #進(jìn)程守護(hù)文件,存放該服務(wù)進(jìn)程號相關(guān)信息文件 pidfile /var/run/redis_master_slave_6380.pid # 配置啟動的端口 port 6380 # RDB文件名稱,保存在當(dāng)前目錄下了 dbfilename dump_master_slave_6380.rdb #日志文件保存地址 logfile "/var/run/redisms/log/6380/redis_master_slave_6380.log" #主信息,格式應(yīng)該是replicaod <masterip> <materport> replicaod 127.0.0.1 6379 #如果主節(jié)點(diǎn)開啟了密碼的話,這兒要配置密碼masterauth <master-password> masterauth 123456 #開啟aof日志形式 appendonly yes #requirepass 密碼設(shè)置可以不設(shè)置,不配置的話,密碼沒有,配置的話密碼是有的 requirepass 63806380
redis6381.conf配置內(nèi)容
# 首先引入公共部分配置 include /home/scene/installPackage/redis-master-slave/redis.conf #任意ip都可以連接 bind 0.0.0.0 #關(guān)閉保護(hù),允許非本地連接 protected-mode no #進(jìn)程守護(hù)文件,存放該服務(wù)進(jìn)程號相關(guān)信息文件 pidfile /var/run/redis_master_slave_6381.pid # 配置啟動的端口 port 6381 # RDB文件名稱,保存在當(dāng)前目錄下了 dbfilename dump_master_slave_6381.rdb #日志文件保存地址 logfile "/var/run/redisms/log/6381/redis_master_slave_6381.log" #主信息,格式應(yīng)該是replicaod <masterip> <materport> replicaod 127.0.0.1 6379 #如果主節(jié)點(diǎn)開啟了密碼的話,這兒要配置密碼masterauth <master-password> masterauth 123456 #開啟aof日志形式 appendonly yes #requirepass 密碼設(shè)置可以不設(shè)置,不配置的話,密碼沒有,配置的話密碼是有的 requirepass 63816381
此時(shí)若配置了密碼的話客戶端連接指令
redis-cli -p 6379 -a 123456 redis-cli -p 6380 -a 63806380 redis-cli -p 6381 -a 63816381
主從模式服務(wù)故障
一主二從情形
情形一:某個(gè)從服務(wù)器掛掉
若有情形,主從復(fù)制模式下(不是永久的在配置文件定義6379為主節(jié)點(diǎn)),上述環(huán)境,若都正常后,突然6380節(jié)點(diǎn)服務(wù)掛了,而后又有6379redis數(shù)據(jù)進(jìn)來,此時(shí)問題就來了
- 第一個(gè)問題,重啟6380端口服務(wù),6380不是6379的從服務(wù),只有再在6380的客戶端使用指令
slaveof 127.0.0.1 6379可以再次使6379變成master服務(wù) - 第二個(gè)特點(diǎn),當(dāng)從節(jié)點(diǎn)6380服務(wù)器掛掉之后在重啟,然后指向?yàn)?379的從服務(wù)的時(shí)候,掛掉期間的數(shù)據(jù)還是和主節(jié)點(diǎn)一樣的,不會出現(xiàn)數(shù)據(jù)不同步的情形(也就是說數(shù)據(jù)還是同步過來的)
情形二:主節(jié)點(diǎn)掛掉
當(dāng)主服務(wù)節(jié)點(diǎn)掛掉之后,從服務(wù)節(jié)點(diǎn)不做任何操作,只是在info replication知道主節(jié)點(diǎn)掛了,不會上位
薪火相傳
6379為6381的master,6381為6380的master,類似6379—>6381—>6380,突然6381掛了,6381數(shù)據(jù)就不是實(shí)時(shí)的了,和上面的一主二從模式類似的問題特點(diǎn)
反客為主
當(dāng)主節(jié)點(diǎn)的突然掛了之后,可以手動的使用指令slaveof no one實(shí)現(xiàn)某一節(jié)點(diǎn)變?yōu)橹鞴?jié)點(diǎn)
若6379為master,6380、6381兩個(gè)都是6379的從節(jié)點(diǎn),突然6379掛了,然后設(shè)置6380為主節(jié)點(diǎn),在6380客戶端設(shè)置slaveof no one,6380位孤立的主節(jié)點(diǎn),6381還是6379的主節(jié)點(diǎn),除非在6381的客戶端設(shè)置slaveof 127.0.0.1 6380的時(shí)候6381才變成6380的從節(jié)點(diǎn)
主從復(fù)制原理
- 當(dāng)從服務(wù)連接上主服務(wù)之后,從服務(wù)向主服務(wù)發(fā)送進(jìn)行數(shù)據(jù)同步信息
- 主節(jié)點(diǎn)接收到從節(jié)點(diǎn)發(fā)送過來的同步信息,把主服務(wù)器數(shù)據(jù)持久化,rdb文件,把rdb文件發(fā)送從服務(wù)器,從服務(wù)器拿到rdb進(jìn)行文件讀取
- 每次主服務(wù)器進(jìn)行寫操作之后,和從服務(wù)器進(jìn)行數(shù)據(jù)的同步
從服務(wù)器只有第一次是主動去想主服務(wù),后續(xù)出現(xiàn)數(shù)據(jù)操作,都是主服務(wù)同步給從服務(wù)的
也就是第一次是全量復(fù)制(slave服務(wù)在接收到master數(shù)據(jù)庫文件數(shù)據(jù)后,將其存盤并加載到內(nèi)存中),后續(xù)是增量復(fù)制(Master后續(xù)將新的所有收集到的修改命令依次傳給slave完成同步)
哨兵模式
搭建流程
在上面搭建主從模式的基礎(chǔ)上繼續(xù)配置,在/home/scene/installPackage/redis-master-slave目錄下,新建sentinel.conf文件(文件名必須是這個(gè)),填寫以下內(nèi)容
sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster為監(jiān)控對象起的服務(wù)器名稱,1為至少有多少個(gè)哨兵同一遷移的數(shù)量
啟動哨兵模式,啟動使用指令,前提是在已搭建6379為master,6380、6381為slave的節(jié)點(diǎn)的主從基礎(chǔ)上,再執(zhí)行redis-sentinel sentinel.conf即可

假設(shè)此時(shí)6379服務(wù)掛了,哨兵服務(wù)會有一段時(shí)間間隔的才會監(jiān)控到主服務(wù)掛了,然后選舉6380、6381的節(jié)點(diǎn)去競爭當(dāng)選主服務(wù),假設(shè)6381成功被選舉成為主節(jié)點(diǎn)后,那么6380以及重啟后的6379都會是6381的從節(jié)點(diǎn),注意6379重啟后會有一段延時(shí)才會自動成為6381的從節(jié)點(diǎn),6380在6381被成功選舉成主節(jié)點(diǎn)后,6380也會有一定時(shí)間間隔才成為6381的從節(jié)點(diǎn)
選舉的條件依次為:
- 選擇優(yōu)先級靠前的(這個(gè)在redis.conf中的replica-prority的值有關(guān),默認(rèn)100,值越小優(yōu)先級越高)
- 選擇偏移量最大的(偏移量指源主機(jī)數(shù)據(jù)最全的)
- 選擇runid最小的從服務(wù)(每個(gè)redis實(shí)例啟動后都會隨機(jī)生成一個(gè)40位的runid)
缺陷——復(fù)制延遲
由于所有的寫操作都是先在master上操作,然后同步更新到Slave上,所以從Master同步到Slave機(jī)器有一定的延遲,當(dāng)系統(tǒng)很繁忙的時(shí)候,延遲問題會更加嚴(yán)重,Slave機(jī)器數(shù)量的增加也會使這個(gè)問題更加嚴(yán)重
Redis集群
集群發(fā)展及特點(diǎn):早起的Redis版本是通過代理主機(jī)的模式搭建集群的,而Redis3版本通過去中心化實(shí)現(xiàn)集群的搭建
搭建步驟
- 為了便于區(qū)分上面的主從的搭建環(huán)境,在/home/scene/installPackage目錄下創(chuàng)建目錄redis-cluser來搭建集群。創(chuàng)建集群模式案例:6379主、6389從;6380主、6390從;6381主、6391從
- 編寫配置文件redis6379.conf
# 首先引入公共部分配置 include /home/scene/installPackage/redis-cluster/redis.conf # 設(shè)置可連接ip,此處我就只指定本機(jī)的了,0.0.0.0是都可以訪問,但是安全不高 bind 127.0.0.1 170.100.131.41 # 配置pid文件,pid之前的文件路徑必須手動生成,否則啟動沒有效果,ps -ef |grep redis會沒有看到后臺pid pidfile "/var/run/redis_cluster_6379.pid" # 配置啟動的端口 port 6379 # RDB文件名稱 dbfilename "dump_cluster_6379.rdb" # 開啟集群模式 cluster-enabled yes # 設(shè)定節(jié)點(diǎn)配置文件名 cluster-config-file nodes6379.conf # 設(shè)定節(jié)點(diǎn)失聯(lián)時(shí)間,超過該時(shí)間(毫秒),集群自動進(jìn)行主從切換 cluster-node-timeout 15000
然后復(fù)制文件更改后面的配置
- 啟動各服務(wù)
redis-server redis6379.conf redis-server redis6380.conf redis-server redis6381.conf redis-server redis6389.conf redis-server redis6390.conf redis-server redis6391.conf

將六個(gè)節(jié)點(diǎn)合成一個(gè)集群
組合之前,確保所有Redis實(shí)例啟動后,配置的node-XXXX.conf都正常生成
5和6版本已經(jīng)不需要ruby環(huán)境,已經(jīng)將redis-trib.rb的功能集成到了redis-cli,而5之前的版本搭建集群需要ruby環(huán)境
進(jìn)入到最初解壓后然后make的目錄下,我的是/home/scene/installPackage/redis-6.2.6,
然后進(jìn)入到該目錄的src目錄下,里面有個(gè)redis-cli文件,在該目錄下,執(zhí)行指令,ip地址一定要實(shí)際地址
redis-cli --cluster create --cluster-replicas 1 170.100.131.41:6379 170.100.131.41:6380 170.100.131.41:6381 170.100.131.41:6389 170.100.131.41:6390 170.100.131.41:6391
replicas 1表示采用最簡單的方式配置集群,一臺主機(jī),一臺叢從機(jī),正好三組
若執(zhí)行的時(shí)候出現(xiàn)Could not connect to Redis at xx.xx.xx.xx:xx: Connection refused的時(shí)候,先查看配置文件的bind是否開放此ip,再檢查還有防火墻端口,執(zhí)行效果如下,我這兒生成一個(gè)All 16384 slots covered.

上面的slots插槽的用處

一個(gè)redis集群包含16384個(gè)插槽(hash slot),數(shù)據(jù)庫中的每個(gè)鍵都屬于這16384個(gè)插槽的其中一個(gè);集群使用公式CRC16(key)%16384來計(jì)算鍵key屬于哪個(gè)槽
集群的方式在客戶端連接,使用指令,在普通的連接指令加-c參數(shù)即可
redis-cli -c -p 6379
連接成功后使用指令cluster nodes查看集群信息

Redis cluster如何分配這六個(gè)節(jié)點(diǎn)
一個(gè)集群至少需要三個(gè)主節(jié)點(diǎn)
選項(xiàng)--cluster-replicas 1表示希望為集群中的每個(gè)主節(jié)點(diǎn)創(chuàng)建一個(gè)從節(jié)點(diǎn)
分配原則盡量保證每個(gè)主數(shù)據(jù)庫運(yùn)行在不通的ip地址,每個(gè)從庫和主庫不在一個(gè)ip地址上
關(guān)于slot槽的分配的情況說明


集群下查看某個(gè)鍵的插槽的值
cluster keyslot k1
查看某個(gè)插槽的鍵的個(gè)數(shù),注意一定要切換到主節(jié)點(diǎn)對應(yīng)的插槽區(qū)間的那個(gè)節(jié)點(diǎn)去查詢,不然會返回0
cluster countkeysinslot 12706

故障恢復(fù)
情形一:如上集群6379主、6389從;6380主、6390從;6381主、6391從,有6379的主節(jié)點(diǎn)服務(wù)突然掛了,就集群中就將對應(yīng)的6389由從節(jié)點(diǎn)轉(zhuǎn)變?yōu)橹鞴?jié)點(diǎn),當(dāng)6379再啟動的時(shí)候就會變成6389的從節(jié)點(diǎn)
情形二:當(dāng)突然6379主節(jié)點(diǎn)和其對應(yīng)的6389從節(jié)點(diǎn)都掛了的話,會根據(jù)redis.conf配置文件中的cluster-require-full-coverage的值來判定,如果值為yes,那么整個(gè)集群都會掛掉;如果值為no,也就是對應(yīng)掛了的該段槽范圍(此次案例中的啟動是0-5460的槽值)不能正常提供服務(wù),其余的還是正常的
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis實(shí)現(xiàn)短信登錄的企業(yè)實(shí)戰(zhàn)
本文主要介紹了Redis實(shí)現(xiàn)短信登錄的企業(yè)實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
CentOS7.5使用mysql_multi方式安裝MySQL5.7.28多實(shí)例(詳解)
這篇文章主要介紹了CentOS7.5使用mysql_multi方式安裝MySQL5.7.28多實(shí)例,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
Redis實(shí)戰(zhàn)之商城購物車功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了Redis實(shí)戰(zhàn)之商城購物車功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
基于Redis實(shí)現(xiàn)分布式鎖以及任務(wù)隊(duì)列
這篇文章主要介紹了基于Redis實(shí)現(xiàn)分布式鎖以及任務(wù)隊(duì)列,需要的朋友可以參考下2015-11-11
redis通過redis-dump鏡像實(shí)現(xiàn)數(shù)據(jù)遷移
本文主要介紹了redis通過redis-dump鏡像實(shí)現(xiàn)數(shù)據(jù)遷移,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04

