1. 程式人生 > 實用技巧 >Redis學習之路(三)之Redis主從和哨兵模式

Redis學習之路(三)之Redis主從和哨兵模式

Redis學習之路(三)之Redis主從和哨兵模式

目錄

一、Redis主從配置

1、環境說明

主機名稱IP地址redis版本和角色說明
redis-master 192.168.56.11 redis 5.0.3(主)
redis-slave01 192.168.56.12 redis 5.0.3(從)
redis-slave02 192.168.56.13 redis 5.0.3(從)

2、修改主從的redis配置檔案

[root@redis-master ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf 
bind 192.168.56.11
protected-mode yes
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis.log
" dir /var/redis/
[root@redis-slave01 ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf
bind 192.168.56.12
protected-mode yes
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis.log"
dir /var/redis/
replicaof 192.168.56.11 6379    #配置為master的從,如果master上有密碼配置,還需要增加下面一項密碼配置
masterauth 123456
#配置主的密碼

[root@redis-slave02 ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf
bind 192.168.56.13
protected-mode yes
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis.log"
dir /var/redis/
replicaof 192.168.56.11 6379    #配置為master的從
masterauth 123456    #配置主的密碼

3、啟動主從redis

這裡需要注意的是:redis主從和mysql主從不一樣,redis主從不用事先同步資料,它會自動同步過去

[root@redis-master ~]# systemctl start redis
[root@redis-slave01 ~]# systemctl start redis
[root@redis-slave02 ~]# systemctl start redis
[root@redis-master ~]# netstat -tulnp |grep redis
tcp        0      0 192.168.56.11:6379      0.0.0.0:*               LISTEN      1295/redis-server 1 
[root@redis-slave01 ~]# netstat -tulnp |grep redis
tcp        0      0 192.168.56.12:6379      0.0.0.0:*               LISTEN      1625/redis-server 1 
[root@redis-slave02 ~]# netstat -tulnp |grep redis
tcp        0      0 192.168.56.13:6379      0.0.0.0:*               LISTEN      1628/redis-server 1 

3、資料同步驗證

[root@redis-master ~]# redis-cli -h 192.168.56.11    #主上寫入資料
192.168.56.11:6379> KEYS *
(empty list or set)
192.168.56.11:6379> set k1 123
OK
192.168.56.11:6379> set k2 456
OK

[root@redis-slave01 ~]# redis-cli -h 192.168.56.12    #slave01上檢視是否資料同步
192.168.56.12:6379> KEYS *
1) "k2"
2) "k1"
192.168.56.12:6379> get k1
"123"
192.168.56.12:6379> get k2
"456"

[root@redis-slave02 ~]# redis-cli -h 192.168.56.13    #slave02上檢視是否資料同步
192.168.56.13:6379> KEYS *
1) "k2"
2) "k1"
192.168.56.13:6379> get k1
"123"
192.168.56.13:6379> get k2
"456"

二、Redis哨兵模式

1、Redis sentinel介紹

Redis Sentinel是Redis高可用的實現方案。Sentinel是一個管理多個Redis例項的工具,它可以實現對Redis的監控、通知、自動故障轉移。

2、Redis Sentinel的主要功能

Sentinel的主要功能包括主節點存活檢測、主從執行情況檢測、自動故障轉移(failover)、主從切換。Redis的Sentinel最小配置是一主一從。 Redis的Sentinel系統可以用來管理多個Redis伺服器,該系統可以執行以下四個任務:

  • 監控

    Sentinel會不斷的檢查主伺服器和從伺服器是否正常執行。

  • 通知

    當被監控的某個Redis伺服器出現問題,Sentinel通過API指令碼向管理員或者其他的應用程式傳送通知。

  • 自動故障轉移

    當主節點不能正常工作時,Sentinel會開始一次自動的故障轉移操作,它會將與失效主節點是主從關係的其中一個從節點升級為新的主節點, 並且將其他的從節點指向新的主節點。

  • 配置提供者

    在Redis Sentinel模式下,客戶端應用在初始化時連線的是Sentinel節點集合,從中獲取主節點的資訊。

3、Redis Sentinel的工作流程

Sentinel是Redis的高可用性解決方案:

由一個或多個Sentinel例項組成的Sentinel系統可以監視任意多個主伺服器,以及所有從伺服器,並在被監視的主伺服器進入下線狀態時,自動將下線主伺服器屬下的某個從伺服器升級為新的主伺服器,然後由新的主伺服器代替已下線的主伺服器繼續處理命令請求 。如下圖:

Sentinel負責監控叢集中的所有主、從Redis,當發現主故障時,Sentinel會在所有的從中選一個成為新的主。並且會把其餘的從變為新主的從。同時那臺有問題的舊主也會變為新主的從,也就是說當舊的主即使恢復時,並不會恢復原來的主身份,而是作為新主的一個從。

在Redis高可用架構中,Sentinel往往不是隻有一個,而是有3個或者以上。目的是為了讓其更加可靠,畢竟主和從切換角色這個過程還是蠻複雜的。

4、相關概念

  • 主觀失效

    SDOWN(subjectively down),直接翻譯的為”主觀”失效,即當前sentinel例項認為某個redis服務為”不可用”狀態.

  • 客觀失效

    ODOWN(objectively down),直接翻譯為”客觀”失效,即多個sentinel例項都認為master處於”SDOWN”狀態,那麼此時master將處於ODOWN,ODOWN可以簡單理解為master已經被叢集確定為”不可用”,將會開啟failover

5、環境說明

主機名稱IP地址redis版本和角色說明
redis-master 192.168.56.11:6379 redis 5.0.3(主)
redis-slave01 192.168.56.12:6379 redis 5.0.3(從)
redis-slave02 192.168.56.13:6379 redis 5.0.3(從)
redis-master 192.168.56.11:26379 Sentinel01
redis-slave01 192.168.56.12:26379 Sentinel02
redis-slave02 192.168.56.13:26379 Sentinel03

6、部署Sentinel

Sentinel.conf配置檔案主要引數解析:

# 埠
port 26379

# 是否後臺啟動
daemonize yes

# pid檔案路徑
pidfile /var/run/redis-sentinel.pid

# 日誌檔案路徑
logfile "/var/log/sentinel.log"

# 定義工作目錄
dir /tmp

# 定義Redis主的別名, IP, 埠,這裡的2指的是需要至少2個Sentinel認為主Redis掛了才最終會採取下一步行為
sentinel monitor mymaster 127.0.0.1 6379 2

# 如果mymaster 30秒內沒有響應,則認為其主觀失效
sentinel down-after-milliseconds mymaster 30000

# 如果master重新選出來後,其它slave節點能同時並行從新master同步資料的臺數有多少個,顯然該值越大,所有slave節點完成同步切換的整體速度越快,但如果此時正好有人在訪問這些slave,可能造成讀取失敗,影響面會更廣。最保守的設定為1,同一時間,只能有一臺幹這件事,這樣其它slave還能繼續服務,但是所有slave全部完成快取更新同步的程序將變慢。
sentinel parallel-syncs mymaster 1

# 該引數指定一個時間段,在該時間段內沒有實現故障轉移成功,則會再一次發起故障轉移的操作,單位毫秒
sentinel failover-timeout mymaster 180000

# 不允許使用SENTINEL SET設定notification-script和client-reconfig-script。
sentinel deny-scripts-reconfig yes

修改三臺Sentinel的配置檔案,如下

[root@redis-master ~]# grep -Ev "^$|#" /usr/local/redis/sentinel.conf 
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/sentinel.log"
dir "/tmp"
sentinel monitor mymaster 192.168.56.11 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

[root@redis-slave01 ~]# grep -Ev "^$|#" /usr/local/redis/sentinel.conf 
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/sentinel.log"
dir "/tmp"
sentinel monitor mymaster 192.168.56.11 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

[root@redis-slave02 ~]# grep -Ev "^$|#" /usr/local/redis/sentinel.conf 
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/sentinel.log"
dir "/tmp"
sentinel monitor mymaster 192.168.56.11 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

7、啟動Sentinel

啟動的順序:主Redis --> 從Redis --> Sentinel1/2/3

[root@redis-master ~]# redis-sentinel /usr/local/redis/sentinel.conf 
[root@redis-master ~]# ps -ef |grep redis
root      1295     1  0 14:03 ?        00:00:06 /usr/local/redis/src/redis-server 192.168.56.11:6379
root      1407     1  1 14:40 ?        00:00:00 redis-sentinel *:26379 [sentinel]
root      1412  1200  0 14:40 pts/1    00:00:00 grep --color=auto redis

[root@redis-slave01 ~]# redis-sentinel /usr/local/redis/sentinel.conf 
[root@redis-slave01 ~]# ps -ef |grep redis
root      1625     1  0 14:04 ?        00:00:06 /usr/local/redis/src/redis-server 192.168.56.12:6379
root      1715     1  1 14:41 ?        00:00:00 redis-sentinel *:26379 [sentinel]
root      1720  1574  0 14:41 pts/0    00:00:00 grep --color=auto redis

[root@redis-slave02 ~]# redis-sentinel /usr/local/redis/sentinel.conf 
[root@redis-slave02 ~]# ps -ef |grep redis
root      1628     1  0 14:07 ?        00:00:06 /usr/local/redis/src/redis-server 192.168.56.13:6379
root      1709     1  0 14:42 ?        00:00:00 redis-sentinel *:26379 [sentinel]
root      1714  1575  0 14:42 pts/0    00:00:00 grep --color=auto redis

8、Sentinel操作

[root@redis-master ~]# redis-cli -p 26379    #哨兵模式檢視
127.0.0.1:26379> sentinel master mymaster    #輸出被監控的主節點的狀態資訊
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.56.11"
 5) "port"
 6) "6379"
 7) "runid"
 8) "bae06cc3bc6dcbff7c2de1510df7faf1a6eb6941"
 9) "flags"
10) "master"
......
127.0.0.1:26379> sentinel slaves mymaster    #檢視mymaster的從資訊,可以看到有2個從節點
1)  1) "name"
    2) "192.168.56.12:6379"
    3) "ip"
    4) "192.168.56.12"
    5) "port"
    6) "6379"
    7) "runid"
    8) "c86027e7bdd217cb584b1bd7a6fea4ba79cf6364"
    9) "flags"
   10) "slave"
......
2)  1) "name"
    2) "192.168.56.13:6379"
    3) "ip"
    4) "192.168.56.13"
    5) "port"
    6) "6379"
    7) "runid"
    8) "61597fdb615ecf8bd7fc18e143112401ed6156ec"
    9) "flags"
   10) "slave"
......

127.0.0.1:26379> sentinel sentinels mymaster    #檢視其它sentinel資訊
1)  1) "name"
    2) "ba12e2a4023d2e9bcad282395ba6b14030920070"
    3) "ip"
    4) "192.168.56.12"
    5) "port"
    6) "26379"
    7) "runid"
    8) "ba12e2a4023d2e9bcad282395ba6b14030920070"
    9) "flags"
   10) "sentinel"
......
2)  1) "name"
    2) "14fca3f851e9e1bd3a4a0dc8a9e34bb237648455"
    3) "ip"
    4) "192.168.56.13"
    5) "port"
    6) "26379"
    7) "runid"
    8) "14fca3f851e9e1bd3a4a0dc8a9e34bb237648455"
    9) "flags"
   10) "sentinel"

9、哨兵模式下的主從測試

模擬停止master上的Redis,檢視Redis的主從變化,如下:

[root@redis-master ~]# systemctl stop redis        #停止master上的redis

[root@redis-slave01 ~]# tail -n 20 /var/log/sentinel.log     #檢視哨兵日誌
......
1747:X 19 Apr 2019 14:59:01.747 # +monitor master mymaster 192.168.56.11 6379 quorum 2
1747:X 19 Apr 2019 14:59:44.829 # +sdown sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 6379
1747:X 19 Apr 2019 14:59:46.950 # -sdown sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 6379
1747:X 19 Apr 2019 15:00:44.391 # +sdown master mymaster 192.168.56.11 6379
1747:X 19 Apr 2019 15:00:44.525 # +new-epoch 1
1747:X 19 Apr 2019 15:00:44.527 # +vote-for-leader 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 1
1747:X 19 Apr 2019 15:00:45.023 # +config-update-from sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 6379
1747:X 19 Apr 2019 15:00:45.023 # +switch-master mymaster 192.168.56.11 6379 192.168.56.13 6379
1747:X 19 Apr 2019 15:00:45.024 * +slave slave 192.168.56.12:6379 192.168.56.12 6379 @ mymaster 192.168.56.13 6379
1747:X 19 Apr 2019 15:00:45.024 * +slave slave 192.168.56.11:6379 192.168.56.11 6379 @ mymaster 192.168.56.13 6379
1747:X 19 Apr 2019 15:01:15.050 # +sdown slave 192.168.56.11:6379 192.168.56.11 6379 @ mymaster 192.168.56.13 6379

#從上面的日誌可以看到master已經sdown,並切換為192.168.56.13為master節點,下面檢視slave01上的配置,會自動的更改replicaof配置項,如下:

[root@redis-slave01 ~]# grep "replicaof" /usr/local/redis/redis.conf |grep -vE "#"
replicaof 192.168.56.13 6379

[root@redis-master ~]# redis-cli -p 26379    #哨兵模式下檢視主從資訊,也是可以看到主從的變化
127.0.0.1:26379> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.56.13"
 5) "port"
 6) "6379"
 7) "runid"
 8) "61597fdb615ecf8bd7fc18e143112401ed6156ec"
 9) "flags"
10) "master"
......
127.0.0.1:26379> sentinel slaves mymaster
1)  1) "name"
    2) "192.168.56.12:6379"
    3) "ip"
    4) "192.168.56.12"
    5) "port"
    6) "6379"
    7) "runid"
    8) "c86027e7bdd217cb584b1bd7a6fea4ba79cf6364"
    9) "flags"
   10) "slave"
......
2)  1) "name"
    2) "192.168.56.11:6379"
    3) "ip"
    4) "192.168.56.11"
    5) "port"
    6) "6379"
    7) "runid"
    8) ""
    9) "flags"
   10) "s_down,slave,disconnected"    #提示該節點為從,並且狀態為s_down,無法連結的狀態


   ......