默認情況下,Redis node和sentinel的protected-mode都是yes,在搭建集群時,若想從遠程連接redis集群,需要將redis.conf和sentinel.conf的protected-mode修改為no,若只修改redis node,從遠程連接sentinel后,依然是無法正常使用的,且sentinel的配置文件中沒有protected-mode配置項,需要手工添加。
protected-mode在默認開啟的情況下要是配置里沒有指定bind和密碼。開啟該參數后,redis只會本地進行訪問,拒絕外部訪問
----------------------------------------------------------------------------
Sentinel(哨崗、哨兵)是Redis的高可用性解決方案:由一個或多個Sentinel實現組成的Sentinel系統可以監控任意多個主服務器,以及這些主服務器屬下的所有從服務器,並在被監視的主服務器進入下線狀態時,自動將下線主服務器屬下的某個從服務器升級為新的主服務器,然后由新的主服務器代替已下線的主服務器繼續處理命令請求。
redis.conf中從的轉為主的優先級,數字越小,級別越高。默認100
slave-priority 100
-----------------------------------------------------------------------------
一、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之間無法實現數據共享,不適合存在大量用戶數據關聯的應用使用。

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,啟用后台運行
# 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禁用)----是否開啟appendonlylog,開啟的話每次寫操作會記一條log,這會提高數據抗風險能力,但影響效率。當設為yes時將對redis所有的操作都保存到AOF文件中,因為dump.rdb是異步的,在下次快照到達之前,如果出現crash等問題,會造成數據丟失,而AOF文件時同步記錄的,所以會完整的恢復數據
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
#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
啟動sentinel服務
redis-sentinel sentinel-1M.conf
四、備份恢復
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
在master上 redis-cli -p 26379 shutdown ,手動把master sentinel停掉
----------------------------------------------------------------------------------------------------------------------------------
首先解釋2個名詞:SDOWN和ODOWN.
- SDOWN:subjectivelydown,直接翻譯的為"主觀"失效,即當前sentinel實例認為某個redis服務為"不可用"狀態.
- ODOWN:objectivelydown,直接翻譯為"客觀"失效,即多個sentinel實例都認為master處於"SDOWN"狀態,那么此時master將處於ODOWN,ODOWN可以簡單理解為master已經被集群確定為"不可用",將會開啟failover.
SDOWN適合於master和slave,但是ODOWN只會使用於master;當slave失效超過"down-after-milliseconds"后,那么所有sentinel實例都會將其標記為"SDOWN".
+sdown 主觀下線 -sdown 主觀上線
+odown 客觀下線 -odown 客觀下線
Sentinel作用:
1):Master狀態檢測
2):如果Master異常,則會進行Master-Slave切換,將其中一個Slave作為Master,將之前的Master作為Slave
3):Master-Slave切換后,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換
redis3.0版本的sentinel啟動方式:主從兩端都要啟動
redis-sentinel /opt/redis/sentinel.conf 或 redis-server /opt/redis/sentinel.conf --sentinel 兩種命令的效果完全相同
cat sentinel.conf monitor處填主redis實例的IP地址 (注意配置文件中紅色加粗部分,缺少的話故障轉移時會出現 failover-abort-not-elected報錯)
port 26379 protected-mode yes bind 0.0.0.0 daemonize yes dir "/usr/local/etc" logfile "/usr/local/etc/sentinel.log" sentinel monitor mymaster 10.0.30.177 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 15000 sentinel parallel-syncs mymaster 1
#第4行:指定Sentinel去監視一個名為mymaster的Master,不同環境的redis集群此處的名稱應該不同,否則啟動后自動學習容易發生混淆。Master的IP地址為10.1.1.28,端口號為6379,最后的2表示當有2個Sentinel檢測到Master異常時才會判定其失效,即只有當2個Sentinel都判定Master失效了 即O_DWON("客觀"失效)才會自動遷移,如果Sentinel的數量不達標,則不會執行自動故障遷移。
#第5行:指定Sentinel判定Master斷線的時間。(單位為毫秒,判定為主觀下線SDOWN)
#第6行:在執行故障轉移時, 最多可以有多少個從服務器同時對新的主服務器進行同步, 這個數字越小, 完成故障轉移所需的時間就越長。這個數字設置為1,雖然完成故障轉移所需的時間會變長,但是可以保證每次只有1個Slave處於不能處理命令請求的狀態
#第7行:若sentinel在該配置值內未能完成failover操作(即故障時master/slave自動切換),則認為本次failover失敗
另:一個sentinal可同時監控多個master,只要把4-8行重復多段,加以修改即可。
cat redis.conf
daemonize yes pidfile "/var/run/redis.pid" port 6379 tcp-backlog 511 protected-mode yes bind 0.0.0.0 timeout 0 tcp-keepalive 0 loglevel notice logfile "/usr/local/etc/redis.log" databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename "dump.rdb" dir "/usr/local/etc" slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
注意點:
1):首次啟動時,先啟動master端的sentinel,再啟動slave端的sentinel
2):Sentinel 只在 server 端做主從切換,app端要自己開發(例如Jedis庫的SentinelJedis,能夠監控Sentinel的狀態)
3):若Master已經被判定為下線,Sentinel已經選擇了新的Master,也已經將old Master改成Slave,但是還沒有將其改成new Master。若此時重啟old Master,則Redis集群將處於無Master狀態,此時只能手動修改配置文件,然后重新啟動集群.
4):當發生故障轉移時,sentinel.conf和redis.conf配置文件都會被CONFIG命令變更,
redis.conf: slaveof 新master IP
sentinel.conf: sentinel monitor mymaster 新master IP 6379 2
所以切記在使用sentinel進行監控和故障轉移時切勿在redis.conf配置文件中配置rename-command CONFIG "" ,該項表示禁用CONFIG命令
參考資料:http://www.redis.cn/topics/sentinel.html
https://redis.io/topics/config
http://download.redis.io/redis-stable/redis.conf
http://www.cnblogs.com/zhoujinyi/p/5570024.html
