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

1、Redis主從配置

一、環境說明

主機名稱 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(從)

二、修改主從的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   #配置主的密碼

三、啓動主從redis

這裏須要注意的是:redis主從和mysql主從不同,redis主從不用事先同步數據,它會自動同步過去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

三、數據同步驗證

[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"

2、Redis哨兵模式

一、Redis sentinel介紹

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

二、Redis Sentinel的主要功能

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

  • 監控bash

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

  • 通知架構

    當被監控的某個Redis服務器出現問題,Sentinel經過API腳本向管理員或者其餘的應用程序發送通知。tcp

  • 自動故障轉移工具

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

  • 配置提供者

    在Redis Sentinel模式下,客戶端應用在初始化時鏈接的是Sentinel節點集合,從中獲取主節點的信息。

三、Redis Sentinel的工做流程

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

由一個或多個Sentinel實例組成的Sentinel系統能夠監視任意多個主服務器,以及全部從服務器,並在被監視的主服務器進入下線狀態時,自動將下線主服務器屬下的某個從服務器升級爲新的主服務器,而後由新的主服務器代替已下線的主服務器繼續處理命令請求 。以下圖:

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

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

四、相關概念

  • 主觀失效

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

  • 客觀失效

    ODOWN(objectively down),直接翻譯爲」客觀」失效,即多個sentinel實例都認爲master處於」SDOWN」狀態,那麼此時master將處於ODOWN,ODOWN能夠簡單理解爲master已經被集羣肯定爲」不可用」,將會開啓failover

五、環境說明

主機名稱 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

六、部署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

七、啓動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

八、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"

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

模擬中止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,沒法連接的狀態
   ......
相關文章
相關標籤/搜索