1、復(fù)制的完整流程
(1)slave node啟動(dòng),僅僅保存master node的信息,包括master node的host和ip,但是復(fù)制流程沒(méi)開始
master host和ip是從哪兒來(lái)的,redis.conf里面的slaveof配置的
(2)slave node內(nèi)部有個(gè)定時(shí)任務(wù),每秒檢查是否有新的master node要連接和復(fù)制,如果發(fā)現(xiàn),就跟master node建立socket網(wǎng)絡(luò)連接
(3)slave node發(fā)送ping命令給master node
(4)口令認(rèn)證,如果master設(shè)置了requirepass,那么salve node必須發(fā)送masterauth的口令過(guò)去進(jìn)行認(rèn)證
(5)master node第一次執(zhí)行全量復(fù)制,將所有數(shù)據(jù)發(fā)給slave node
(6)master node后續(xù)持續(xù)將寫命令,異步復(fù)制給slave node
2、數(shù)據(jù)同步相關(guān)的核心機(jī)制
指的就是第一次slave連接msater的時(shí)候,執(zhí)行的全量復(fù)制,那個(gè)過(guò)程里面你的一些細(xì)節(jié)的機(jī)制
(1)master和slave都會(huì)維護(hù)一個(gè)offset
master會(huì)在自身不斷累加offset,slave也會(huì)在自身不斷累加offset
slave每秒都會(huì)上報(bào)自己的offset給master,同時(shí)master也會(huì)保存每個(gè)slave的offset
這個(gè)倒不是說(shuō)特定就用在全量復(fù)制的,主要是master和slave都要知道各自的數(shù)據(jù)的offset,才能知道互相之間的數(shù)據(jù)不一致的情況
(2)backlog
master node有一個(gè)backlog,默認(rèn)是1MB大小
master node給slave node復(fù)制數(shù)據(jù)時(shí),也會(huì)將數(shù)據(jù)在backlog中同步寫一份
backlog主要是用來(lái)做全量復(fù)制中斷候的增量復(fù)制的
(3)master run id

info server,可以看到master run id
如果根據(jù)host+ip定位master node,是不靠譜的,如果master node重啟或者數(shù)據(jù)出現(xiàn)了變化,那么slave node應(yīng)該根據(jù)不同的run id區(qū)分,run id不同就做全量復(fù)制
如果需要不更改run id重啟redis,可以使用redis-cli debug reload命令
(4)psync
從節(jié)點(diǎn)使用psync從master node進(jìn)行復(fù)制,psync runid offset
master node會(huì)根據(jù)自身的情況返回響應(yīng)信息,可能是FULLRESYNC runid offset觸發(fā)全量復(fù)制,可能是CONTINUE觸發(fā)增量復(fù)制
3、全量復(fù)制

(1)master執(zhí)行bgsave,在本地生成一份rdb快照文件
(2)master node將rdb快照文件發(fā)送給salve node,如果rdb復(fù)制時(shí)間超過(guò)60秒(repl-timeout),那么slave node就會(huì)認(rèn)為復(fù)制失敗,可以適當(dāng)調(diào)節(jié)大這個(gè)參數(shù)
(3)對(duì)于千兆網(wǎng)卡的機(jī)器,一般每秒傳輸100MB,6G文件,很可能超過(guò)60s
(4)master node在生成rdb時(shí),會(huì)將所有新的寫命令緩存在內(nèi)存中,在salve node保存了rdb之后,再將新的寫命令復(fù)制給salve node
(5)client-output-buffer-limit slave 256MB 64MB 60,如果在復(fù)制期間,內(nèi)存緩沖區(qū)持續(xù)消耗超過(guò)64MB,或者一次性超過(guò)256MB,那么停止復(fù)制,復(fù)制失敗
(6)slave node接收到rdb之后,清空自己的舊數(shù)據(jù),然后重新加載rdb到自己的內(nèi)存中,同時(shí)基于舊的數(shù)據(jù)版本對(duì)外提供服務(wù)
(7)如果slave node開啟了AOF,那么會(huì)立即執(zhí)行BGREWRITEAOF,重寫AOF
rdb生成、rdb通過(guò)網(wǎng)絡(luò)拷貝、slave舊數(shù)據(jù)的清理、slave aof rewrite,很耗費(fèi)時(shí)間
如果復(fù)制的數(shù)據(jù)量在4G~6G之間,那么很可能全量復(fù)制時(shí)間消耗到1分半到2分鐘
4、增量復(fù)制
(1)如果全量復(fù)制過(guò)程中,master-slave網(wǎng)絡(luò)連接斷掉,那么salve重新連接master時(shí),會(huì)觸發(fā)增量復(fù)制
(2)master直接從自己的backlog中獲取部分丟失的數(shù)據(jù),發(fā)送給slave node,默認(rèn)backlog就是1MB
(3)msater就是根據(jù)slave發(fā)送的psync中的offset來(lái)從backlog中獲取數(shù)據(jù)的
5、heartbeat
主從節(jié)點(diǎn)互相都會(huì)發(fā)送heartbeat信息
master默認(rèn)每隔10秒發(fā)送一次heartbeat,salve node每隔1秒發(fā)送一個(gè)heartbeat
6、異步復(fù)制
master每次接收到寫命令之后,現(xiàn)在內(nèi)部寫入數(shù)據(jù),然后異步發(fā)送給slave node