文章目錄
- Redis叢集
-
- 主從複制
-
- 概述
- 複制原理
- 作用
- 注意問題
- 配置
- 哨兵模式(sentinel)
-
- 概述
- 基本原理
- 工作機制
- 配置啟動
- 複制延時
- 故障恢複
- 注意問題
- Cluster模式
-
- 使用
- 節點原理
- 故障恢複
- `cluster`叢集特點:
Redis叢集
主從複制
概述
是指将一台
Redis
伺服器的資料,複制到其他的
Redis
伺服器。前者稱為主節點(
master
),後者稱為從節點(
slave
),資料的複制是單向的,隻能由主節點到從節點。
預設情況下,每台
Redis
伺服器都是主節點;且一個主節點可以有多個從節點(或沒有從節點),但一個從節點隻能有一個主節點。
複制原理
slave
啟動成功連接配接到
master
後會發送一個
sync
指令,
Master
接到指令啟動背景的存盤程序,同時收集所有接收到的用于修改資料集指令,在背景程序執行完畢之後,
master
将傳送整個資料檔案到
slave
,以完成一次完全同步。
全量複制:
slave
服務在接收到資料庫檔案資料後,将其存盤并加載到記憶體中。
增量複制:
Master
繼續将新的所有收集到的修改指令依次傳給
slave
,完成同步。但是隻要是重新連接配接
master
,一次完全(全量複制)将被自動執行
作用
- 資料備援:主從複制實作了資料的熱備份,是持久化之外的一種資料備援方式。
- 故障恢複:當主節點出現問題時,可以由從節點提供服務,實作快速的故障恢複;實際上是一種服務的備援。
- 負載均衡:在主從複制的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫
資料時應用連接配接主節點,讀Redis
資料時應用連接配接從節點),分擔伺服器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis
伺服器的并發量。Redis
- 讀寫分離:可以用于實作讀寫分離,主庫寫、從庫讀,讀寫分離不僅可以提高伺服器的負載能力,同時可根據需求的變化,改變從庫的數量;
- 高可用基石:除了上述作用以外,主從複制還是哨兵和叢集能夠實施的基礎,是以說主從複制是
高可用的基礎Redis
注意問題
- 叢機隻有第一次連接配接會全量複制,連接配接之後會使用增量複制
- 主機當機之後重新連接配接,情況會照舊
- 主機當機後,從機會原地待命,不會變成主機
- 從機當機後,重新開機情況會照舊
配置
- 複制三個配置檔案:
Redis-主從、哨兵、叢集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.aof save 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.aof save 900 1 dbfilename dump-6380.rdb slaveof 127.0.0.1 6379
- 分别啟動并檢視叢集情況
redis-server redis-6379.conf
Redis-主從、哨兵、叢集Redis叢集
哨兵模式(sentinel)
概述
主從模式的弊端就是不具備高可用性,當
master
挂掉以後,
Redis
将不能再對外提供寫入操作,是以sentinel應運而生。
sentinel
模式是建立在主從模式的基礎上,如果隻有一個
Redis
節點,
sentinel
就沒有任何意義
基本原理
- 當
挂了以後,master
會在sentinel
中選擇一個做為slave
,并修改它們的配置檔案,其他master
的配置檔案也會被修改,比如slave
屬性會指向新的slaveof
master
- 當
重新啟動後,它将不再是master
而是做為master
接收新的slave
的同步資料master
-
因為也是一個程序有挂掉的可能,是以sentinel
也會啟動多個形成一個sentinel
叢集sentinel
- 多
配置的時候,sentinel
之間也會自動監控sentinel
- 當主從模式配置密碼時,
也會同步将配置資訊修改到配置檔案中,不需要擔心sentinel
- 一個
或sentinel
叢集可以管理多個主從sentinel
,多個Redis
也可以監控同一個sentinel
redis
-
最好不要和sentinel
部署在同一台機器,不然Redis
的伺服器挂了以後,Redis
也挂了sentinel
工作機制
- 每個
以每秒鐘一次的頻率向它所知的sentinel
,master
以及其他slave
執行個體發送一個sentinel
指令PING
- 如果一個執行個體距離最後一次有效回複
指令的時間超過PING
選項所指定的值, 則這個執行個體會被down-after-milliseconds
标記為主觀下線。sentinel
- 如果一個
被标記為主觀下線,則正在監視這個master
的所有master
要以每秒一次的頻率确認sentinel
的确進入了主觀下線狀态master
- 當有足夠數量的
(大于等于配置檔案指定的值)在指定的時間範圍内确認sentinel
的确進入了主觀下線狀态, 則master
會被标記為客觀下線master
- 在一般情況下, 每個
會以每sentinel
秒一次的頻率向它已知的所有10
,master
發送slave
指令INFO
- 當
被master
标記為客觀下線時,sentinel
向下線的sentinel
的所有master
發送slave
指令的頻率會從INFO
秒一次改為10
秒一次1
- 若沒有足夠數量的
同意sentinel
已經下線,master
master
的客觀下線狀态就會被移除;
若
重新向master
的sentinel
指令傳回有效回複,PING
的主觀下線狀态就會被移除master
配置啟動
- 配置檔案
Redis-主從、哨兵、叢集Redis叢集 - 配置資訊
daemonize no logfile "./sentinel.log" dir "/Users/xiao7/devTool/redis/redis-sentinel" #判斷master失效至少需要2個sentinel同意,建議設定為n/2+1,n為sentinel個數 # 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機器有一定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,Slave機器數量的增加也會使這個問題更加嚴重。
故障恢複
主機挑選
- 選擇優先級最小機器,優先級在
中預設redis.conf
,值越小優先級越高slave-priority 100
- 選擇偏移量最大的,偏移量是指獲得主機資料最多的機器
- 選擇
最小的機器,uuid
是uuid
啟動自動生成的redis
uuid
注意問題
- 主機當機後選舉完後重新連接配接,那麼它就會成為從機
Cluster模式
sentinel
模式基本可以滿足一般生産的需求,具備高可用性。但是當資料量過大到一台伺服器存放不下的情況時,主從模式或
sentinel
模式就不能滿足需求了,這個時候需要對存儲的資料進行分片,将資料存儲到多個
Redis
執行個體中。
cluster
模式的出現就是為了解決單機
Redis
容量有限的問題,将
Redis
的資料根據一定的規則配置設定到多台機器。
cluster
可以說是
sentinel
和主從模式的結合體,通過
cluster
可以實作主從和
master
重選功能,是以如果配置兩個副本三個分片的話,就需要六個
Redis
執行個體。因為
Redis
的資料是根據一定規則配置設定到
cluster
的不同機器的,當資料量過大時,可以新增機器進行擴容。
使用
- 執行個體開啟叢集
cluster-enabled yes 打開叢集模式
cluster-config-file nodes-6379.conf 設定節點配置檔案名
cluster-node-timeout 15000 設定節點失聯時間,超過該時間(毫秒),叢集自動進行主從切換
- 建立叢集
redis-cli --cluster create --cluster-replicas 1 192.168.11.101:6379 192.168.11.101:6380 192.168.11.101:6381 192.168.11.101:6389 192.168.11.101:6390 192.168.11.101:6391
redis-cli -c -p 6379 # 叢集連接配接叢集
使用叢集不需要配置主從複制資訊,需要配置主從密碼,隻需要将
redis
配置檔案中的
cluster-enable
配置打開即可。每個叢集中至少需要三個主資料庫才能正常運作,新增節點非常友善。
節點原理
-
配置設定
一個叢集至少要有三個主節點。選項
表示我們希望為叢集中的每個主節點建立一個從節點。配置設定原則盡量保證每個主資料庫運作在不同的--cluster-replicas 1
位址,每個從庫和主庫不在一個IP
位址上。IP
-
solt
插槽
一個
叢集包含Redis
個插槽(16384
), 資料庫中的每個鍵都屬于這hash slot
個插槽的其中一個, 叢集使用公式16384
來計算鍵CRC16(key) % 16384
屬于哪個槽, 其中key
語句用于計算鍵CRC16(key)
的key
校驗和 。叢集中的每個節點負責處理一部分插槽。CRC16
不在一個slot下的鍵值,是不能使用mget,mset等多鍵操作
故障恢複
- 主節點當機恢複後變成從機
- 如果某一段插槽的主從都挂掉,而
,那麼 ,整個叢集都挂掉,如果cluster-require-full-coverage yes
,那麼,該插槽資料全都不能使用,也無法存儲。cluster-require-full-coverage no
cluster
叢集特點:
cluster
- 多個
節點網絡互聯,資料共享redis
- 所有的節點都是一主一從(也可以是一主多從),其中從不提供服務,僅作為備用
- 不支援同時處理多個
(如key
),因為MSET/MGET
需要把redis
key
均勻分布在各個節點上,
并發量很高的情況下同時建立
會降低性能并導緻不可預測的行為key-value
- 支援線上增加、删除節點
- 用戶端可以連接配接任何一個主節點進行讀寫