1. 程式人生 > >redis配置之tcp_nodely

redis配置之tcp_nodely

Redis repl-disable-tcp-nodelay配置

問題:在slave和master同步後(傳送psync/sync),後續的同步是否設定成TCP_NODELAY? 
假如設定成yes,則redis會合並小的TCP包從而節省頻寬,但會增加同步延遲(40ms),造成master與slave資料不一致。 
假如設定成no,則redis master會立即傳送同步資料,沒有延遲。 
前者關注效能,後者關注一致性

是否禁止複製tcp連結的tcp nodelay引數,可傳遞yes或者no。預設是no,即開啟tcp nodelay。 
如果master設定了yes來禁止tcp nodelay設定,在把資料複製給slave的時候,會減少包的數量和更小的網路頻寬。但是這也可能帶來資料的延遲。預設我們推薦更小的延遲,但是在資料量傳輸很大的場景下,建議選擇yes。

 

redis執行slaveof命令過程原理(執行步驟)


從資料庫向主資料庫傳送sync命令。
主資料庫接收sync命令後,執行BGSAVE命令(儲存快照),建立一個RDB檔案,在建立RDB檔案期間執行的命令將儲存在緩衝區中。
當主資料庫執行完BGSAVE時,會向從資料庫傳送RDB檔案,而從資料庫會接收並載入該檔案。
主資料庫將緩衝區的所有寫命令發給從伺服器執行。
以上處理完之後,之後主資料庫每執行一個寫命令,都會將被執行的寫命令傳送給從資料庫。


注意:在Redis2.8之前,主從斷線或則重啟之後再重連線,都需要做一次完整的sync操作(5步驟),即使斷線期間只有幾條的更新操作或則是沒有操作,導致系統資源極度浪費。Redis2.8之後,會用一個psync來替換sync,不會進行完整的sync操作,只需要同步斷線期間的記錄。相關引數:repl-backlog-size、repl-backlog-ttl

repl-diskless-sync-delay

diskless複製的延遲時間,防止設定為0。一旦複製開始,節點不會再接收新slave的複製請求直到下一個rdb傳輸。所以最好等待一段時間,等更多的slave連上來。 
repl-diskless-sync-delay預設為5

 

sentinel日誌資訊

# Sentinel runid is 07a40fd381d618f0716c20b270d5c1bd47ef8fa3
    +monitor master mymaster 127.0.0.1 10086 quorum 2  #主加入監控
    +slave slave 127.0.0.1:10087 127.0.0.1 10087 @ T1 127.0.0.1 10086 #檢測到一個slave並新增進slave列表
    +slave slave 127.0.0.1:10088 127.0.0.1 10088 @ T1 127.0.0.1 10086 #檢測到一個slave並新增進slave列表
    +sentinel sentinel 127.0.0.1:20087 127.0.0.1 20087 @ T1 127.0.0.1 10086 #增加了一個sentinel
    +sentinel sentinel 127.0.0.1:20088 127.0.0.1 20088 @ T1 127.0.0.1 10086 #增加了一個sentinel
    +reset-master <instance details> -- 當master被重置時.
    +slave <instance details> -- 當檢測到一個slave並新增進slave列表時.
    +failover-state-reconf-slaves <instance details> -- Failover狀態變為reconf-slaves狀態時
    +failover-detected <instance details> -- 當failover發生時
    +slave-reconf-sent <instance details> -- sentinel傳送SLAVEOF命令把它重新配置時
    +slave-reconf-inprog <instance details> -- slave被重新配置為另外一個master的slave,但資料複製還未發生時。
    +slave-reconf-done <instance details> -- slave被重新配置為另外一個master的slave並且資料複製已經與master同步時。
    -dup-sentinel <instance details> -- 刪除指定master上的冗餘sentinel時 (當一個sentinel重新啟動時,可能會發生這個事件).
    +sentinel <instance details> -- 當master增加了一個sentinel時。
    +sdown <instance details> -- 進入SDOWN狀態時;
    -sdown <instance details> -- 離開SDOWN狀態時。
    +odown <instance details> -- 進入ODOWN狀態時。
    -odown <instance details> -- 離開ODOWN狀態時。
    +new-epoch <instance details> -- 當前配置版本被更新時。
    +try-failover <instance details> -- 達到failover條件,正等待其他sentinel的選舉。
    +elected-leader <instance details> -- 被選舉為去執行failover的時候。
    +failover-state-select-slave <instance details> -- 開始要選擇一個slave當選新master時。
    no-good-slave <instance details> -- 沒有合適的slave來擔當新master
    selected-slave <instance details> -- 找到了一個適合的slave來擔當新master
    failover-state-send-slaveof-noone <instance details> -- 當把選擇為新master的slave的身份進行切換的時候。
    failover-end-for-timeout <instance details> -- failover由於超時而失敗時。
    failover-end <instance details> -- failover成功完成時。
    switch-master <master name> <oldip> <oldport> <newip> <newport> -- 當master的地址發生變化時。通常這是客戶端最感興趣的訊息了。
    +tilt -- 進入Tilt模式。
    -tilt -- 退出Tilt模式。12345678910111213141516171819202122232425262728293031

美團在Redis上踩過的一些坑-目錄(本人非美團) 
部落格地址:http://carlosfu.iteye.com/blog/2254154