喫透 Redis 系列:高可用的哨兵模式

**哨兵模式介紹
**

哨兵模式(Sentinel)是 Redis 提供的高可用解決方案,作爲一個分佈式系統,它包含了多個 Sentinel 節點和 Redis 節點,這些 Sentinel 節點會監控 Redis 節點的狀態(通常爲主從複製),如果發現 master 節點不可用時,會自動將其中一個 slave 節點提升爲 master 節點,從而實現了自動故障轉移。

總體來講,哨兵模式的主要功能有如下幾個方面:

監控:Sentinel 會不斷檢查 Redis 的主、從服務器是否正常工作;

通知:如果 Redis 實例有故障,會通知到系統管理員或者相關程序;

自動故障轉移:如果主節點不可用,自動把其中一個從節點提升爲主節點;

配置提供者:如果發生了故障轉換,把新的 master 地址通知到客戶端。

Redis 哨兵的架構圖如下:

環境搭建

接下來我們演示一下 Redis 哨兵模式的搭建,爲了簡化起見,哨兵只有一個實例,而 Redis 服務器有三個,分別爲一主兩從。同時,都在一臺服務器上搭建,如果在正式的生產環境,需要在不同的服務器上進行配置,這樣才能實現真正的高可用,不管是在一臺或者多臺服務器上搭建,操作步驟和配置項幾乎完全一樣。

一、搭建三個 Redis 服務

先搭建三個 Redis 服務,一主兩從,因爲是在一臺服務器上操作,通過端口來區分不同的服務,分別爲 6379、6380、6381,拷貝三份 Redis 配置文件,按照 redis_6379.conf 這樣的方式命名。修改的主要信息如下:

port 6379
pidfile /var/run/redis_6379.pid
logfile "6379.log"
dbfilename "dump6379.rdb"

分別啓動三個服務和客戶端:

./redis-server redis_6379.conf &
./redis-server redis_6380.conf &
./redis-server redis_6381.conf &

./redis-cli -h 127.0.0.1 -p 6379
./redis-cli -h 127.0.0.1 -p 6380
./redis-cli -h 127.0.0.1 -p 6381

把端口爲 6380 和 6381 的服務,設置爲 6379 的從服務器。在新版本中也可以使用命令 replicaof,在客戶端執行下面的命令(也可以寫在配置文件中):

slaveof 127.0.0.1 6379

在 6380 上執行 info replication,它已經成了從服務器

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_read_repl_offset:14
slave_repl_offset:14
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:4f5754021bbd189c622c14321af8d80840432bd7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14

另外,如果主服務器需要密碼,還需要在配置文件. conf 中加上 masterauth 的配置項。

這樣,一主兩從的服務就搭建好了,在主服務器上執行一些命令,可以看到,它的數據也同步到了兩臺從服務器上。

二、搭建哨兵服務

創建配置文件:sentinel.conf

port 26379

# sentinel monitor <master-name> <ip> <port> <quorum>
# master-name: 被監控的redis master名稱
# quorum: 認定master下線的哨兵個數
sentinel monitor redis_6379 127.0.0.1 6379 1

# redis master的密碼
sentinel auth-pass redis_6379 123456

# 判定主觀下線的時間長度,單位爲毫秒
sentinel down-after-milliseconds redis_6379 5000

測試

環境搭建好了,我們來測試一下,先啓動哨兵服務:

./redis-sentinel sentinel.conf

在日誌裏面可以看到,選舉 6379 端口的 redis 服務爲 master:

在 6380、6381 客戶端執行命令 info replication,也可以看出它們是從服務器,而 6379 是 master。

接下來我們把 6379 的服務關掉,直接在對應的客戶端執行 shutdown,在 6380 的客戶端看看它的複製信息(info replication):

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=60102,lag=0
master_failover_state:no-failover
master_replid:78b90907468c5721834570114a74ff9bcce302c5
master_replid2:fb94f4afa0b3535b79e54f9287f60150b76cd9d5
master_repl_offset:60102
second_repl_offset:2694
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:60102

發現 6380 端口對應的服務已經成爲了 master,對 6381 是其對應的 slave,如果再把 6379 的服務啓動起來,它也成爲了 6380 的 slave。

可以看出,Redis 的哨兵模式可以進行自動故障轉換,當 master 宕機以後,自動把其中的一個 slave 提升爲 master,從而繼續對外提供服務,當然,這樣的切換需要一定的時間。

**總結
**

哨兵模式是 Redis 提供的一個高可用架構,它有一組專門的哨兵進程來監控 Redis 主從節點,並在發現故障後自動進行轉移,從而實現了 Redis 服務的高可用,系統的健壯性也更高。

然而,哨兵模式也有它的缺點,比如增加維護成本,容量有限等,相應地,Redis 官方還提供集羣模式,我們會在後續的文章中進行介紹,敬請期待。

鳴謝:

https://www.cnblogs.com/wanghuizhao/p/17521636.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s?__biz=MzU3NTU4ODU3Nw==&amp;mid=2247488611&amp;idx=1&amp;sn=6d63e803706bc7576eb3937934674409&amp;chksm=fd2185edca560cfb4742bea826d1710174b798f2cb176369b7454ddd961d8f924e200e9e091e&amp;scene=21#wechat_redirect