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