標籤:
一、Redis Sentinel是redis內建的叢集管理工具,主要功能有
· 監控(Monitoring): Redis Sentinel即時監控主伺服器和從伺服器運行狀態。
· 提醒(Notification):當被監控的某個 Redis 伺服器出現問題時, Redis Sentinel 可以向系統管理員發送通知, 也可以通過 API 向其他程式發送通知。
· 自動容錯移轉(Automatic failover): 當一個主伺服器不能正常工作時,Redis Sentinel 可以將一個從伺服器升級為主伺服器, 並對其他從伺服器進行配置,讓它們使用新的主伺服器。當應用程式串連到Redis 伺服器時, Redis Sentinel會告之新的主伺服器地址和連接埠。
Redis Sentinel 是一個分布式系統, 你可以在架構中運行多個 Sentinel 進程,這些進程通過相互連訊來判斷一個主伺服器是否斷線,以及是否應該執行容錯移轉。
在配置Redis Sentinel時,至少需要有1個Master和1個Slave。當Master失效後,Redis Sentinel會報出失效警告,並通過自動容錯移轉將Slave提升為Master,並提供讀寫服務;當失效的Master恢複後,Redis Sentinel會自動識別,將Master自動轉換為Slave並完成資料同步。
通過Redis Sentinel可以實現Redis零手工幹預並且短時間內進行M-S切換,減少業務影響時間。
二、拓撲結構
在兩個伺服器中分別都部署Redis和Redis Sentinel。當Master中的Redis出現故障時(Redis進程終止、伺服器僵死、伺服器斷電等),由Redis Sentinel將Master許可權切換至Slave Redis中,並將唯讀模式更改為可讀可寫入模式。應用程式通過Redis Sentinal確定當前Master Redis位置,進行重新串連。
根據業務模式,可以制定兩種拓撲結構:單M-S結構和雙M-S結構。如果有足夠多的伺服器,可以配置多M-S結構。
1、單M-S結構
單M-S結構特點是在Master伺服器中配置Master Redis(Redis-1M)和Master Sentinel(Sentinel-1M)。Slave伺服器中配置Slave Redis(Redis-1S)和Slave Sentinel(Sentinel-1S)。其中 Master Redis可以提供讀寫服務,但是Slave Redis只能提供唯讀服務。因此,在業務壓力比較大的情況下,可以選擇將唯讀業務放在Slave Redis中進行。
2、雙M-S結構
雙M-S結構的特點是在每台伺服器上配置一個Master Redis,同時部署一個Slave Redis。由兩個Redis Sentinel同時對4個Redis進行監控。兩個Master Redis可以同時對應用程式提供讀寫服務,即便其中一個伺服器出現故障,另一個伺服器也可以同時運行兩個Master Redis提供讀寫服務。缺點是兩個Master redis之間無法實現資料共用,不適合存在大量使用者資料相關 App使用。
3、優劣對比
兩個結構各有優缺點,分別適用於不同的應用情境:
單M-S結構適用於不同使用者資料存在關聯,但應用可以實現讀寫分離的業務模式。Master主要提供寫操作,Slave主要提供讀操作,充分利用硬體資源。
雙(多)M-S結構適用於使用者間不存在或者存在較少的資料關聯的業務模式,讀寫效率是單M-S的兩(多)倍,但要求故障時單台伺服器能夠承擔兩個Mater Redis的資源需求。
三、配置部署
單M-S結構和雙M-S結構配置相差無幾,下面以雙M-S結構配置為例。
1、Redis配置
1)Master Redis配置
在Server-1M上配置Redis-1M
# vi redis-1M.conf
## master redis-1M
## daemonize預設為no,修改為yes,啟用後台運行
daemonize yes
# Redis 預設pid 檔案位置redis.pid
#當運行多個 redis 服務時,需要指定不同的 pid 檔案和連接埠
pidfile redis-1M.pid
##連接埠號碼
port 6379
##驗證口令
requirepass *************
masterauth *************
#綁定可串連Redis的IP地址,不設定將處理所有請求
# bind 127.0.0.1
#用戶端串連的逾時時間,單位為秒,逾時後會關閉串連(0為不設定)
timeout 0
#日誌記錄等級
loglevel notice
#設定資料庫的個數
databases 16
#日誌重新整理策略(Master禁用)
#save 900 1
#save 300 10
#save 60 10000
#是否使用壓縮鏡像備份
rdbcompression yes
#鏡像備份檔案的檔案名稱
dbfilename redis-1M_dump.rdb
#鏡像備份路徑,預設值為 ./
dir /redis/backup
#設定該資料庫為其他資料庫的從資料庫,主庫無需設定
#slaveof
# slaveof
#指定與主要資料庫串連時需要的密碼驗證,主庫無需設定
#masterauth
#masterauth
#如果 slave-serve-stale-data 設定成 ‘no‘,slave會返回"SYNC with master in #progress"錯誤資訊,但 INFO和SLAVEOF命令除外。
slave-serve-stale-data yes
#用戶端串連訪問口令
# requirepass foobared
#限制同時串連的客戶數量,防止過多的client導致記憶體耗盡。如果有足夠記憶體可以不進行#設定
#maxclients 10000
#設定redis能夠使用的最大記憶體。
# maxmemory
##啟用增量(Master禁用)
appendonly no
#增量記錄檔名,預設值為appendonly.aof
appendfilename appendonly.aof
#設定對 appendonly.aof 檔案進行同步的頻率
#always 表示每次有寫操作都進行同步,everysec 表示對寫操作進行累積,每秒同步一次。
#no表示等作業系統進行資料緩衝同步到磁碟,都進行同步,everysec 表示對寫操作進行累#積,每秒同步一次
appendfsync everysec
#是否重設Hash表
#設定成yes後redis將每100毫秒使用1毫秒CPU時間來對redis的hash表重新hash,##可降低記憶體的使用。當使用情境有較為嚴格的即時性需求,不能接受Redis時不時的對請##求有2毫秒的延遲的話,把這項配置為no。如果沒有這麼嚴格的即時性要求,可以設定為 #yes,能夠儘可能快的釋放記憶體。
activerehashing yes
##Slave開啟唯讀模式
slave-read-only yes
在Server-1S上配置Redis-2M
# vi redis-2M.conf
## master redis-2M
# Redis 預設pid 檔案位置redis.pid
#當運行多個 redis 服務時,需要指定不同的 pid 檔案和連接埠
pidfile redis-2M.pid
#鏡像備份檔案的檔案名稱
dbfilename redis-1M_dump.rdb
#日誌重新整理策略(Slave啟用)
save 900 1
save 300 10
save 60 10000
#-----------------其他參數與redis-1M保持一致-----------------
daemonize yes
#……
2)Slave Redis配置
在Server-1S上配置Redis-1S
# Redis 預設pid 檔案位置redis.pid
#當運行多個 redis 服務時,需要指定不同的 pid 檔案和連接埠
pidfile redis-1S.pid
##連接埠號碼
port 7379
#鏡像備份檔案的檔案名稱
dbfilename redis-1S_dump.rdb
#設定該資料庫為其他資料庫的從資料庫,主庫無需設定
Slaveof server-1M 6379
##啟用增量(Master禁用)
appendonly yes
#-----------------其他參數與redis-1M保持一致-----------------
daemonize yes
#……
在Server-1M上配置Redis-2S
# Redis 預設pid 檔案位置redis.pid
#當運行多個 redis 服務時,需要指定不同的 pid 檔案和連接埠
pidfile redis-2S.pid
##連接埠號碼
port 7379
#鏡像備份檔案的檔案名稱
dbfilename redis-2S_dump.rdb
#設定該資料庫為其他資料庫的從資料庫,主庫無需設定
Slaveof server-1S 6379
#-----------------其他參數與redis-2M保持一致-----------------
daemonize yes
#……
2、Redis Sentinel配置
在Server-1M上配置Sentinel-1M
vi sentinel-1M.conf
#Master redis-1M
#hostname server-1M
#ip 192.168.84.129
#連接埠號碼
port 26379
sentinel monitor server-1M 192.168.84.129 6379 1
sentinel down-after-milliseconds server-1M 5000
sentinel failover-timeout server-1M 900000
sentinel can-failover server-1M yes
sentinel parallel-syncs server-1M 1
#Master redis-1S
#hostname server-1S
#ip 192.168.84.128
sentinel monitor server-1S 192.168.84.128 6379 1
sentinel down-after-milliseconds server-1S 5000
sentinel failover-timeout server-1S 900000
sentinel can-failover server-1S yes
sentinel parallel-syncs server-1S 1
在Server-1S上配置Sentinel-1S
#Master redis-1M
#hostname server-1M
#ip 192.168.84.128
#連接埠號碼
port 27379
sentinel monitor server-1M 192.168.84.129 6379 1
sentinel down-after-milliseconds server-1M 5000
sentinel failover-timeout server-1M 900000
sentinel can-failover server-1M yes
sentinel parallel-syncs server-1M 1
#Master redis-1S
#hostname server-1S
#ip 192.168.84.128
sentinel monitor server-1S 192.168.84.128 6379 1
sentinel down-after-milliseconds server-1S 5000
sentinel failover-timeout server-1S 900000
sentinel can-failover server-1S yes
sentinel parallel-syncs server-1S 1
3、啟動服務
Server-1M啟動redis
redis-server redis-1M.conf
redis-server redis-2S.conf
Server-1S啟動redis
redis-server redis-1S.conf
redis-server redis-2M.conf
檢測同步
Master日誌檢查:
[28162] 10 Nov 23:32:11.810 * DB loaded from append only file: 0.000 seconds
[28162] 10 Nov 23:32:11.810 * The server is now ready to accept connections on port 6379
[28162] 10 Nov 23:32:35.360 * Slave ask for synchronization
[28162] 10 Nov 23:32:35.360 * Starting BGSAVE for SYNC
[28162] 10 Nov 23:32:35.361 * Background saving started by pid 28170
[28170] 10 Nov 23:32:35.373 * DB saved on disk
[28170] 10 Nov 23:32:35.375 * RDB: 0 MB of memory used by copy-on-write
[28162] 10 Nov 23:32:35.437 * Background saving terminated with success
[28162] 10 Nov 23:32:35.438 * Synchronization with slave succeeded
Slave日誌檢查:
[28091] 10 Nov 23:27:15.908 * DB loaded from append only file: 0.001 seconds
[28091] 10 Nov 23:27:15.908 * The server is now ready to accept connections on port 6389
[28091] 10 Nov 23:27:15.944 * Connecting to MASTER...
[28091] 10 Nov 23:27:15.947 * MASTER <-> SLAVE sync started
[28091] 10 Nov 23:27:15.951 * Non blocking connect for SYNC fired the event.
[28091] 10 Nov 23:27:15.952 * Master replied to PING, replication can continue...
[28091] 10 Nov 23:27:15.990 * MASTER <-> SLAVE sync: receiving 50 bytes from master
[28091] 10 Nov 23:27:15.990 * MASTER <-> SLAVE sync: Loading DB in memory
[28091] 10 Nov 23:27:15.991 * MASTER <-> SLAVE sync: Finished with success
[28091] 10 Nov 23:27:15.993 * Background append only file rewriting started by pid 28094
[28094] 10 Nov 23:27:15.998 * SYNC append only file rewrite performed
[28094] 10 Nov 23:27:15.998 * AOF rewrite: 0 MB of memory used by copy-on-write
[28091] 10 Nov 23:27:16.047 * Background AOF rewrite terminated with success
[28091] 10 Nov 23:27:16.047 * Parent diff successfully flushed to the rewritten AOF (0 bytes)
[28091] 10 Nov 23:27:16.048 * Background AOF rewrite finished successfully
啟動sentinel服務
redis-server sentinel-1M.conf --sentinel
[28156] 10 Nov 23:33:22.337 * +slave slave 192.168.84.129:6389 192.168.84.129 6389 @server-1S 192.168.84.128 6379
[28156] 10 Nov 23:39:37.071 # +sdown sentinel 192.168.84.128:26389 192.168.84.128 26389 @server-1S 192.168.84.128 6379
[28156] 10 Nov 23:39:37.072 # +sdown sentinel 192.168.84.128:26389 192.168.84.128 26389 @server-1M 192.168.84.129 6379
[28156] 10 Nov 23:40:05.438 # -sdown sentinel 192.168.84.128:26389 192.168.84.128 26389 @server-1S 192.168.84.128 6379
[28156] 10 Nov 23:40:05.438 # -sdown sentinel 192.168.84.128:26389 192.168.84.128 26389 @server-1M 192.168.84.129 6379
[28156] 10 Nov 23:40:10.262 * -dup-sentinel masterserver-1S 192.168.84.128 6379 #duplicate of 192.168.84.128:26389 or e453a45a5e1421519dcbe00a199f203579b27b0f
[28156] 10 Nov 23:40:10.263 * +sentinel sentinel 192.168.84.128:26389 192.168.84.128 26389 @server-1S 192.168.84.128 6379
[28156] 10 Nov 23:40:10.263 * -dup-sentinel masterserver-1M 192.168.84.129 6379 #duplicate of 192.168.84.128:26389 or e453a45a5e1421519dcbe00a199f203579b27b0f
[28156] 10 Nov 23:40:10.263 * +sentinel sentinel 192.168.84.128:26389 192.168.84.128 26389 @server-1M 192.168.84.129 6379
redis-server sentinel-1S.conf --sentinel
[16383] 10 Nov 23:40:05.499 * +slave slave 192.168.84.129:6389 192.168.84.129 6389 @server-1S 192.168.84.128 6379
[16383] 10 Nov 23:40:05.500 * +slave slave 192.168.84.128:6389 192.168.84.128 6389 @server-1M 192.168.84.129 6379
[16383] 10 Nov 23:40:06.098 * +sentinel sentinel 192.168.84.129:26379 192.168.84.129 26379 @server-1S 192.168.84.128 6379
[16383] 10 Nov 23:40:08.404 * +sentinel sentinel 192.168.84.129:26379 192.168.84.129 26379 @server-1M 192.168.84.129 6379
4、故障類比檢測
類比redis-1M(Master 192.168.84.129 6379)故障,sentinel自動檢測狀態,然後切換至redis-1S(Slave 192.168.84.128 6389),並將redis-1M轉移為redis-1S的slave,狀態為+sdown。
[28156] 11 Nov 00:42:48.431 # +sdown masterserver-1M 192.168.84.129 6379
[28156] 11 Nov 00:42:48.431 # +odown masterserver-1M 192.168.84.129 6379 #quorum 1/1
[28156] 11 Nov 00:42:56.570 # +failover-detected masterserver-1M 192.168.84.129 6379
[28156] 11 Nov 00:42:56.670 # +failover-end masterserver-1M 192.168.84.129 6379
[28156] 11 Nov 00:42:56.670 # +switch-masterserver-1M 192.168.84.129 6379 192.168.84.128 6389
[28156] 11 Nov 00:42:57.055 * +sentinel sentinel 192.168.84.128:26389 192.168.84.128 26389 @server-1M 192.168.84.128 6389
[28156] 11 Nov 00:43:01.688 # +sdown slave 192.168.84.129:6379 192.168.84.129 6379 @server-1M 192.168.84.128 6389
四、備份恢複
1、備份策略
Redis提供兩種相對有效備份方法:RDB和AOF。
RDB是在某個時間點將記憶體中的所有資料的快照儲存到磁碟上,在資料恢複時,可以恢複備份時間以前的所有資料,但無法恢複備份時間點後面的資料。
AOF是以協議文本的方式,將所有對資料庫進行過寫入的命令(及其參數)記錄到 AOF 檔案,以此達到記錄資料庫狀態的目的。優點是基本可以實現資料無丟失(緩衝的資料有可能丟失),缺點是隨著資料量的持續增加,AOF檔案也會越來越大。
在保證資料安全的情況下,盡量避免因備份資料消耗過多的Redis資源,採用如下備份策略:
Master端:不採用任何備份機制
Slave端:採用AOF(嚴格資料要求時可同時開啟RDB),每天將AOF檔案備份至備份伺服器。
為了最大限度減少Master端的資源幹擾,將備份相關全部遷移至Slave端完成。同時這樣也有缺點,當Master掛掉後,應用服務切換至Slave端,此時的Slave端的負載將會很大。目前Redis不支援RDB和AOF參數動態修改,需要重啟Redis生效,希望能在新的版本中實現更高效的修改方式。
2、災難恢複
· 當Master端Redis服務崩潰(包含主機斷電、進程消失等),Redis sentinel將Slave切換為讀寫狀態,提供生產服務。通過故障診斷修複Master,啟動後會自動加入Sentinel並從Slave端完成資料同步,但不會切換。
· 當Master和Slave同時崩潰(如機房斷電),啟動伺服器後,將備份伺服器最新的AOF備份拷貝至Master端,啟動Master。一切完成後再啟動Slave。
------------------------------------------------------------------
查看redis資訊:
redis-cli -h 127.0.0.1 -p 6379 info Replication
# Replication
role:master
connected_slaves:1
slave0:10.0.2.212,7379,online
查看sentinel資訊 :
redis-cli -h 172.18.18.207 -p 26379 info (後面加# 位元組,只顯示指定部分的內容)
INFO"指令將會列印完整的服務資訊,包括叢集,我們只需要關注"replication"部分,這部分資訊將會告訴我們"當前server的角色"以及指向它的所有的slave資訊.可以通過在任何一個slave上,使用"INFO"指令獲得當前slave所指向的master資訊
可以使用redis-cli查看sentinel管理的redis群集:
redis-cli -h 172.18.18.207 -p 26379 sentinel masters
1) "name"
2) "mymaster"
3) "ip"
4) "172.18.18.207"
5) "port"
6) "6500"
...
查看一個指定的master有那些slaves:
172.18.18.207:26379> sentinel slaves mymaster
1) "name"
2) "172.18.18.207:6501"
3) "ip"
4) "172.18.18.207"
5) "port"
6) "6501"
...
還可以強制一個redis群集做failover:
172.18.18.207:26379> sentinel failover mymaster
OK
基於Sentinel的Redis高可用方案