部署redis集群哨兵模式
- 前言
- 主要功能
- 工作机制
- 一、虚拟机部署
- 1、安装
- 2、改配置
- 1、redis.conf
- 2、sentinel.conf
- 3、起服务
- 4、停redis-server服务,验证sentinel
- 3、脚本
- 1. sentinel notification-script
- 2. sentinel reconfig-script
- 3. sentinel client-reconfig-script
- 4. sentinel deny-scripts-reconfig
前言
Redis 哨兵(Sentinel)是 Redis 提供的一种高可用性解决方案,旨在确保 Redis 服务在主从架构中能够自动故障转移和系统的高可用性。哨兵的主要功能和机制包括以下几个方面:
主要功能
监控(Monitoring):哨兵会持续检查主服务器和从服务器是否正常运行。
通知(Notification):当被监控的 Redis 服务器出现问题时,哨兵可以通过 API 向管理员或其他应用程序发送通知。
自动故障转移(Automatic Failover):当主服务器出现故障时,哨兵会自动将其中一个从服务器提升为新的主服务器,并且通知其他从服务器修改它们的配置,指向新的主服务器。
配置提供(Configuration Provider):哨兵会告诉客户端当前的 Redis 集群拓扑结构,使得客户端可以始终知道如何连接到正确的主服务器。
工作机制
-
哨兵节点(Sentinel Nodes)
Redis 哨兵本身也是一种特殊的 Redis 实例,它们以哨兵模式运行。一般部署多个哨兵节点来保证高可用性和可靠性。 -
配置和启动
每个哨兵节点都需要配置文件,其中包含了监控的主服务器地址和相关配置。哨兵节点启动后,会根据配置文件开始工作。 -
主从监控(Master-Slave Monitoring)
哨兵节点通过定期发送 PING 命令来检查主服务器和从服务器的健康状态。如果在一定时间内没有收到响应,哨兵会认为该服务器出现问题。 -
主观下线(Subjective Down, SDOWN)
当一个哨兵节点认为一个服务器不可用时,它会将其标记为主观下线(SDOWN)。这个状态是单个哨兵节点的判断结果。 -
客观下线(Objective Down, ODOWN)
当多个哨兵节点一致认为一个服务器不可用时,它们会将其标记为客观下线(ODOWN)。这种一致性通过哨兵节点之间相互通信来实现。 -
故障转移(Failover)
一旦主服务器被标记为 ODOWN,哨兵节点会协商并选举一个领导哨兵节点来执行故障转移操作:
选择新的主服务器:从剩余的从服务器中选举一个提升为新的主服务器。
更新配置:通知其他从服务器指向新的主服务器。
通知客户端:通过 Redis 的发布订阅机制通知客户端更新连接信息。
7. 配置同步
在新的主服务器选举完成后,哨兵节点会更新自身的配置并相互同步,确保所有哨兵节点都了解当前的集群拓扑结构。
- 恢复与重启
当原主服务器恢复后,它会自动成为新的从服务器,开始从新的主服务器同步数据。
哨兵选举机制
哨兵之间通过 Raft 或类似的分布式一致性算法来进行领导选举。领导哨兵负责协调故障转移操作,确保整个过程有序进行。
配置示例
一个典型的 Redis 哨兵配置文件如下:
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
port 26379:哨兵服务运行的端口。
sentinel monitor mymaster 127.0.0.1 6379 2:监控名为 mymaster 的主服务器,地址为 127.0.0.1:6379,至少需要 2 个哨兵节点同意才能认为主服务器下线。
sentinel down-after-milliseconds mymaster 5000:如果 5 秒内主服务器没有响应,哨兵认为它下线。
sentinel failover-timeout mymaster 60000:故障转移的超时时间为 60 秒。
sentinel parallel-syncs mymaster 1:在故障转移过程中,最多有一个从服务器与新的主服务器同步数据。
通过 Redis 哨兵,可以实现 Redis 集群的高可用性和自动故障转移,确保系统的稳定性和可靠性。
一、虚拟机部署
##一主两从
192.168.220.66 主 88/99从
1、安装
## Ubuntu 安装
apt install -y redis redis-sentinel
root@vm1:/etc/redis# cd /etc/redis/ && ll
total 104
drwxrws--- 2 redis redis 4096 Jul 2 17:21 ./
drwxr-xr-x 105 root root 4096 Jul 2 17:10 ../
-rw-r----- 1 redis redis 85844 Mar 4 2022 redis.conf
-rw-r----- 1 redis redis 10936 Jul 2 17:21 sentinel.conf
systemctl stop redis-server
systemctl stop redis-sentinel
2、改配置
1、redis.conf
##redis.conf
bind 0.0.0.0
requirepass 123456
##replicaof 192.168.220.66 6379 从
##masterauth 123456 从
appendonly yes
appendfilename "appendonly.aof"
root@vm1:/etc/redis# redis-cli
127.0.0.1:6379>auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.220.99,port=6379,state=online,offset=70,lag=0
slave1:ip=192.168.220.88,port=6379,state=online,offset=70,lag=0
master_replid:f55cc7aadcaef6322a7c2b821bfbddbaa18f026f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:70
2、sentinel.conf
##修改行
bind 0.0.0.0
sentinel monitor mymaster 192.168.220.66 6379 2 ###定义master主节点一定在以下所有mymaster之上
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
3、起服务
systemctl start redis-server
systemctl start redis-sentinel
systemctl enable redis-server
systemctl enable redis-sentinel
4、停redis-server服务,验证sentinel
root@vm3:/etc/redis# redis-cli -p 26379 sentinel master mymaster
1) "name"
2) "mymaster"
3) "ip"
4) "192.168.220.66"
5) "port"
6) "6379"
7) "runid"
8) "275325fbdd87554742740d67186e441509692289"
9) "flags"
10) "master"
。。。。
redis-cli -h 192.168.220.66 -p 6379 -a 123456 info replication
root@vm1:/etc/redis# systemctl stop redis-server.service
root@vm1:/etc/redis# redis-cli -p 26379 sentinel master mymaster
1) "name"
2) "mymaster"
3) "ip"
4) "192.168.220.88"
5) "port"
6) "6379"
7) "runid"
8) "2fef4f9f96319f5462ebfa7e4fc30ebad6273a8b"
9) "flags"
10) "master"
11) "link-pending-commands"
。。。。
验证配置文件已自动修改。
root@vm2:/etc/redis# !egrep
egrep -v "^#|^$" sentinel.conf
bind 0.0.0.0
port 26379
daemonize yes
pidfile "/var/run/sentinel/redis-sentinel.pid"
logfile "/var/log/redis/redis-sentinel.log"
dir "/var/lib/redis"
sentinel myid 9cbef9b35cef23a9883e2eaa35abe2992e16a1d2
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.220.88 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
sentinel known-replica mymaster 192.168.220.99 6379
sentinel known-replica mymaster 192.168.220.66 6379
protected-mode no
supervised systemd
user default on nopass ~* +@all
sentinel known-sentinel mymaster 192.168.220.99 26379 7ea4cda07270c0cd482b360d3e391de145dfebdc
sentinel known-sentinel mymaster 192.168.220.66 26379 70777fc6d97c83d28bfd2f679251c8eeb2cb91c3
sentinel current-epoch 1
3、脚本
在 Redis Sentinel中,脚本(scripts)用于在特定事件发生时执行一些自定义操作。常见的事件包括主节点失效(failover)、从节点选举为新的主节点等。这些脚本可以用于通知系统管理员、更新配置或执行其他管理任务。
1. sentinel notification-script
当 Sentinel 检测到某些事件(如主节点或从节点的状态变化)时,会调用此脚本。该脚本通常用于发送通知(如电子邮件、短信等)。
sentinel notification-script mymaster /etc/redis/notification_script.sh
通知脚本 (notification_script.sh)
#!/bin/bash
EVENT_TYPE=$1
EVENT_DETAILS=$2
发送电子邮件通知
echo "Event: $EVENT_TYPE - Details: $EVENT_DETAILS" | mail -s "Redis Sentinel Notification" admin@example.com
确保脚本具有可执行权限:
chmod +x /etc/redis/notification_script.sh
2. sentinel reconfig-script
当 Sentinel 进行故障转移(failover)时,会调用此脚本。该脚本通常用于通知从节点新的主节点地址,以便它们重新配置自己。
sentinel reconfig-script mymaster /etc/redis/reconfig_script.sh
配置脚本 (reconfig_script.sh)
#!/bin/bash
NEW_MASTER_IP=$1
NEW_MASTER_PORT=$2
更新所有从节点的配置以指向新的主节点
redis-cli -h 192.168.220.88 -p 6379 SLAVEOF $NEW_MASTER_IP $NEW_MASTER_PORT
redis-cli -h 192.168.220.99 -p 6379 SLAVEOF $NEW_MASTER_IP $NEW_MASTER_PORT
确保脚本具有可执行权限:
chmod +x /etc/redis/reconfig_script.sh
3. sentinel client-reconfig-script
用于在故障转移后通知应用程序或客户端进行相应的调整。
sentinel client-reconfig-script mymaster /etc/redis/client_reconfig_script.sh
#!/bin/bash
MASTER_IP=$6
# 表示传递的第六个参数,即新 Master 的地址
INTERFACE="ens33"
# 网络接口名,这里假设为 ens33
LOCAL_IP=`hostname -i | awk '{print $2}'`
# 获取本机在 ens33 网络接口上的 IP 地址
VIP="192.168.220.110"
# 要设置的虚拟 IP 地址
NETMASK="24"
# 子网掩码,这里假设为 24
KEY="1"
# 用于区分不同的虚拟 IP 地址后缀
# 判断当前节点是否为主节点
if [ "$MASTER_IP" = "$LOCAL_IP" ]; then
/sbin/ifconfig ${INTERFACE}:${KEY} ${VIP}/${NETMASK}
# 如果当前节点是主节点,则将指定的 VIP 绑定到 ens33 网络接口上
exit 0
else
/sbin/ifconfig ${INTERFACE}:${KEY} down
# 如果当前节点不是主节点,则将指定的 VIP 和 ens33 网络接口上的绑定停止
fi
exit 1
4. sentinel deny-scripts-reconfig
用于防止 Sentinel 通过脚本修改其配置。如果设置为 yes,则 Sentinel 不允许脚本修改 Sentinel 配置。
sentinel deny-scripts-reconfig yes
在每个 Sentinel 配置文件 /etc/redis/sentinel.conf 中添加脚本配置:
sentinel monitor mymaster 192.168.220.66 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
sentinel notification-script mymaster /etc/redis/notification_script.sh
sentinel reconfig-script mymaster /etc/redis/reconfig_script.sh
sentinel deny-scripts-reconfig yes