如何主從復制
向redis服務器發送下面的命令
127.0.0.1:12345> slaveof 127.0.0.1:6379
那么127.0.0.1:12345將成為127.0.0.1:6379的從服務器,也就是說127.0.0.1:6379是127.0.0.1:12345的主服務器。
redis和mysql一樣,也是異步復制。
redis 2.8之前得復制功能
- 復制方式
- 同步(sync)
從服務器啟動時執行同步操作。 - 命令傳播(command propagate)
主服務器有操作命令時會廣播給從服務器;然后從服務器在本地執行操作命令。
- 同步
-
主從服務器斷開后的恢復
redis 2.8以后恢復功能
psync代替了sync命令來執行復制時的同步操作。
- sync的同步模式
- 完整重同步
用于初次復制情況,跟sync命令執行步驟一樣。 - 部分重同步
用于斷線后重復制情況。
- 部分重同步的實現方式
- 復制偏移量
主從服務器都會維護一個復制偏移量。主服務器每次向從服務器傳播N個字節數據時,就將自己的復制偏移量的值加上N;從服務器每次收到主服務器傳播來的N個字節的數據庫,就將自己的復制偏移量的值加上N。
- 復制偏移量
復制積壓緩沖區
積壓緩存區是主服務器維護的一個固定長度先進先出隊列,默認大小為1M。當主服務器進行命令傳播時,它不僅會將寫命令發送給所有的服務器,還會將命令入隊復制到積壓緩沖區,復制緩沖區會記錄每個字節相應的復制偏移量。
假如從服務器的offset在積壓緩沖區中,就執行部分重同步;假如offset不在積壓緩沖區中,則進行完整重同步。
復制積壓緩沖區的大小= 從服務器恢復的秒數 * 每秒鐘寫的字節數大小服務器運行ID
每個redis服務器都有會自己的運行ID,運行ID在服務器啟動時自動生成,由40個隨機的16進制字符組成。當從服務器對主服務器進行初次復制時,主服務器會把自己的運行ID傳送給從服務器,從服務器則會把主服務器ID存儲下來。短線重連時,會根據主運行ID來判斷主服務器是不是變化了,不變化就繼續執行部分重同步;變化了則進行完整重同步。