Redis数据库(四)——Redis集群模式(主从复制、哨兵、Cluster)
Redis數據庫(四)——Redis集群模式(主從復制、哨兵、Cluster)
- 一、Redis主從復制
- 1、主從復制流程
- 二、哨兵模式
- 1、哨兵模式集群架構
- 2、哨兵模式主要功能
- 3、哨兵監控整個系統節點的過程
- 4、主觀下線
- 5、客觀下線
- 6、master 選舉
- 7、故障遷移
- 8、優點與缺點
- 三、Cluster群集
- 四、實驗一(主從復制)
- 五、實驗二(哨兵模式)
- 六、實驗三(Cluster群集)
- 總結
- 主從復制流程
- 哨兵主要功能
- Cluster群集的功能
一、Redis主從復制
- 通過持久化功能,redis保證了即使在服務器重啟的情況下也不會丟失(或少量丟失)數據,因為持久化會把內存中的數據保存到硬盤上,重啟會從硬盤上加載數據,但是由于數據是存儲在一臺服務器上的,如果這臺服務器出現硬盤故障等問題,也會導致數據丟失。
- 為了避免單點故障,通常的做法是將數據庫復制多個副本以部署在不同的服務器上,這樣即使有一臺服務器出現故障,其他服務器依然可以繼續提供服務,為此, redis提供了復制(replication)功能,可以實現當一臺數據庫中的數據更新后,自動將更新的數據同步到其他數據庫上。
- 在復制的概念中,數據庫分為兩類,一類是主數據庫(master) ,另一類是從數據(slave) 。主數據可以進行讀寫操作,當寫操作導致數據變化時會自動將數據同步給從數據庫,而從數據庫一般是只讀的,并接受主數據同步過來的數據。一個主數據庫可以擁有多個從數據庫,而一個從數據庫只能擁有一個主數據庫。
1、主從復制流程
-
【1】若啟動一個slave機器進程,則它會向master機器發送一個“sync command”命令,請求同步連接
-
【2】無論是第一次連接還是重新連接,master機器都會啟動一個后臺進程,將數據快照(RDB)保存到數據文件中(執行RDB操作),同時master還會記錄修改數據的所有命令,并緩存在數據文件中
-
【3】后臺進程完成緩存操作后,master機器就會向slave機器發送數據文件,slave端機器將數據文件保存在硬盤上,然后將其加載到內存中,接著master機器就會將修改數據的所有操作一并發送給slave端機器。若slave出現故障導致宕機,則恢復正常后會自動重新連接
-
【4】master機器收到slave端機器的連接后,將其完整的數據文件發送給slave端機器,如果master同時收到多個slave發來的同步請求,則master會在后臺啟動一個進程以保存數據文件,然后將其發送給所有的slave端機器,確保所有的slave端機器都正常工作
二、哨兵模式
1、哨兵模式集群架構
- 哨兵是Redis集群架構中非常重要的一個組件,哨兵的出現主要是解決了主從復制出現故障時需要認為干預的問題
2、哨兵模式主要功能
- 【1】集群監控:負責監控 Redis master 和 slave 進程是否正常工作
- 【2】消息通知:如果某個 Redis 實例出現故障,那么哨兵負責發送消息作為報警通知給管理員
- 【3】故障轉移:如果 master node 掛掉了,會自動轉移到 slave node 上
- 【4】配置中心:如果故障轉移發生了,通知 client 客戶端習新的 master 地址
3、哨兵監控整個系統節點的過程
- 【1】首先主節點的信息是配置在哨兵的配置文件中
- 【2】哨兵節點會和配置的主節點建立起兩條連接命令連接和訂閱連接
- 【3】哨兵會通過命令連接每10s發送一次INFO命令,通過INFO命令,主節點會返回自己的run_id 和自己的從節點信息
- 【4】哨兵會對這些從節點也建立兩條連接命令連接和訂閱連接
- 【5】哨兵通過命令連接向從節點發送INFO命令,獲取到他的一些信息:
- run_id(redis服務器id)
- role(職能)
- 從服務器的復制偏移量 offset
- 其他
- 【6】通過命令連接向服務器的 _sentinel:hello 頻道發送一條消息,包括自己的ip端口、run_id、配置(后續投票的時候會用到)等
- 【7】通過訂閱連接對服務器的 _sentinel:hello 頻道做監聽,所以所有的向該頻道發送的哨兵消息都能被接收到
- 【8】解析監聽到的消息,進行分析提取,就可以知道還有哪些別的哨兵服務節點也在監聽這些主從節點了,更新結構體將這些哨兵節點記錄下來
- 【9】向觀察到的其他的哨兵節點建立命令連接
4、主觀下線
- 哨兵節點會每秒一次的頻率向建立了命令節點的實例發送ping命令,如果在 down-after-milliseconds 毫秒內沒有做出有效響應包括(pong/loading/masterdown)以外的響應,哨兵就會將該實例在本結構體中的狀態標記為 sri_s_down 主觀下線
5、客觀下線
- 當一個哨兵節點發現主節點處于主觀下線狀態時,就會向其他的哨兵節點發出詢問,該節點是否已經主觀下線。如果超過配置參數 quorum 個節點認為是主觀下線時,該哨兵節點就會將自己維護的結構體中該主節點標記為 sri_o_down 客觀下線
6、master 選舉
- 在認為主節點客觀下線的情況下,哨兵節點間會發起一次選舉,命令為: SENTINEL is-master-down-by-addr,只是 run_id 這次會將自己的 run_id 帶進去,希望接受者將自己設置為主節點。如果超過半數以上的節點返回將該節點標記為 leader 的情況下,會有該 leader 對故障進行遷移
7、故障遷移
- 【1】在從節點中挑選出新的從節點
- 通訊正常
- 優先級排序
- 優先級相同時選擇offset最大的
- 【2】將該節點設置成新的主節點 slaveof no one ,并確保在后續的 INGO 命令時,該節點返回狀態為 master
- 【3】將其他的從節點設置成從新的主節點服務, slaveof 命令
- 【4】將舊的主節點變成新的主節點的從節點
8、優點與缺點
- 【優點】:高可用,哨兵模式是基于主從模式的,所有主從模式的優點,哨兵模式都有;主從可以自動切換,系統更健壯,可用性更高
- 【缺點】:redis 比較難支持在線擴容,在群集容量達到上限時在線擴容會變得很復雜
三、Cluster群集
- redis的哨兵模式基本已經可以實現高可用、讀寫分離,但是在這種模式,每臺redis服務器都存儲相同的數據,很浪費內存資源,所以加入了 Cluster 群集模式,實現了redis的分布式存儲,也就是說,每臺redis節點存儲著不同的內容
- 群集部署建議至少3臺以上的master節點,建議使用3主3從六個節點的模式
- Cluster 群集由多個redis服務器組成的分布式網絡服務群集,群集中有多個master主節點,每個主節點都可讀可寫,節點之間會互相通信,兩兩相連,redis群集無中心節點
【1】在 redis-Cluster 群集中,可以給每個主節點添加從節點,主節點和從節點直接遵循主從模型的特性,當用戶需要處理更多讀請求的時候,添加從節點可以擴展系統的讀性能
【2】redis-Cluster 的故障轉移:redis群集的主節點內置了類似 redis sentinel 的節點故障檢測和自動故障轉移功能,當群集中的某個主節點下線時,群集中的其他在線主節點會注意到這點,并且對已經下線的主節點進行故障轉移
【3】群集進行故障轉移的方法和 redis sentinel 進行故障轉移的方法基本一樣,不同的是,在集群里面,故障轉移是由集群中其他在線的主節點復制進行的,所以群集不必另外使用 redis sentinel
四、實驗一(主從復制)
| Master | 192.168.184.10 | redis-5.0.7.tar.gz |
| Slave1 | 192.168.184.30 | redis-5.0.7.tar.gz |
| Slave2 | 192.168.184.50 | redis-5.0.7.tar.gz |
五、實驗二(哨兵模式)
- 哨兵的核心功能:在主從復制的基礎上,哨兵引入了主節點的自動故障轉移
- 哨兵:是一個分布式系統,用于對主從結構中的每臺服務器進行監控,當出現故障時通過投票機制選擇新的 master 并將所有 slave 連接到新的 master 。所以整個運行哨兵的集群的數量不得少于3個節點。
六、實驗三(Cluster群集)
| Master1 | 192.168.184.10:7001 | redis-5.0.7.tar.gz |
| Slave1 | 192.168.184.60:7006 | redis-5.0.7.tar.gz |
| Master2 | 192.168.184.30:7003 | redis-5.0.7.tar.gz |
| Slave2 | 192.168.184.70:7007 | redis-5.0.7.tar.gz |
| Master3 | 192.168.184.50:7005 | redis-5.0.7.tar.gz |
| Slave3 | 192.168.184.80:7008 | redis-5.0.7.tar.gz |
總結
主從復制流程
- 【1】slave向master機器發送“sync command”命令,請求同步連接
- 【2】master通過fork啟動子進程,將數據快照及緩存命令保存到數據文件中
- 【3】master向slave發送數據文件,slave保存到硬盤后加載到內存,接著master會將修改數據的所有操作一并發送給slave。若slave出現故障導致宕機,則恢復正常后會自動重新連接
- 【4】master收到slave的連接后,將完整的數據文件發送給slave,如果有多個同步請求,則master啟動一個后臺進程保存數據文件,然后發送給所有的slave
哨兵主要功能
- 【1】集群監控:負責監控 Redis master 和 slave 進程是否正常工作
- 【2】消息通知:如果某個 Redis 實例出現故障,那么哨兵負責發送消息作為報警通知給管理員
- 【3】故障轉移:如果 master node 掛掉了,會自動轉移到 slave node 上
- 【4】配置中心:如果故障轉移發生了,通知 client 客戶端習新的 master 地址
Cluster群集的功能
- 【】數據分區:數據分區(或稱數據分片)是集群最核心的功能。
- 集群將數據分散到多個節點,一方面突破了Redis單機內存大小的限制,存儲容量大大增加;另一方面每個主節點都可以對外提供讀服務和寫服務,大大提高了集群的響應能力。
- Redis單機內存大小受限問題,在介紹持久化和主從復制時都有提及;例如,如果單機內存太大,bgsave和bgrewriteaof的fork操作可能導致主進程阻塞,主從環境下主機切換時可能導致從節點長時間無法提供服務,全量復制階段主節點的復制緩沖區可能溢出。
- 【】高可用:集群支持主從復制和主節點的自動故障轉移(與哨兵類似);當任一節點發生故障時,集群仍然可以對外提供服務。
總結
以上是生活随笔為你收集整理的Redis数据库(四)——Redis集群模式(主从复制、哨兵、Cluster)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存巨兽50GB来袭,电脑性能翻倍速
- 下一篇: rsync+inotify远程同步