Redis 多机服务 : 主从同步、哨兵、集群
文章目錄
- 主從同步(復制)
- 同步
- 命令傳播
- 優缺點
- 哨兵
- 下線判斷與選舉
- 故障轉移
- 集群
- 握手
- 分片
主從同步(復制)
主從同步是Redis高可用服務的基石,其將主要存儲數據的服務器成為主服務器(master),把對主服務器進行復制的服務器成為從服務器(slave)。
并且從節點還可以是其他服務器的主節點,并且擁有屬于自己的從節點
通過主從模式來進行讀寫的分離,主服務器進行寫操作,然后將數據同步給從服務器,讓從服務器來進行讀操作,通過這種模式來分攤主服務器的壓力。
Redis的復制功能主要分為同步(sync)與命令傳播(command propagate) 兩個操作
同步
同步操作用于將從服務器的數據庫狀態更新至主服務器當前的數據庫狀態。
在從服務器對主服務器進行復制之前,需要先將從服務器的數據庫狀態更新至主服務器的服務器狀態
命令傳播
命令傳播操作用于在主服務器的數據庫狀態發生變化(執行寫命令),導致主從服務器的數據庫狀態不一致時,讓主從服務器的數據庫重新回到一致狀態。
當客戶端對主服務器進行寫操作后,此時主從服務器的數據庫狀態就會不一致。
為了能夠再次讓主從服務器的數據庫狀態恢復一致,此時主服務器會將同一命令發送給從服務器,當從服務器執行完改命令時,數據庫狀態再次恢復一致。
優缺點
優點
- 性能方面:可以實現讀寫的分離,由主服務器來進行寫操作,并將寫的結果同步至從服務器,由從服務器來進行讀操作,這樣就能將壓力分攤到各個服務器上
- 高可用:當主服務器宕機之后,可以通過故障轉移機制將從節點提升為主節點,快速的進行服務器的宕機恢復。
- 防止數據丟失:當主服務器的磁盤損壞或者數據丟失后,因為從服務器還保留相關的數據,不至于導致數據全部丟失
缺點
- 由于主從同步需要人工管理,主節點崩潰后需要人工進行從節點的提升才能恢復Redis的正常使用
從上面可以看到,主從同步并沒有一個自動的管理機制,當出現主服務器宕機的情況,需要人工干預來進行恢復,但是如果主從服務器數量龐大,又或是因為高并發導致的大量崩潰,這時需要的時間和難度都是非常大的,于是Redis中又引入了**哨兵模式(Sentinel)**來作為解決方案,將管理由人工轉向哨兵,使得Redis具有自動容災恢復的能力
哨兵
哨兵是Redis高可用性的解決方案,通過一個或者多個哨兵組成的哨兵系統,可以監控任意多個主服務器以及它們的從服務器。當某個被監視的主服務器進入下線狀態時,哨兵就會自動將下線主服務器的某個從服務器升級為新的主服務器,然后由新的主服務器繼續處理命令請求
總結下來就是哨兵模式可以用來監控主從同步服務器節點,并在主從服務器出現問題的時候實現自動容災恢復
下線判斷與選舉
由于一個主服務器可能會同時被多個哨兵進行同時進行監控,所以當一個哨兵主觀的將其判定為下線時,為了確保這個主服務器真的下線了,它會向同樣監視這一主服務器的其他哨兵進行詢問,看看它們是否也認為該服務器下線了,當積累到一定數量的下線判斷時,此時就會客觀認為主服務器下線,開始進行故障轉移。
但是故障轉移只能由一個哨兵來進行,所以此時所有監控該服務器的哨兵會進行協商,選舉出一個領頭哨兵來進行故障轉移。
每一個哨兵都會向其他哨兵發送一個帶有自己運行ID的命令,如果接收到該命令的哨兵還沒有進行投票,就會將該ID設置為它的頭領ID,并返回一個確認恢復。通過這種方法每一個哨兵都可以直到有多少個人為其投票,并選出一個票數最高的作為頭領哨兵
故障轉移
故障轉移分為以下三個步驟
集群
集群(Cluster)是Redis多機運行中最完美的方案 ,它的出現甚至可以讓我們拋棄掉主從同步和哨兵來實現Redis多機的運行。
集群是無代理模式去中心化的運行模式,客戶端發送的絕大多數命令會直接交給相關節點執行,大部分情況下請求命令不需要轉發,或者僅僅只需要轉發一次就能完成請求和響應。所以集群中的單個節點的性能與單機Redis服務器的性能非常接近,并且通過水平拓展能夠使得性能進行翻倍,所以集群的性能非常的高
由于主從同步只能有一個主節點,而集群可以擁有無數個主從節點,有著更強大的平行拓展能力。
所以在理論情況下,如果水平拓展一倍的主節點,相當于請求處理的性能也提高了一倍,也就是說通過平行拓展N倍的主從節點,就會比單機服務來說性能提升了N倍。
握手
每個節點其實就是運行在集群模式下的Redis服務器,而這些節點在一開始時都是互相獨立的,它們都處于一個只包含自己的集群中,要組建一個真正可以工作的集群,我們就必須要將各個獨立的節點通過握手的方式連接起來。
分片
集群通過分片的方式來保存數據庫中的鍵值對。
集群的整個數據庫被分為個16384個槽,并且將一個或者多個槽指派給某個節點,讓這個節點來負責管理這個槽中的數據以及相關命令,通過這種方法就能很好的進行壓力的分攤。
節點之間會互相轉遞指派槽的信息
對于發送來的命令,會通過其所在的槽來分配至對應的節點,如果分配錯誤,也會通過轉向操作來轉交給至正確的節點
總結
以上是生活随笔為你收集整理的Redis 多机服务 : 主从同步、哨兵、集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis 缓存常见问题 :缓存雪崩,缓
- 下一篇: MySQL 索引 :哈希索引、B+树索引