2021-01-29:redis同步機(jī)制是怎樣的?
福哥答案2021-01-30:
[答案1:](https://italk.mashibing.com/question/detail/ques_00006009)
全量同步
master服務(wù)器會(huì)開啟一個(gè)后臺(tái)進(jìn)程用于將Redis中的數(shù)據(jù)生成一個(gè)rdb文件,與此同時(shí),服務(wù)器會(huì)緩存所有接收到的來(lái)自客戶端的寫命令(包含增、刪、改),當(dāng)后臺(tái)保存進(jìn)程處理完畢后,會(huì)將該rdb文件傳遞給slave服務(wù)器,而slave服務(wù)器會(huì)將rdb文件保存在磁盤并通過(guò)讀取該文件將數(shù)據(jù)加載到內(nèi)存,在此之后master服務(wù)器會(huì)將在此期間緩存的命令通過(guò)redis傳輸協(xié)議發(fā)送給slave服務(wù)器,然后slave服務(wù)器將這些命令依次作用于自己本地的數(shù)據(jù)集上最終達(dá)到數(shù)據(jù)的一致性。
部分同步
從redis 2.8版本以前,并不支持部分同步,當(dāng)主從服務(wù)器之間的連接斷掉之后,master服務(wù)器和slave服務(wù)器之間都是進(jìn)行全量數(shù)據(jù)同步,但是從redis 2.8開始,即使主從連接中途斷掉,也不需要進(jìn)行全量同步,因?yàn)閺倪@個(gè)版本開始融入了部分同步的概念。部分同步的實(shí)現(xiàn)依賴于在master服務(wù)器內(nèi)存中給每個(gè)slave服務(wù)器維護(hù)了一份同步日志和同步標(biāo)識(shí),每個(gè)slave服務(wù)器在跟master服務(wù)器進(jìn)行同步時(shí)都會(huì)攜帶自己的同步標(biāo)識(shí)和上次同步的最后位置。當(dāng)主從連接斷掉之后,slave服務(wù)器隔斷時(shí)間(默認(rèn)1s)主動(dòng)嘗試和master服務(wù)器進(jìn)行連接,如果從服務(wù)器攜帶的偏移量標(biāo)識(shí)還在master服務(wù)器上的同步備份日志中,那么就從slave發(fā)送的偏移量開始繼續(xù)上次的同步操作,如果slave發(fā)送的偏移量已經(jīng)不再master的同步備份日志中(可能由于主從之間斷掉的時(shí)間比較長(zhǎng)或者在斷掉的短暫時(shí)間內(nèi)master服務(wù)器接收到大量的寫操作),則必須進(jìn)行一次全量更新。在部分同步過(guò)程中,master會(huì)將本地記錄的同步備份日志中記錄的指令依次發(fā)送給slave服務(wù)器從而達(dá)到數(shù)據(jù)一致。
答案2:
2.8 版以前
Redis 通過(guò)同步(sync)和指令傳播(command propagate)兩個(gè)操作完成同步。
同步(sync):將從節(jié)點(diǎn)的數(shù)據(jù)庫(kù)狀態(tài)更新至與主節(jié)點(diǎn)的數(shù)據(jù)庫(kù)狀態(tài)一致。
1.從節(jié)點(diǎn)向主節(jié)點(diǎn)發(fā)送 SYNC 指令。
2.收到 SYNC 指令,主節(jié)點(diǎn)執(zhí)行 BGSAVE 指令,在后臺(tái)生成一個(gè) RDB 文件,并使用一個(gè)緩沖區(qū)記錄從現(xiàn)在開始執(zhí)行的所有寫指令。
3.主節(jié)點(diǎn) BGSAVE 指令執(zhí)行后,會(huì)將生成的 RDB 文件發(fā)送給從節(jié)點(diǎn)。
4.從節(jié)點(diǎn)接收、載入 RDB 文件,將數(shù)據(jù)庫(kù)狀態(tài)更新至主節(jié)點(diǎn)執(zhí)行 BGSAVE 指令時(shí)的數(shù)據(jù)庫(kù)狀態(tài)。
5.從節(jié)點(diǎn)加載完 RDB 文件,通知主節(jié)點(diǎn)將記錄在緩沖區(qū)里面的所有寫指令發(fā)送給從節(jié)點(diǎn),從節(jié)點(diǎn)執(zhí)行這些寫指令,將數(shù)據(jù)庫(kù)狀態(tài)更新至主節(jié)點(diǎn)當(dāng)前數(shù)據(jù)庫(kù)狀態(tài)。
指令傳播(command propagate):主節(jié)點(diǎn)數(shù)據(jù)被修改,會(huì)主動(dòng)向從節(jié)點(diǎn)發(fā)送執(zhí)行的寫指令,從節(jié)點(diǎn)執(zhí)行之后,兩個(gè)節(jié)點(diǎn)數(shù)據(jù)狀態(tài)又保持一致
為了解決主從節(jié)點(diǎn)斷線復(fù)制低效的問(wèn)題(SYNC過(guò)程中生成、傳輸、載入 RDB 文件耗費(fèi)大量 CPU、內(nèi)存、磁盤 IO 資源),2.8 版開始新增 PSYNC 指令。
PSYNC 具有兩種模式
完整重同步(full resynchronization),與SYNC過(guò)程基本一致。
部分重同步(partial resynchronization),借助復(fù)制偏移量、復(fù)制積壓緩沖區(qū)、服務(wù)器運(yùn)行 ID ,完成主從節(jié)點(diǎn)斷開連接后,從節(jié)點(diǎn)重連主節(jié)點(diǎn)后,條件允許,主節(jié)點(diǎn)將連接斷開期間執(zhí)行的寫指令發(fā)送給從節(jié)點(diǎn),從節(jié)點(diǎn)接收并執(zhí)行寫指令,將數(shù)據(jù)庫(kù)更新至主節(jié)點(diǎn)當(dāng)前狀態(tài)。
***
[評(píng)論](https://user.qzone.qq.com/3182319461/blog/1611874184)
Redis 數(shù)據(jù)庫(kù)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。