Redis哨兵

  • 2019-09-02
  • 0
  • 0

[toc]

一、介绍

Redis 的主从模式下,主节点一旦发生故障不能提供服务,需要人工干预,将从节点晋升为主节点, 同时还需要修改客户端配置。对于很多应用场景这种方式无法接受。
Sentinel(哨兵)架构解决了 redis 主从人工干预的问题。

二、主要功能

Redis Sentinel 是一个分布式系统, Redis Sentinel 为 Redis 提供高可用性。可以在没有人为干预的 情况下阻止某种类型的故障。

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance)该系统执行以下三个任务:

1.监控(Monitoring):
    Sentinel 会不断地定期检查你的主服务器和从服务器是否运作正常。

2.提醒(Notification):
    当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

3.自动故障迁移(Automatic failover):
    当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从
    服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失
    效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器

三、配置

哨兵是基于主从复制,所以需要先部署好主从复制

1.手动安装部署3个单节点

## bind ip地址修改为实际的
mkdir -p /data/redis_cluster/redis_6379
mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}
cd /data/soft/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis
cd /opt/redis_cluster/redis
make && make install
cd /opt/redis_cluster/redis_6379/conf/
cat >redis_6379.conf <<EOF
daemonize yes
bind 10.0.0.5x
port 6379
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
databases 16
dbfilename redis_6379.rdb
dir /data/redis_cluster/redis_6379
EOF 

2.安装部署3个哨兵节点

#所有节点操作
mkdir -p /data/redis_cluster/redis_26379
mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}

3.配置哨兵的配置文件

cat >/opt/redis_cluster/redis_26379/conf/redis_26379.conf << EOF
bind 10.0.0.5x
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379

#mymaster 主节点别名 主节点 ip 和端口,判断主节点失败,两个 sentinel 节点统一
sentinel monitor mymaster 10.0.0.7 6379 2 

#选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。
sentinel down-after-milliseconds mymaster 3000

#向新的主节点发起复制操作的从节点个数,1 轮询发起复制
sentinel parallel-syncs mymaster 1

#故障转移超时时间
sentinel failover-timeout mymaster 18000
EOF

4.启动所有的单节点

redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf 

5.配置主从复制(此处为临时生效)

redis-cli -h db02 slaveof 10.0.0.7 6379
redis-cli -h db03 slaveof 10.0.0.7 6379

6.启动哨兵

redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf

哨兵启动后,配置文件会发生变化,自动写入以下内容

# Generated by CONFIG REWRITE
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 10.0.0.9 6379
sentinel known-slave mymaster 10.0.0.8 6379
sentinel known-sentinel mymaster 10.0.0.8 26379 7a7f3cbf8ab509e57319aa538306ea1397d32cde
sentinel known-sentinel mymaster 10.0.0.7 26379 1c2f96e6f1ebaaf21a7a0cc4c6241668fa210ceb
sentinel current-epoch 0

7.验证主节点

redis-cli -h db01 -p 26379 Sentinel get-master-addr-by-name mymaster
redis-cli -h db02 -p 26379 Sentinel get-master-addr-by-name mymaster
redis-cli -h db03 -p 26379 Sentinel get-master-addr-by-name mymaster

8.模拟故障转移

步骤
– 关闭主节点服务上的所有redis进程
– 观察其他2个节点会不会发生选举
– 查看配置文件里会不会自动更新
– 查看新的主节点能不能写入
– 查看从节点能否正常同步

[root@52 redis_6379]# tail -f /opt/redis_cluster/redis_26379/logs/redis_26379.log 
28035:X 03 Sep 21:32:12.301 # +sdown sentinel 1c2f96e6f1ebaaf21a7a0cc4c6241668fa210ceb 10.0.0.7 26379 @ mymaster 10.0.0.7 6379
28035:X 03 Sep 21:32:12.428 # +new-epoch 1
28035:X 03 Sep 21:32:12.429 # +vote-for-leader 5d8e7f86aa8f3c7931d0a267bfebd2949d569381 1
28035:X 03 Sep 21:32:13.402 # +odown master mymaster 10.0.0.7 6379 #quorum 2/2
28035:X 03 Sep 21:32:13.402 # Next failover delay: I will not start a failover before Tue Sep  3 21:32:49 2019
28035:X 03 Sep 21:32:13.590 # +config-update-from sentinel 5d8e7f86aa8f3c7931d0a267bfebd2949d569381 10.0.0.9 26379 @ mymaster 10.0.0.7 6379
28035:X 03 Sep 21:32:13.590 # +switch-master mymaster 10.0.0.7 6379 10.0.0.8 6379
28035:X 03 Sep 21:32:13.591 * +slave slave 10.0.0.9:6379 10.0.0.9 6379 @ mymaster 10.0.0.8 6379
28035:X 03 Sep 21:32:13.591 * +slave slave 10.0.0.7:6379 10.0.0.7 6379 @ mymaster 10.0.0.8 6379
28035:X 03 Sep 21:32:16.603 # +sdown slave 10.0.0.7:6379 10.0.0.7 6379 @ mymaster 10.0.0.8 6379

10.0.0.8被选举为新的master

[root@52 redis_6379]# redis-cli -h db03 -p 26379 Sentinel get-master-addr-by-name mymaster
1) "10.0.0.8"
2) "6379"

9.模拟故障修复上线

  • 启动单节点
  • 启动哨兵

10.模拟权重选举

Redis Sentinel 存在多个从节点时,如果想将指定的从节点晋升为主节点,可以将其他从节点的 slavepriority 配
置为 0,但是需要注意 failover 后,将 slave-priority 调回原值.

  • 设置其他节点的权重为0
  • 手动发起重新选举
  • 观察所有节点消息是否同步
  • 观察切换结果是否符合预期

操作步骤:
想让db01晋升为主节点

[root@52 ~]# redis-cli -h db02 -p 6379 CONFIG SET slave-priority 0
[root@53 ~]# redis-cli -h db03 -p 6379 CONFIG SET slave-priority 0
[root@51 ~]# redis-cli -h db01 -p 26379 sentinel failover mymaster

查看日志

27792:X 03 Sep 21:46:20.727 # +new-epoch 2
27792:X 03 Sep 21:46:20.727 # +config-update-from sentinel 1c2f96e6f1ebaaf21a7a0cc4c6241668fa210ceb 10.0.0.7 26379 @ mymaster 10.0.0.8 6379
27792:X 03 Sep 21:46:20.727 # +switch-master mymaster 10.0.0.8 6379 10.0.0.7 6379
27792:X 03 Sep 21:46:20.728 * +slave slave 10.0.0.9:6379 10.0.0.9 6379 @ mymaster 10.0.0.7 6379
27792:X 03 Sep 21:46:20.728 * +slave slave 10.0.0.8:6379 10.0.0.8 6379 @ mymaster 10.0.0.7 6379

命令解释:

1.查询命令:CONFIG GET slave-priority
2.设置命令:CONFIG SET slave-priority 0
3.主动切换:sentinel failover mymaster

验证选举结果:

redis-cli -h db01 -p 26379 Sentinel get-master-addr-by-name mymaster

参考文档:https://www.cnblogs.com/leeSmall/p/8398401.html

评论

还没有任何评论,你来说两句吧

提供支持 - 友情链接 - 衫小寨