Redis主从复制(读写分离)
一、什么是主從復制
- 主從復制,就是主機數據更新后根據配置和策略,自動同步到備機的master/slaver機制,Master以寫為主,Slave以讀為主。
- 優點:讀寫分離,性能擴展,容災快速恢復
- 需要注意的時:在Redis2.6以后,slave只讀模式是默認開啟的,我們可以通過配置文件中的slave-read-only選項配置是否開啟只讀模式
同時,從機下面也還能有自己的從機。
二、主從復制的方式
三、主從復制工作原理
- 工作原理:
master服務器會記錄一個replicationId的偽隨機字符串,用于標識當前的數據集版本,還會記錄一個當數據集的偏移量offset,不管master是否有配置slave服務器,replication Id和offset會一直記錄并成對存在,我們可以通過以下命令查看replication Id和offset:
當master與slave正常連接時,slave使用PSYNC命令向master發送自己記錄的舊master的replication id和offset,而master會計算與slave之間的數據偏移量,并將緩沖區中的偏移數量同步到slave,此時master和slave的數據一致。而如果slave引用的replication太舊了,master與slave之間的數據差異太大,則master與slave之間會使用全量復制的進行數據同步。之后每次主機的寫操作,都會立刻發送給從機,從機執行相同的命令。
四、配置主從復制(兩種方式)
假設主機地址:192.168.0.101
在這里slave服務器的redis.conf文件通過saveof選項,可以指定master服務器:
上面配置的是master服務器沒有設置密碼的情況,如果master設置了密碼,則可以在連接到slave服務器的redis-cli執行下面的命令:
或者在slave服務器的redis.conf中配置下面的選項:
masterauth 密碼五、避免slave被清空
slave會被清空?slave不用同步了master的數據嗎?備份的數據怎么會清空了呢?
當master服務器關閉了持久化時,如果發生故障后自動重啟時,由本地沒有保存持久化的數據,重啟的Redis內存數據為空,而slave會自動同步master的數據,這時候,slave服務器的數據也會被清空。
如何避免slave被清空呢?
如果條件允許(一般都可以的),master服務器還是要開啟持久化,這樣master故障重啟時,可以快速恢復數據,而同步這臺master的slave數據也不會被清空。
如果master不能開啟持久化,則不應該設置讓master發生故障后重啟(有些機器會配置自動重啟),而是將某個slave服務器升級為master服務器,對外繼續提供服務。
這就是后面會講的哨兵機制。
六、主從復制中的key過期問題
我們都知道Redis可以通過設置key的過期時間來限制key的生存時間,Redis處理key過期有惰性刪除和定期刪除兩種機制,而在配置主從復制后,slave服務器就沒有權限處理過期的key,這樣的話,對于在master上過期的key,在slave服務器就可能被讀取,所以master會累積過期的key,積累一定的量之后,發送del命令到slave,刪除slave上的key。
如果slave服務器升級為master服務器 ,則它將開始獨立地計算key過期時間,而不需要通過master服務器的幫助。
七、哨兵機制
完整的哨兵機制體系
當master節點發生故障時,需要手動進行故障轉移,寫能力與存儲能力受限,寫能力和存儲能力都依賴于master節點
Sentinel 的主要功能包括:主節點存活檢測、主從運行情況檢測、自動故障轉移 (failover)、主從切換。Redis 的 Sentinel 最小配置是 一主一從。
Redis 的 Sentinel 系統可以用來管理多個 Redis 服務器,該系統可以執行以下四個任務:
1.監控
Sentinel 會不斷的檢查 主服務器 和 從服務器 是否正常運行。
2.通知 當被監控的某個 Redis服務器出現問題,Sentinel 通過 API 腳本 向 管理員 或者其他的 應用程序 發送通知。
3.自動故障轉移
當主節點不能正常工作時,Sentinel會開始一次自動的故障轉移操作,它會將與失效主節點是主從關系的其中一個從節點 升級為新的主節點,并且將其他的 從節點 指向 新的主節點。
4. 配置提供者
在 Redis Sentinel 模式下,客戶端應用 在初始化時連接的是 Sentinel 節點集合,從中獲取主節點的信息。
默認情況下,每個 Sentinel 節點會以 每秒一次 的頻率對 Redis 節點和 其它 的 Sentinel 節點發送 PING 命令,并通過節點的 回復 來判斷節點是否在線。
主觀下線
主觀下線 適用于所有 主節點 和 從節點。如果在 down-after-milliseconds 毫秒內,Sentinel 沒有收到目標節點 的有效回復,則會判定 該節點 為 主觀下線。
客觀下線
客觀下線 只適用于 主節點。如果 主節點 出現故障,Sentinel 節點會通過 sentinel
is-master-down-by-addr 命令,向其它 Sentinel 節點詢問對該節點的 狀態判斷。如果超過
個數的節點判定 主節點 不可達,則該 Sentinel 節點會判斷 主節點 為 客觀下線。
更詳細的哨兵機制介紹參考大佬文章
本文參考文章
總結
以上是生活随笔為你收集整理的Redis主从复制(读写分离)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows安装docker的坑
- 下一篇: Mysql总体架构