Redis-主从、哨兵、集群
文章目錄
- Redis集群
- 主從復制
- 概述
- 復制原理
- 作用
- 注意問題
- 配置
- 哨兵模式(sentinel)
- 概述
- 基本原理
- 工作機制
- 配置啟動
- 復制延時
- 故障恢復
- 注意問題
- Cluster模式
- 使用
- 節(jié)點原理
- 故障恢復
- `cluster`集群特點:
Redis集群
主從復制
概述
? 是指將一臺Redis服務器的數(shù)據(jù),復制到其他的Redis服務器。前者稱為主節(jié)點(master),后者稱為從節(jié)點(slave),數(shù)據(jù)的復制是單向的,只能由主節(jié)點到從節(jié)點。
默認情況下,每臺Redis服務器都是主節(jié)點;且一個主節(jié)點可以有多個從節(jié)點(或沒有從節(jié)點),但一個從節(jié)點只能有一個主節(jié)點。
復制原理
? slave啟動成功連接到master后會發(fā)送一個sync命令,Master接到命令啟動后臺的存盤進程,同時收集所有接收到的用于修改數(shù)據(jù)集命令,在后臺進程執(zhí)行完畢之后,master將傳送整個數(shù)據(jù)文件到slave,以完成一次完全同步。
全量復制:
? slave服務在接收到數(shù)據(jù)庫文件數(shù)據(jù)后,將其存盤并加載到內(nèi)存中。
增量復制:
? Master繼續(xù)將新的所有收集到的修改命令依次傳給slave,完成同步。但是只要是重新連接master,一次完全(全量復制)將被自動執(zhí)行
作用
- 數(shù)據(jù)冗余:主從復制實現(xiàn)了數(shù)據(jù)的熱備份,是持久化之外的一種數(shù)據(jù)冗余方式。
- 故障恢復:當主節(jié)點出現(xiàn)問題時,可以由從節(jié)點提供服務,實現(xiàn)快速的故障恢復;實際上是一種服務的冗余。
- 負載均衡:在主從復制的基礎上,配合讀寫分離,可以由主節(jié)點提供寫服務,由從節(jié)點提供讀服務(即寫Redis數(shù)據(jù)時應用連接主節(jié)點,讀Redis數(shù)據(jù)時應用連接從節(jié)點),分擔服務器負載;尤其是在寫少讀多的場景下,通過多個從節(jié)點分擔讀負載,可以大大提高Redis服務器的并發(fā)量。
- 讀寫分離:可以用于實現(xiàn)讀寫分離,主庫寫、從庫讀,讀寫分離不僅可以提高服務器的負載能力,同時可根據(jù)需求的變化,改變從庫的數(shù)量;
- 高可用基石:除了上述作用以外,主從復制還是哨兵和集群能夠實施的基礎,因此說主從復制是Redis高可用的基礎
注意問題
配置
-
復制三個配置文件:
-
主機文件配置
port 6379 bind 127.0.0.1 daemonize yes logfile "/Users/xiao7/devTool/redis/redis-cluster/redis-6379.log" dir ./ masterauth 123456 requirepass 123456 appendonly yes appendfilename appendonly-6379.aofsave 900 1 dbfilename dump-6379.rdb -
從機配置
port 6380 bind 127.0.0.1 daemonize yes logfile "/Users/xiao7/devTool/redis/redis-cluster/redis-6380.log" dir ./ masterauth 123456 requirepass 123456 appendonly yes appendfilename appendonly-6380.aofsave 900 1 dbfilename dump-6380.rdbslaveof 127.0.0.1 6379 -
分別啟動并查看集群情況
redis-server redis-6379.conf
哨兵模式(sentinel)
概述
主從模式的弊端就是不具備高可用性,當master掛掉以后,Redis將不能再對外提供寫入操作,因此sentinel應運而生。
sentinel模式是建立在主從模式的基礎上,如果只有一個Redis節(jié)點,sentinel就沒有任何意義
基本原理
- 當master掛了以后,sentinel會在slave中選擇一個做為master,并修改它們的配置文件,其他slave的配置文件也會被修改,比如slaveof屬性會指向新的master
- 當master重新啟動后,它將不再是master而是做為slave接收新的master的同步數(shù)據(jù)
- sentinel因為也是一個進程有掛掉的可能,所以sentinel也會啟動多個形成一個sentinel集群
- 多sentinel配置的時候,sentinel之間也會自動監(jiān)控
- 當主從模式配置密碼時,sentinel也會同步將配置信息修改到配置文件中,不需要擔心
- 一個sentinel或sentinel集群可以管理多個主從Redis,多個sentinel也可以監(jiān)控同一個redis
- sentinel最好不要和Redis部署在同一臺機器,不然Redis的服務器掛了以后,sentinel也掛了
工作機制
-
每個sentinel以每秒鐘一次的頻率向它所知的master,slave以及其他sentinel實例發(fā)送一個 PING 命令
-
如果一個實例距離最后一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被sentinel標記為主觀下線。
-
如果一個master被標記為主觀下線,則正在監(jiān)視這個master的所有sentinel要以每秒一次的頻率確認master的確進入了主觀下線狀態(tài)
-
當有足夠數(shù)量的sentinel(大于等于配置文件指定的值)在指定的時間范圍內(nèi)確認master的確進入了主觀下線狀態(tài), 則master會被標記為客觀下線
-
在一般情況下, 每個sentinel會以每 10 秒一次的頻率向它已知的所有master,slave發(fā)送 INFO 命令
-
當master被sentinel標記為客觀下線時,sentinel向下線的master的所有slave發(fā)送 INFO 命令的頻率會從 10 秒一次改為 1 秒一次
-
若沒有足夠數(shù)量的sentinel同意master已經(jīng)下線,master的客觀下線狀態(tài)就會被移除;
若master重新向sentinel的 PING 命令返回有效回復,master的主觀下線狀態(tài)就會被移除
配置啟動
-
配置文件
-
配置信息
daemonize no logfile "./sentinel.log" dir "/Users/xiao7/devTool/redis/redis-sentinel"#判斷master失效至少需要2個sentinel同意,建議設置為n/2+1,n為sentinel個數(shù) # mymaster為哨兵的服務名稱 sentinel monitor mymaster 127.0.0.1 6380 1 sentinel auth-pass mymaster 123456 #判斷master主觀下線時間,默認30s -
啟動
redis-sentinel sentinel.conf
復制延時
由于所有的寫操作都是先在Master上操作,然后同步更新到Slave上,所以從Master同步到Slave機器有一定的延遲,當系統(tǒng)很繁忙的時候,延遲問題會更加嚴重,Slave機器數(shù)量的增加也會使這個問題更加嚴重。
故障恢復
主機挑選
注意問題
Cluster模式
? sentinel模式基本可以滿足一般生產(chǎn)的需求,具備高可用性。但是當數(shù)據(jù)量過大到一臺服務器存放不下的情況時,主從模式或sentinel模式就不能滿足需求了,這個時候需要對存儲的數(shù)據(jù)進行分片,將數(shù)據(jù)存儲到多個Redis實例中。cluster模式的出現(xiàn)就是為了解決單機Redis容量有限的問題,將Redis的數(shù)據(jù)根據(jù)一定的規(guī)則分配到多臺機器。
? cluster可以說是sentinel和主從模式的結合體,通過cluster可以實現(xiàn)主從和master重選功能,所以如果配置兩個副本三個分片的話,就需要六個Redis實例。因為Redis的數(shù)據(jù)是根據(jù)一定規(guī)則分配到cluster的不同機器的,當數(shù)據(jù)量過大時,可以新增機器進行擴容。
使用
- 實例開啟集群
- 創(chuàng)建集群
使用集群不需要配置主從復制信息,需要配置主從密碼,只需要將redis配置文件中的cluster-enable配置打開即可。每個集群中至少需要三個主數(shù)據(jù)庫才能正常運行,新增節(jié)點非常方便。
節(jié)點原理
-
分配
一個集群至少要有三個主節(jié)點。選項 --cluster-replicas 1 表示我們希望為集群中的每個主節(jié)點創(chuàng)建一個從節(jié)點。分配原則盡量保證每個主數(shù)據(jù)庫運行在不同的IP地址,每個從庫和主庫不在一個IP地址上。
-
solt插槽
一個 Redis 集群包含 16384 個插槽(hash slot), 數(shù)據(jù)庫中的每個鍵都屬于這 16384 個插槽的其中一個, 集群使用公式 CRC16(key) % 16384 來計算鍵 key 屬于哪個槽, 其中 CRC16(key) 語句用于計算鍵 key 的 CRC16 校驗和 。集群中的每個節(jié)點負責處理一部分插槽。 不在一個slot下的鍵值,是不能使用mget,mset等多鍵操作
故障恢復
- 主節(jié)點宕機恢復后變成從機
- 如果某一段插槽的主從都掛掉,而cluster-require-full-coverage yes ,那么 ,整個集群都掛掉,如果cluster-require-full-coverage no ,那么,該插槽數(shù)據(jù)全都不能使用,也無法存儲。
cluster集群特點:
- 多個redis節(jié)點網(wǎng)絡互聯(lián),數(shù)據(jù)共享
- 所有的節(jié)點都是一主一從(也可以是一主多從),其中從不提供服務,僅作為備用
- 不支持同時處理多個key(如MSET/MGET),因為redis需要把key均勻分布在各個節(jié)點上,
并發(fā)量很高的情況下同時創(chuàng)建key-value會降低性能并導致不可預測的行為 - 支持在線增加、刪除節(jié)點
- 客戶端可以連接任何一個主節(jié)點進行讀寫
總結
以上是生活随笔為你收集整理的Redis-主从、哨兵、集群的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: setlocale(LC_ALL,) 中
- 下一篇: Linux中DHCP原理与配置