redis 主從復(fù)制代碼學(xué)習(xí) - SLAVE 部分

本文代碼基于 redis 4.0.14 版本斑芜,主要涉及PSYNC協(xié)議相關(guān)。

0. 一圖勝千言

1. 在 SLAVE 上執(zhí)行 slaveof 命令

通過查詢server.commands找到處理該命令的函數(shù)為void slaveofCommand(client *c)

  1. L2014 如果參數(shù)為 no one祟霍,那么取消之前的同步杏头,將狀態(tài)設(shè)置為 MASTER;
  2. L2026 如果發(fā)送該命令的 client沸呐,本身就是 SLAVE醇王,那么返回錯(cuò)誤;
  3. L2039 如果命令中同步的地址與 redis 正在同步的地址相同崭添,那么直接返回寓娩;
  4. L2047 設(shè)置同步的地址。
  1. L1943-1944 設(shè)置需要連接的 MASTER 地址;
  2. L1945 如果當(dāng)前連接另外一個(gè) MASTER棘伴,那么斷開連接寞埠;
  3. L1952 如果當(dāng)前有 SLAVE,那么斷開連接焊夸;
  4. L1953 取消復(fù)制流程中的握手任務(wù)仁连;
  5. L1956 如果本身是 MASTER,那么將信息保存到cached_master阱穗;
  6. L1957 最后將repl_state設(shè)置為REPL_STATE_CONNECT饭冬。

至此 slaveof 命令執(zhí)行完畢。

2. SLAVE 上的 replicationCron 定時(shí)任務(wù)

slaveof 命令只是設(shè)置了信息和狀態(tài)揪阶,接下來 redis 的定時(shí)任務(wù)serverCron會(huì)以每秒一次的頻率執(zhí)行replicationCron昌抠。

在執(zhí)行 slaveof 命令之后,repl_stateREPL_STATE_CONNECT

L2554 向設(shè)置的 MASTER 地址發(fā)起連接鲁僚。

建立連接扰魂,監(jiān)聽讀寫事件,將repl_state設(shè)置為REPL_STATE_CONNECTING蕴茴。

3. 與 MASTER 建立連接之后

連接建立之后會(huì)回調(diào)syncWithMaster函數(shù):

L1609 如果 socket 有問題劝评,那么關(guān)閉連接,返回REPL_STATE_CONNECT狀態(tài)倦淀。

L1617-1626 將狀態(tài)置為REPL_STATE_RECEIVE_PONG蒋畜,向 MASTER 同步發(fā)送 PING 命令,如果失敗也退回REPL_STATE_CONNECT狀態(tài)撞叽。

驗(yàn)證接收到的 PONG 響應(yīng)姻成,如果有認(rèn)證的需要,那么再加上 AUTH 過程愿棋,如果請(qǐng)求響應(yīng)正常科展,那么狀態(tài)置為REPL_STATE_SEND_PORT

接下來發(fā)送 REPLCONF listening-port糠雨,如果有配置slave_announce_ip再發(fā)送 REPLCONF ip-address才睹,如果一切正常,那么狀態(tài)置為REPL_STATE_SEND_CAPA甘邀。

接下來向 MASTER 發(fā)送自身支持的特性琅攘,最后狀態(tài)置為REPL_STATE_SEND_PSYNC

L1769 在slaveTryPartialResynchronization方法中向 MASTER 發(fā)送 PSYNC 命令松邪,參數(shù)read_reply為0時(shí)坞琴,發(fā)送 PSYNC 命令;參數(shù)read_reply為1時(shí)逗抑,讀取響應(yīng)剧辐。

發(fā)送PSYNC命名寒亥,psync_replid默認(rèn)為"?",psync_offset默認(rèn)為"-1"荧关,如果本地有之前緩存的护盈,那么用之前的信息。

讀取 PSYNC 的響應(yīng)羞酗,如果為空繼續(xù)等待腐宋。

如果返回+FULLRESYNC,那么需要全同步檀轨,解析replid和offset信息胸竞。

如果返回+CONTINUE,那么可以增量同步参萄,這里為了 sub-slaves 在重連之后可以繼續(xù)增量同步卫枝,增加了 replid2 這個(gè)參數(shù),具體細(xì)節(jié)這里暫且略過讹挎。

L1547 replicationResurrectCachedMaster函數(shù)設(shè)置server.master的信息校赤,狀態(tài)置為REPL_STATE_CONNECTED。

L2240 注冊(cè)readQueryFromClient函數(shù)筒溃,用于處理收到的增量數(shù)據(jù)马篮。(該函數(shù)的具體細(xì)節(jié)暫且略過)

如果返回錯(cuò)誤,如果是可恢復(fù)的怜奖,返回PSYNC_TRY_LATER重試浑测,如果是不可恢復(fù)的,返回PSYNC_NOT_SUPPORTED歪玲。

L1797 如果可以增量同步迁央,直接返回。

L1835 如果是全量同步滥崩,注冊(cè)readSyncBulkPayload函數(shù)用于接收處理 RDB岖圈。(該函數(shù)的具體細(xì)節(jié)暫且略過)

如果接收 RDB 正常,最終狀態(tài)置為 REPL_STATE_CONNECTED钙皮,在replicationCreateMasterClient函數(shù)中也會(huì)注冊(cè)readQueryFromClient函數(shù)蜂科,用于處理收到的增量數(shù)據(jù)。

4. 再回到 replicationCron

  1. L2528 與 MASTER 建立 socket 之后株灸,如果超過server.repl_timeout閾值沒有進(jìn)行下一步 PING PONG崇摄,那么關(guān)閉連接擎值,退回 REPL_STATE_CONNECT 狀態(tài)慌烧。
  2. L2536 做全同步傳輸 RDB 期間,如果超過server.repl_timeout閾值沒有收到數(shù)據(jù)鸠儿,那么關(guān)閉連接屹蚊,退回 REPL_STATE_CONNECT 狀態(tài)厕氨。
  3. L2544 做增量同步期間,如果超過server.repl_timeout閾值沒有收到數(shù)據(jù)汹粤,那么關(guān)閉連接命斧,退回 REPL_STATE_CONNECT 狀態(tài)。

L2564 周期性向 MASTER 發(fā)送 REPLCONF ACK嘱兼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末国葬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子芹壕,更是在濱河造成了極大的恐慌汇四,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踢涌,死亡現(xiàn)場(chǎng)離奇詭異通孽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睁壁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門背苦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人潘明,你說我怎么就攤上這事行剂。” “怎么了钳降?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵硼讽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我牲阁,道長(zhǎng)固阁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任城菊,我火速辦了婚禮备燃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凌唬。我一直安慰自己并齐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布客税。 她就那樣靜靜地躺著况褪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪更耻。 梳的紋絲不亂的頭發(fā)上测垛,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音秧均,去河邊找鬼食侮。 笑死号涯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锯七。 我是一名探鬼主播链快,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼眉尸!你這毒婦竟也來了域蜗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤噪猾,失蹤者是張志新(化名)和其女友劉穎地消,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畏妖,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脉执,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戒劫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片半夷。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖迅细,靈堂內(nèi)的尸體忽然破棺而出巫橄,到底是詐尸還是另有隱情,我是刑警寧澤茵典,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布湘换,位于F島的核電站,受9級(jí)特大地震影響统阿,放射性物質(zhì)發(fā)生泄漏彩倚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一扶平、第九天 我趴在偏房一處隱蔽的房頂上張望帆离。 院中可真熱鬧,春花似錦结澄、人聲如沸哥谷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)们妥。三九已至,卻和暖如春勉吻,著一層夾襖步出監(jiān)牢的瞬間监婶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工餐曼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留压储,地道東北人鲜漩。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓源譬,卻偏偏與公主長(zhǎng)得像集惋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子踩娘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 淺談Redis主從復(fù)制 2013.09.27 11:27:00 來源: 京東 作者:張成遠(yuǎn) ( 0 條評(píng)論 )...
    epime閱讀 568評(píng)論 0 2
  • 搭建環(huán)境 為了測(cè)試Redis主從復(fù)制功能刮刑,需要在本地啟動(dòng)master和slave兩個(gè)Redis實(shí)例。這里使用doc...
    yingzong閱讀 2,589評(píng)論 1 5
  • 本篇就一下方面展開分析 如何使用主從復(fù)制养渴? 主從復(fù)制的原理(重點(diǎn)是全量復(fù)制和部分復(fù)制雷绢、以及心跳機(jī)制) 實(shí)際應(yīng)用中需...
    lucode閱讀 994評(píng)論 0 5
  • 系列 redis數(shù)據(jù)淘汰原理redis過期數(shù)據(jù)刪除策略redis server事件模型redis cluster ...
    晴天哥_王志閱讀 8,221評(píng)論 0 1
  • 2017年4月16日 星期二 今天下午第三節(jié)課是語(yǔ)文課,我要講《水滸傳》理卑。這是我第一次講翘紊,沒有前人的經(jīng)驗(yàn),我開始...
    麗娟_04b1閱讀 487評(píng)論 0 1