Redis的複製原理和配置參數

Redis使用的是master-slave主從複製模式,從2.8版本開始,這個過程是異步的。


1. 工作原理


當一個slave首次或重新連接到master的時候,會向master發送一個PSYNC命令(2.8版本之前是SYNC命令)要求同步數據。


1.1 全量同步 Full resynchronization


當master接收到slave的同步命令之後會執行BGSAVE啓動一個background進程創建.rdb持久化文件,同時會將所有新執行的寫入命令都保存到一個緩衝區裏面。當.rdb保存完畢之後,master會把.rdb文件傳送給slave,然後slave會把保存的.rdb文件load到內存裏面,最後master會將緩衝區裏面的所有寫命令發送給slave。如果master接收到多個slave的同步請求,master只會執行一次BGSAVE命令,然後把保存的.rdb文件同時傳送給所有的slave(佔用較多的資源和帶寬)。當master-slave的連接由於某種原因斷開時,slave會自動重新連接。在2.8版本之前,斷線後的重新連接是會執行全量同步,在2.8版本開始,slave是可以根據master的情況來自動選擇執行全量同步還是增量同步(partial resynchronization)。


1.2 增量同步 Partial resynchronization


從2.8版本開始,Redis在master端創建了一個複製流的內存緩衝區,master和所有slave都標記一個複製的偏移量和master runid,用於當master-slave連接短暫斷開然後重新連接的時候,master和slave可以執行增量同步,也就是從之前斷開的部分開始同步,而不需要執行全量同步。前提條件是master runid和之前是相同的,並且標記的複製偏移量仍然在複製流的內存緩衝區裏面,否則的話會執行全量同步。這種新的增量同步特性會使用PSYNC命令,而2.8版本之前會使用SYNC命令。值得注意的是,如果slave是2.8或以上的版本能夠檢測master是否支持PSYNC命令,如果不支持會自動使用SYNC命令。


2. 無盤複製 Diskless replication


從2.8.18版本開始支持無盤複製,master以流的方式直接傳送數據給slave,不需要創建.rdb文件,slave接收數據後仍然會保存.rdb文件然後load到內存裏面。這種選項的優點就是避免master的磁盤讀寫慢導致的性能問題。


3. Replication的配置


Redis的複製有3種配置方式:


3.1 在slave的配置文件redis.conf裏面添加slaveof <masterip> <masterport>,masterip是master的ip,masterport是master的端口
3.2 在使用redis-server啓動slave的時候,直接添加--slaveof <masterip> <masterport>參數(非配置文件啓動方式)
3.3 使用redis-cli連接slave,然後執行slaveof <masterip> <masterport>命令


4. slave端的相關配置


slave-read-only yes #從2.6版本開始支持只讀的slave,默認是yes的


masterauth <master-password> #如果master配置了requirepass設置密碼,slave需要配置連接master的密碼


slave-serve-stale-data yes #當slave與master斷開或者複製正在進行的時候是否繼續提供服務,默認是yes繼續服務,可以配置爲no返回錯誤提示“SYNC with master in progress”(除了INFO和SLAVEOF命令)


repl-ping-slave-period 10 #slave發送心跳的間隔時間,默認是10秒


5. master端的相關配置



repl-diskless-sync no #是否使用無盤複製 Diskless replication,默認是no


repl-diskless-sync-delay 5 #無盤複製延時開始秒數,默認是5秒,意思是當PSYNC觸發的時候,master延時多少秒開始向master傳送數據流,以便等待更多的slave連接可以同時傳送數據流,因爲一旦PSYNC開始後,如果有新的slave連接master,只能等待下次PSYNC。可以配置爲0取消等待,立即開始


repl-backlog-size 1mb #複製流的內存緩衝區大小,用於增量同步,當master-slave斷開的時候,master保存在複製流內存緩衝區的數據大小限制,默認是1mb。如果至少有1個slave連接的話,就會釋放


repl-backlog-ttl 3600 #複製流的內存緩衝區過時時間,默認3600秒,就是說無論保存在複製流內存緩衝區的數據大小是否超過限制,當master-slave斷開超過上述時間就會釋放


min-slaves-to-write 3 #從2.8版本開始,可以配置與master連接的slave的最少數量,默認是0沒有限制,如果配置>0,需要結合下面的選項一起使用,只有同時滿足這2個選項,master才能接收寫操作


min-slaves-max-lag 10 #允許master-slave的心跳最大間隔,默認是10秒,需要結合min-slaves-to-write選項一起使用


6. 複製+持久化的數據完整性考慮


如果master配置了slave,那麼強烈建議master啓用持久化。因爲當master重啓的時候,如果沒有啓用持久化,數據會全部丟失,而且當slave重新連接master的時候,slave原有的數據也會被清空。如果真的要配置不啓用持久化,最好不要設置自動啓動master,除非數據全部丟失對你來說不重要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章