一、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,無法鏈接的狀態
......