基於Sentinel的Redis3.2高可用方案


默認情況下,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,啟用后台運行

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禁用)----是否開啟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

#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

 

啟動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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM