Redis哨兵Sentinel配置

1 Sentinel的功能

  • 監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
  • 提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過API向管理
    員或者其他應用程序發送通知。
  • 自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時,Sentinel會開始一次自
    動故障轉移操作, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服
    務器的其他從服務器改爲複製新的主服務器。
    當客戶端試圖連接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址,使得集羣可以
    使用新主服務器代替失效服務器。

2 配置Redis哨兵模式

2.1 基礎環境準備

需要有一套集羣環境或者redis主從環境,然後配置哨兵監控主節點,之後進行故障轉移測試
可參考之前寫的文章,這裏我用主從模式。

redis-trib.rb和redis-cli部署redis主從集羣
redis主從

主機說明

主機IP Redis端口號 Sentinel端口 說明
192.168.9.38 6379 26379 master
192.168.9.39 6379 26379 slave01
192.168.9.68 6379 26379 slave02

Redis目錄結構(192.168.9.38)

[root@redis redis]# pwd
/opt/redis
[root@mysql01 redis]# tree
.
├── bin
│   ├── redis-benchmark
│   ├── redis-check-aof
│   ├── redis-check-rdb
│   ├── redis-cli
│   ├── redis-migrate-tool
│   ├── redis-sentinel -> redis-server
│   └── redis-server
├── conf
│   └── 6379
│       ├── db
│       │   ├── dump.rdb
│       │   └── nodes-6379.conf
│       ├── log
│       │   └── redis_6379.log
│       ├── redis.conf
│       ├── sentinel
│       │   └── redis-sentinel.log
│       └── sentinel.conf
└── scripts
    ├── creat-instance.sh
    └── node-env-init.sh

7 directories, 15 files

2.2 修改配置文件

詳細配置文件說明可參考如下文章

sentinel.conf配置文件詳解

# 訪問控制關閉
protected-mode no
port 26379
daemonize yes
pidfile /var/run/redis-sentinel.pid
dir /opt/redis/conf/6379/sentinel
logfile /opt/redis/conf/6379/sentinel/redis-sentinel.log

# 哨兵監控的master節點,後⾯面這個2是指⼏幾個哨兵發現master宕機了了,才進⾏行行故障轉移
sentinel monitor mymaster 192.168.9.38 6379 2

# 設置主機訪問密碼
sentinel auth-pass mymaster 12345678

# 哨兵多久連接不不上master就認爲master宕機了了的時間,單位是毫秒
sentinel down-after-milliseconds mymaster 3000

# 新的master出現後,其他follow的slave並⾏行行同步的個數,並⾏行行的越多同時阻塞的就越多
sentinel parallel-syncs mymaster 1

分發配置文件到其它節點上,若有多實例配置可以以端口號區分目錄

scp /opt/redis/conf/6379/sentinel.conf 192.168.9.39:/opt/redis/conf/6379/
scp /opt/redis/conf/6379/sentinel.conf 192.168.9.68:/opt/redis/conf/6379/

2.3 啓動Sentinel

以 192.168.9.38 爲例

# 啓動
/opt/redis/bin/redis-sentinel /opt/redis/conf/6379/sentinel.conf

# 查看master狀態
[root@redis 6379]# /opt/redis/bin/redis-cli -h 192.168.9.38 -p 26379
192.168.9.38:26379> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.9.38"
 5) "port"
 6) "6379"
......

# 查看slave狀態
192.168.9.38:26379> sentinel slaves mymaster
1)  1) "name"
    2) "192.168.9.68:6379"
    3) "ip"
    4) "192.168.9.68"
    5) "port"
    6) "6379"
......
2)  1) "name"
    2) "192.168.9.39:6379"
    3) "ip"
    4) "192.168.9.39"
    5) "port"
    6) "6379"
......

# 查看Sentinel狀態
192.168.9.38:26379> sentinel sentinels mymaster
1)  1) "name"
    2) "879c18048a7ba013354dbca3f1d1e8ffbe1b2bb9"
    3) "ip"
    4) "192.168.9.68"
    5) "port"
    6) "26379"
......
2)  1) "name"
    2) "9171622bf154b7e48a988743694ed3f9025916ed"
    3) "ip"
    4) "192.168.9.39"
    5) "port"
    6) "26379"

3 故障轉移測試

操作步驟

  1. 實時查看Sentinel日誌
  2. kill master節點進程
  3. 查看日誌看master是否重新選舉
  4. 進行讀寫操作
  5. 把之前的master的redis實例啓動起來
# 1. 實時查看192.168.9.38的Sentinel日誌
[root@redis ~]# tailf /opt/redis/conf/6379/sentinel/redis-sentinel.log

# 2. kill master節點進程
kill -9 `netstat -lntup | grep redis-server | awk -F'[ /]+' '{print $7}'`

# 3. 查看192.168.9.38的Sentinel日誌會發現master已經重新選舉
# 新的master已經切換到192.168.9.68節點上了
1355:X 06 Jul 2020 19:20:57.501 # +sdown master mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:20:58.566 # +odown master mymaster 192.168.9.38 6379 #quorum 3/2
1355:X 06 Jul 2020 19:21:24.774 # +new-epoch 66
1355:X 06 Jul 2020 19:21:24.774 # +try-failover master mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:24.871 # +vote-for-leader 2badff7d06626470131b75b1cf69ea643f4780ce 66
1355:X 06 Jul 2020 19:21:25.072 # 9171622bf154b7e48a988743694ed3f9025916ed voted for 2badff7d06626470131b75b1cf69ea643f4780ce 66
1355:X 06 Jul 2020 19:21:25.072 # 879c18048a7ba013354dbca3f1d1e8ffbe1b2bb9 voted for 2badff7d06626470131b75b1cf69ea643f4780ce 66
1355:X 06 Jul 2020 19:21:25.118 # +elected-leader master mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:25.118 # +failover-state-select-slave master mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:25.180 # +selected-slave slave 192.168.9.68:6379 192.168.9.68 6379 @ mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:25.180 * +failover-state-send-slaveof-noone slave 192.168.9.68:6379 192.168.9.68 6379 @ mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:25.256 * +failover-state-wait-promotion slave 192.168.9.68:6379 192.168.9.68 6379 @ mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:25.788 # +promoted-slave slave 192.168.9.68:6379 192.168.9.68 6379 @ mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:25.788 # +failover-state-reconf-slaves master mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:25.806 * +slave-reconf-sent slave 192.168.9.39:6379 192.168.9.39 6379 @ mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:26.159 # -odown master mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:26.646 * +slave-reconf-inprog slave 192.168.9.39:6379 192.168.9.39 6379 @ mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:26.647 * +slave-reconf-done slave 192.168.9.39:6379 192.168.9.39 6379 @ mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:26.716 # +failover-end master mymaster 192.168.9.38 6379
1355:X 06 Jul 2020 19:21:26.717 # +switch-master mymaster 192.168.9.38 6379 192.168.9.68 6379
1355:X 06 Jul 2020 19:21:26.717 * +slave slave 192.168.9.39:6379 192.168.9.39 6379 @ mymaster 192.168.9.68 6379
1355:X 06 Jul 2020 19:21:26.717 * +slave slave 192.168.9.38:6379 192.168.9.38 6379 @ mymaster 192.168.9.68 6379
1355:X 06 Jul 2020 19:21:29.753 # +sdown slave 192.168.9.38:6379 192.168.9.38 6379 @ mymaster 192.168.9.68 6379

# 4. 查看192.168.9.68是否已經是master節點並進行讀寫操作
# 因爲這裏的redis主從配置的從節點只讀,故如果192.168.9.68沒有切換成master是不能進行寫操作的
[root@redis ~]# /opt/redis/bin/redis-cli -h 192.168.9.68 -p 26379
192.168.9.68:26379> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.9.68"
 5) "port"
 6) "6379"
......
[root@redis ~]# /opt/redis/bin/redis-cli -h 192.168.9.68 -a 12345678
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.9.68:6379> set name RSQ
OK
192.168.9.68:6379> get name
"RSQ"

# 5. 把之前的master的redis實例啓動起來(192.168.9.38)
[root@redis 6379]# /opt/redis/bin/redis-server /opt/redis/conf/6379/redis.conf
[root@redis 6379]# /opt/redis/bin/redis-cli -h 192.168.9.38 -a 12345678
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.9.38:6379> info Replication
# Replication
role:slave
master_host:192.168.9.68
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:111692
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:8f8986ae850f233f7531fa63ac5f3c22e3a5b4c9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:111692
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:94624
repl_backlog_histlen:17069

# 檢查192.168.9.38的redis.conf配置文件,會發現之前的master被Sentinel自動修改了配置文件
[root@redis 6379]# grep "^replicaof" /opt/redis/conf/6379/redis.conf 
replicaof 192.168.9.68 6379

故障轉移測試成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章