基於Sentinel的Redis高可用方案

來源:互聯網
上載者:User

標籤:

一、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高可用方案

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.