1、復(fù)制的完整流程
(1)slave node啟動审孽,僅僅保存master node的信息,包括master node的host和ip闷串,但是復(fù)制流程沒開始
master host和ip是從哪兒來的,redis.conf里面的slaveof配置的
(2)slave node內(nèi)部有個定時任務(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的口令過去進(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的時候一姿,執(zhí)行的全量復(fù)制七咧,那個過程里面你的一些細(xì)節(jié)的機(jī)制
(1)master和slave都會維護(hù)一個offset
master會在自身不斷累加offset,slave也會在自身不斷累加offset
slave每秒都會上報自己的offset給master叮叹,同時master也會保存每個slave的offset
這個倒不是說特定就用在全量復(fù)制的艾栋,主要是master和slave都要知道各自的數(shù)據(jù)的offset,才能知道互相之間的數(shù)據(jù)不一致的情況
(2)backlog
master node有一個backlog蛉顽,默認(rèn)是1MB大小
master node給slave node復(fù)制數(shù)據(jù)時蝗砾,也會將數(shù)據(jù)在backlog中同步寫一份
backlog主要是用來做全量復(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會根據(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ù)制時間超過60秒(repl-timeout),那么slave node就會認(rèn)為復(fù)制失敗橙喘,可以適當(dāng)調(diào)節(jié)大這個參數(shù)
(3)對于千兆網(wǎng)卡的機(jī)器时鸵,一般每秒傳輸100MB,6G文件渴杆,很可能超過60s
(4)master node在生成rdb時寥枝,會將所有新的寫命令緩存在內(nèi)存中宪塔,在salve node保存了rdb之后,再將新的寫命令復(fù)制給salve node
(5)client-output-buffer-limit slave 256MB 64MB 60囊拜,如果在復(fù)制期間某筐,內(nèi)存緩沖區(qū)持續(xù)消耗超過64MB,或者一次性超過256MB冠跷,那么停止復(fù)制南誊,復(fù)制失敗
(6)slave node接收到rdb之后,清空自己的舊數(shù)據(jù)蜜托,然后重新加載rdb到自己的內(nèi)存中抄囚,同時基于舊的數(shù)據(jù)版本對外提供服務(wù)
(7)如果slave node開啟了AOF,那么會立即執(zhí)行BGREWRITEAOF橄务,重寫AOF
rdb生成幔托、rdb通過網(wǎng)絡(luò)拷貝、slave舊數(shù)據(jù)的清理蜂挪、slave aof rewrite重挑,很耗費(fèi)時間
如果復(fù)制的數(shù)據(jù)量在4G~6G之間,那么很可能全量復(fù)制時間消耗到1分半到2分鐘
4棠涮、增量復(fù)制
(1)如果全量復(fù)制過程中谬哀,master-slave網(wǎng)絡(luò)連接斷掉,那么salve重新連接master時严肪,會觸發(fā)增量復(fù)制
(2)master直接從自己的backlog中獲取部分丟失的數(shù)據(jù)史煎,發(fā)送給slave node,默認(rèn)backlog就是1MB
(3)msater就是根據(jù)slave發(fā)送的psync中的offset來從backlog中獲取數(shù)據(jù)的
5驳糯、heartbeat
主從節(jié)點(diǎn)互相都會發(fā)送heartbeat信息
master默認(rèn)每隔10秒發(fā)送一次heartbeat篇梭,salve node每隔1秒發(fā)送一個heartbeat
6、異步復(fù)制
master每次接收到寫命令之后结窘,現(xiàn)在內(nèi)部寫入數(shù)據(jù)很洋,然后異步發(fā)送給slave node