這篇文章主要為大家展示了“redis中的主從復(fù)制是什么”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Redis中的主從復(fù)制是什么”這篇文章吧。
創(chuàng)新互聯(lián)長期為成百上千客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為光山企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、成都做網(wǎng)站,光山網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
Redis支持主從復(fù)制功能,可以通過執(zhí)行slaveof(Redis5版本以后改成replicaof)或者在配置文件中設(shè)置slaveof(Redis5版本以后改成replicaof)來開啟復(fù)制功能。
一主兩叢
一主多從
主Redis配置基本不用修改,重點部分在從Redis配置
# salve的端口號 port 6380 #把pid進程號寫入pidfile配置的文件 pidfile /var/run/redis_6380.pid logfile "6380.log" #指定數(shù)據(jù)存放目錄 dir /usr/local/redis‐5.0.3/data/6380 #需要注釋掉bind #bind127.0.0.1(bind綁定的是自己機器網(wǎng)卡的ip,如果有多塊網(wǎng)卡可以配多個ip,代表允許客戶端通過機器的哪些網(wǎng)卡ip去訪問,內(nèi)網(wǎng)一般可以不配置bind,注釋掉即可)
#從本機master6379的redis實例復(fù)制數(shù)據(jù),Redis5.0之前使用slaveof replicaof 192.168.0.60 6379 #配置從節(jié)點只讀 replica‐read‐only yes
redis‐server redis.conf
redis‐cli ‐p 6380
docker run --name redis-6381 -v /Users/yujiale/docker/redis/conf/redis6381.conf:/etc/redis/redis.conf -v /Users/yujiale/docker/redis/conf/sentinel6381.conf:/etc/redis/sentine.conf -v /Users/yujiale/docker/redis/data6381:/data --network localNetwork --ip 172.172.0.14 -p 16381:6379 -d redis:6.2.6 redis-server /etc/redis/redis.conf --appendonly yes
一主多從,主從同步
主負責(zé)寫,從負責(zé)讀
提升Redis的性能和吞吐量
主從的數(shù)據(jù)一致性問題
從機是主機的備份
主機宕機,從機可讀不可寫
默認情況下主機宕機后,從機不可為主機利用
哨兵可以實現(xiàn)主從切換,做到高可用
只有第一次從Redis連接主Redis時發(fā)生的是全量復(fù)制,如果是短點續(xù)傳可能是全量復(fù)制,也可能是部分復(fù)制。
流程圖
slaver與master建立socket連接
slaver關(guān)聯(lián)文件事件處理器
該處理器接收RDB文件(全量復(fù)制)、接收Master傳播來的寫命令(增量復(fù)制)
主服務(wù)器accept從服務(wù)器Socket連接后,創(chuàng)建相應(yīng)的客戶端狀態(tài)。相當于從服務(wù)器是主服務(wù)器的Client端。
發(fā)送ping命令
1、發(fā)送“pong” ,說明正常
2、返回錯誤,說明Master不正常
3、timeout,說明網(wǎng)絡(luò)超時
1、檢測socket的讀寫狀態(tài)
2、檢測Master能否正常處理
Slaver向Master發(fā)送ping命令
Master的響應(yīng):
權(quán)限驗證
主從正常連接后,進行權(quán)限驗證
主未設(shè)置密碼(requirepass=“”),從也不用設(shè)置密碼(masterauth=“”)
主設(shè)置密碼(requirepass!=""),從需要設(shè)置密碼(masterauth=主的requirepass的值)
或者從通過auth命令向主發(fā)送密碼
主Redis接收到PSYNC命令后執(zhí)行bgsave命令會生成最新的rdb快照,
主Redis發(fā)送rdb快照給從Redis時,master會繼續(xù)接收客戶端的請求,它會把這些可能修改數(shù)據(jù)集的請求緩存在內(nèi)存中存儲到relp buffer緩存中
同步快照階段:Master創(chuàng)建并發(fā)送快照RDB給Slave,Slave載入并解析快照。Master同時將此階段所產(chǎn)生的新的寫命令存儲到緩沖區(qū)。
從節(jié)點接收到rdb快照后清空老數(shù)據(jù),并加載rdb文件
同步寫緩沖階段:Master向Slave同步存儲在緩沖區(qū)的寫操作命令。
從節(jié)點接收buffer緩存文件,并加載buffer緩存文件到內(nèi)存中
從Redis接收到主Redis發(fā)送過來的命令,執(zhí)行當前命令
如果你為master配置了一個slave,不管這個slave是否是第一次連接上Master,它都會發(fā)送一個PSYNC命令給master請求復(fù)制數(shù)據(jù)。master收到PSYNC命令后,會在后臺進行數(shù)據(jù)持久化通過bgsave生成最新的rdb快照文件,持久化期間,master會繼續(xù)接收客戶端的請求,它會把這些可能修改數(shù)據(jù)集的請求緩存在內(nèi)存中。當持久化進行完畢以后,master會把這份rdb文件數(shù)據(jù)集發(fā)送給slave,slave會把接收到的數(shù)據(jù)進行持久化生成rdb,然后再加載到內(nèi)存中。然后,master再將之前緩存在內(nèi)存中的命令發(fā)送給slave。當master與slave之間的連接由于某些原因而斷開時,slave能夠自動重連Master,如果master收到了多個slave并發(fā)連接請求,它只會進行一次持久化,而不是一個連接一次,然后再把這一份持久化的數(shù)據(jù)發(fā)送給多個并發(fā)連接的slave。
大體流程跟全量復(fù)制差不多,就不過多講解
當master和slave斷開重連后,一般都會對整份數(shù)據(jù)進行復(fù)制。但從redis2.8版本開始,redis改用可以支持部分數(shù)據(jù)復(fù)制的命令PSYNC去master同步數(shù)據(jù),slave與master能夠在網(wǎng)絡(luò)連接斷開重連后只進行部分數(shù)據(jù)復(fù)制(斷點續(xù)傳)。master會在其內(nèi)存中創(chuàng)建一個復(fù)制數(shù)據(jù)用的緩存隊列,緩存最近一段時間的數(shù)據(jù),master和它所有的slave都維護了復(fù)制的數(shù)據(jù)下標offset和master的進程id,因此,當網(wǎng)絡(luò)連接斷開后,slave會請求master繼續(xù)進行未完成的復(fù)制,從所記錄的數(shù)據(jù)下標開始。如果master進程id變化了,或者從節(jié)點數(shù)據(jù)下標offset太舊,已經(jīng)不在master的緩存隊列里了,那么將會進行一次全量數(shù)據(jù)的復(fù)制。主從復(fù)制(部分復(fù)制,斷點續(xù)傳)流程圖:
Redis增量同步主要指Slave完成初始化后開始正常工作時,Master發(fā)生的寫操作同步到Slave的過程。
通常情況下,Master每執(zhí)行一個寫命令就會向Slave發(fā)送相同的寫命令,然后Slave接收并執(zhí)行。
檢測主從服務(wù)器的網(wǎng)絡(luò)連接狀態(tài)通過向主服務(wù)器發(fā)送INFO replication命令,可以列出從服務(wù)器列表,可以看出從最后一次向主發(fā)送命令距離現(xiàn)在過了多少秒。lag的值應(yīng)該在0或1之間跳動,如果超過1則說明主從之間的連接有故障。
Redis可以通過配置防止主服務(wù)器在不安全的情況下執(zhí)行寫命令min-slaves-to-write 3(min-replicas-to-write 3)min-slaves-max-lag 10(min-replicas-max-lag 10)上面的配置表示:從服務(wù)器的數(shù)量少于3個,或者三個從服務(wù)器的延遲(lag)值都大于或等于10秒時,主服務(wù)器將拒絕執(zhí)行寫命令。這里的延遲值就是上面INFOreplication命令的lag值。
如果因為網(wǎng)絡(luò)故障,主服務(wù)器傳播給從服務(wù)器的寫命令在半路丟失,那么當從服務(wù)器向主服務(wù)器發(fā)送REPLCONF ACK命令時,主服務(wù)器將發(fā)覺從服務(wù)器當前的復(fù)制偏移量少于自己的復(fù)制偏移量,然后主服務(wù)器就會根據(jù)從服務(wù)器提交的復(fù)制偏移量,在復(fù)制積壓緩沖區(qū)里面找到從服務(wù)器缺少的數(shù)據(jù),并將這些數(shù)據(jù)重新發(fā)送給從服務(wù)器。(補發(fā))網(wǎng)絡(luò)不斷增量同步:網(wǎng)斷了,再次連接時
客戶端發(fā)送saveof后主節(jié)點會判斷是否第一次復(fù)制,如果是則進行全量復(fù)制,如果不是通過runid offset偏移量進行判斷是否一致,如果一致則進行部分復(fù)制,否則進行全量復(fù)制。
以上是“Redis中的主從復(fù)制是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!