在實際場景中,單一節點的 redis 容易面臨風險node
機器故障git
容量瓶勁github
總結redis
配置文件數據庫
啓動命令安全
客戶端命令服務器
查看複製信息 - 經過 info replication 命令能夠看到複製的一些信息 配置文件中注意事項 - 查看 LOG 文件位置 - 保護模式 - 密碼配置
1.鏈接創建階段「準備階段」網絡
2.數據同步階段架構
3.命令傳播階段併發
從節點執行 slaveof 命令後,會進行如下步驟進行復制
保存主節點信息
主從節點創建 socket 鏈接
從節點經過內部運行定時任務,維護複製相關邏輯,當定時任務發現新的主節點後,會嘗試與該節點進行網絡鏈接
關於鏈接失敗
發送Ping 命令
創建鏈接成功後,從節點發送 Ping 請求進行首次通訊,Ping 命令的主要目的
![](https://raw.githubusercontent.com/xiaoshuaizhou/pic/master/pic/輪訓重試.png) \ ![](https://raw.githubusercontent.com/xiaoshuaizhou/pic/master/pic/發起重連.png) - 從節點發送的 Ping 命令成功返回後,Redis 打印日誌,並繼續後續的複製流程 ![](https://raw.githubusercontent.com/xiaoshuaizhou/pic/master/pic/ping成功日誌.png) 4. 權限驗證 - 若是主節點設置了 requirepass 參數,則須要密碼驗證,從節點必須配置 masterauth 參數保證與主節點相同的密碼才能驗證經過,若是驗證失敗,複製將終止,從節點從新發起復制流程 5. 同步數據集 - 主從複製鏈接正常通訊後,對於首次創建的複製場景,主節點會把全部的數據所有發送給從節點,這步是耗時最長的步驟 6. 命令持續複製 - 當主節點把當前數據所有發送到從節點後,便完成了複製流程,接下來主節點會持續的把命令發送給從節點,保證主從數據的一致性 ![](https://raw.githubusercontent.com/xiaoshuaizhou/pic/master/pic/命令持續複製.png)
全量複製過程
全量複製的開銷
部分複製的過程
redis 選擇決策
如何避免全量複製?
調整積壓緩衝區的大小
服務器運行ID「runid」
主節點
從節點
slave 節點須要配置該項,指向 master 的 IP 和 端口
若是 master 啓用了密碼保護,則配置該項須要填寫 master 的啓動密碼,若是master 未啓動該項,則該項須要註釋
指定 master 和 slave 鏈接中斷時的動做。\
默認是 yes,表示 slave 會繼續應答來自 client的請求,但這些數據可能已通過期「由於鏈接中斷可能沒法進行master同步」;
若配置爲 no , 則 slave 除正常應答 INFO 和 slaveof 「配置命令」外,其他來自客戶端的請求命令均會獲得 「SYNC with master in progress」 的應答,直到該 slave 和master重建鏈接成功或者 slave 提高爲 master
指定 slave 是否爲只讀,默認爲 yes\
若配置爲 no ,表示slave 是可寫的,但寫的內容在主從同步之後會被清空
指定向 slave 同步數據時,是否禁用 socket 的NO_DALY 選項,若配置爲 yes ,則表示禁用 NO_DALY ,則 tcp 協議棧會合並小包統一發送,這樣能夠減小主從傳輸間的包數量和減小帶寬,但會增長同步到 slave 的時間;
若配置爲 no , 代表啓用 NO_DALY,則 tcp 協議棧 不會延遲小包的發送時機,這樣數據同步的延時會減小,但須要更大的寬帶;
一般狀況下,應該配置爲 no 以下降同步的延時,但在主從節點間網絡負載很高的狀況下,能夠配置爲 yes
指定 slave 的優先級,在不僅一個 slave 節點的部署環境下,當 master 宕機時,redis-sentinel 會將 priorty 值最小的 slave 提高爲 master 。\
須要注意的是,若是該配置項值爲 0,則對應的 slave 永遠不會提高爲 master
雖然讀寫有優點,可以讓讀這部分分配給各個從節點,若是不夠直接添加 slave 從節點,可是會出現如下問題
複製數據延遲
對於N個從節點鏈接的時候才容許寫入「比較極端的方式」
解釋如下這個特性是怎麼工做的
主節點配置須要兩個參數
從節點故障問題
例如:maxmemory 不一致,若是主機配置 maxmemory 爲8G,從機 slave 設置爲 4G,這個時候是能夠用的,還不會報錯,單數若是要作高可用,讓從節點變成主節點的時候,就會發現數據已經丟失了,並且沒法挽回
例如:第一次的全量複製是不可避免的,這時須要選擇小主節點,且 maxmemory 值不要過大,這樣就會比較快,同時選擇在低峯值的時候作全量複製
形成全量複製的緣由
主節點若是重啓,runid 將會發生變化,若是從節點監控到 runid 是不一樣一個,它就會認爲你的節點不安全,當發生故障轉移的時候,若是主節點發生故障,那麼從機就會變成主節點。 1. 複製緩衝區空間不足。 好比默認值:1M 能夠部分複製,但若是緩衝區不夠大的話,首先須要網絡中斷,部分複製就沒法知足,其次須要增大複製緩衝區配置「relbacklogsize」,對網絡的緩衝加強 解決方案: - 在一些場景下,可能但願對主節點進行重啓。 例如:主節點內存碎片率太高,或者但願調整一些只能在啓動時調整的參數,若是使用普通的手段重啓主節點,會使得 runid 發生變化,可能致使沒必要要的全量複製 - 爲了解決這個問題,redis 提供了 debug reload 的重啓的方式,重啓後,主節點的 runid 和 offset 都不受影響,避免了 全量複製 3.當一個主機下面掛了不少個 slave 從機的時候,主機master 掛了,這時 master 主機重啓後,由於 runid 發生了變化,全部的 slave 從機都要作一次全量複製,這將引發但節點和但機器的複製風暴,開銷會很是大 - 解決方案: - 通常使用一主多從,由於主節點還同時擔任寫操做 - 能夠採用樹狀結構下降多個從節點對主節點的消耗 - 從節點採用樹狀結構很是有用,網絡開銷給位於中間層的從節點,而沒必要消耗頂層的主節點,可是這種樹狀結構也帶來了運維的複雜性,增長了手動和自動處理故障轉移的難度\ ![](https://raw.githubusercontent.com/xiaoshuaizhou/pic/master/pic/樹狀結構.png)
解決方案:
沒有最合適的方案,只有最合適的場景,讀寫分離須要業務能夠容忍必定程度的數據不一致,適合讀多寫少的業務場景,讀寫分離,是爲了要創建一主多從的架構,才能橫向任意擴展 slave node 去支撐更大的讀吞吐量