哨兵
在一主多从架构中从节点可以起到数据冗余备份和读写分离的作用。如果主节点遇到故障导致无法提供服务时,可以采用手动方式将其一个从节点提升为主节点,保证Redis主从能够正常工作。主从切换通过手动完成比较耗时、费力,并且影响Redis正常服务。为此,Reids提供了哨兵功能,实现了自动化的系统监控和故障恢复功能
哨兵(Sentinel),主要负责监控主从节点运行是否正常,以及当主节点出现故障时自动将一个从节点转换为新的主节点。哨兵是一个独立的进程
哨兵最基础架构由两部分组成,包括哨兵节点和数据节点。其中,哨兵节点是特殊的Redis节点,并不存储数据,出于高可用方面考虑,哨兵架构中通常都是多个哨兵节点共同提供服务。数据节点用于存储Redis数据。包括主节点和从节点
配置哨兵
资源列表
操作系统 | 配置 | 主机名 | IP | 角色 |
---|---|---|---|---|
CentOS 7.9 | 2C4G | sentinel01 | 192.168.27.143 | 哨兵节点 |
CentOS 7.9 | 2C4G | sentinel02 | 192.168.27.129 | 哨兵节点 |
CentOS 7.9 | 2C4G | sentinel03 | 192.168.27.130 | 哨兵节点 |
CentOS 7.9 | 2C4G | master | 192.168.27.132 | 主节点 |
CentOS 7.9 | 2C4G | slave01 | 192.168.27.133 | 从节点 |
CentOS 7.9 | 2C4G | slave02 | 192.168.27.134 | 从节点 |
基础环境
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭内核安全机制
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
修改主机名,方便辨识
hostnamectl set-hostname sentinel01
hostnamectl set-hostname sentinel02
hostnamectl set-hostname sentinel03
hostnamectl set-hostname master
hostnamectl set-hostname slave01
hostnamectl set-hostname slave02
安装部署redis
在master slave01 slave02节点上执行以下操作
yum -y install gcc gcc-c++ make
tar -zxvf redis-6.2.4.tar.gz -C /usr/src/
cd /usr/src/redis-6.2.4/
make && make PREFIX=/usr/local/redis install # PREFIX指定安装路径
ln -s /usr/local/redis/bin/* /usr/local/bin/
make && make PREFIX=/usr/local/redis install
只是安装了二进制文件到系统中,并没有启动脚本和配置文件。Redis提供了默认的配置文件,将配置文件复制到/etc/目录下,然后编写服务脚本用于启动Redis及设置开机启动。当Redis启动完成后,默认监听6379
端口。
# 创建配置文件目录
mkdir /etc/redis
# 适用默认配置文件
cp /usr/src/redis-6.2.4/redis.conf /etc/redis/6379.conf
编写服务脚本
cat > /etc/systemd/system/redis.service << EOF
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/6379.conf
[Install]
WantedBy=multi-user.target
EOF
修改配置文件
在master节点
vi /etc/redis/6379.conf
监听地址为当前节点的IP
启动服务查看端口号
systemctl daemon-reload
systemctl start redis
systemctl enable redis
netstat -anpt | grep 6379
slave01节点
vi /etc/redis/6379.conf
systemctl daemon-reload
systemctl start redis
systemctl enable redis
netstat -anpt | grep 6379
slave02节点
vi /etc/redis/6379.conf
systemctl daemon-reload
systemctl start redis
systemctl enable redis
netstat -anpt | grep 6379
主从配置
在slave01,slave02节点上操作
#slave01节点
vi /etc/redis/6379.conf
# 末尾添加即可
# IP地址和端口添加主库的IP和端口
slaveof 192.168.27.132 6379
# slave02节点
[root@slave02 ~]# vi /etc/redis/6379.conf
# 末尾添加即可
# IP地址和端口添加主库的IP和端口
slaveof 192.168.27.132 6379
重启redis服务
systemctl restart redis
验证主从数据
在主节点上操作
[root@master ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master # 自己的角色
connected_slaves:2 # 两个从节点
slave0:ip=192.168.27.133,port=6379,state=online,offset=84,lag=1 # 从节点对应的记录
slave1:ip=192.168.27.134,port=6379,state=online,offset=84,lag=1 # 从节点对应的记录
...
在从节点上执行
[root@slave01 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave # 自己的角色
master_host:192.168.27.132 # 主节点
master_port:6379
master_link_status:up
...
验证数据同步
127.0.0.1:6379> set abc 100 # 主节点写入数据
OK
127.0.0.1:6379> get abc # slave01节点查看数据是否同步
"100"
127.0.0.1:6379> get abc # slave02节点查看数据是否同步
"100"
部署哨兵(三台哨兵节点,一样的配置)
安装redis,上传redis软件包(redis-6.2.4.tar.gz)
yum -y install gcc gcc-c++ make
tar -zxf redis-6.2.4.tar.gz -C /usr/src/
cd /usr/src/redis-6.2.4/
make && make install
mkdir /etc/redis
cp /usr/src/redis-6.2.4/redis.conf /etc/redis/6379.conf
修改配置文件
[root@sentinel01 redis-6.2.4]# vim /etc/redis/6379.conf
sentinel monitor master 192.168.27.132 6379 2 # 末尾添加即可
bind 0.0.0.0 # 默认75行进行修改
daemonize yes # 默认257行进行修改
# 解释
sentinel monitor:哨兵命令
master:主节点名字
192.168.93.27.132 2:主节点IP和端口,最后的2表示,当主节点出现故障,至少需要两个哨兵节点同意,才能判定主节点故障
写入服务脚本
# 仔细观察可以发现ExecStart的执行命令是redis-sentinel(哨兵启动命令)
cat > /etc/systemd/system/redis.service << EOF
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-sentinel /etc/redis/6379.conf
[Install]
WantedBy=multi-user.target
EOF
启动服务
# 启动服务
systemctl daemon-reload
systemctl start redis
systemctl enable redis
# 查看进程
ps -aux | grep redis
root 13230 0.2 0.2 165064 9232 ? Ssl 12:05 0:00 /usr/local/bin/redis-sentinel 0.0.0.0:6379 [sentinel]
root 13255 0.0 0.0 112824 980 pts/1 R+ 12:06 0:00 grep --color=auto redis
查看哨兵状态信息
# 哨兵1
[root@sentinel01 ~]# redis-cli
127.0.0.1:6379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=master,status=ok,address=192.168.27.132:6379,slaves=2,sentinels=3
# 哨兵2
[root@sentinel02 ~]# redis-cli
127.0.0.1:6379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
###############################################################################
master0:name=master,status=ok,address=192.168.27.132:6379,slaves=2,sentinels=3
###############################################################################
# 哨兵3
[root@sentinel03 ~]# redis-cli
127.0.0.1:6379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=master,status=ok,address=192.168.27.132:6379,slaves=2,sentinels=3
哨兵配置完成后会自动添加内容,例如
[root@sentinel01 ~]# tail -9 /etc/redis/6379.conf
user default on nopass ~* &* +@all
sentinel myid 70ffb1f3f2d3e5416e0754a18b87a58d14390081
sentinel config-epoch master 0
sentinel leader-epoch master 0
sentinel current-epoch 0
sentinel known-replica master 192.168.93.106 6379
sentinel known-replica master 192.168.93.105 6379
sentinel known-sentinel master 192.168.93.103 6379 5ad8fc19259b812e91b56ae57fbcd309a0b88c5c
sentinel known-sentinel master 192.168.93.102 6379 746bec065aaae0b1f6b83f0612875cbf0af6b77b
# 其中,myid对应哨兵节点的ID。带有epoch的参数与配置纪元有关(配置纪元是一个从0开始的计数器,每进行一次领导者哨兵选举,都会增加1。领导者哨兵选举在故障切换时适用)。known-replica和known-sentinel显示哨兵已经发现的从节点和其他哨兵节点
模拟故障转移
1.停止master节点服务
#当主节点出现故障时,故障发现和转移是由哨兵来控制的,此时会将主节点切换到其他从节点上
systemctl stop redis
2.在哨兵01节点查看状态就会发现,节点IP会切换到从节点
127.0.0.1:6379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
###############################################################################
master0:name=master,status=ok,address=192.168.27.133:6379,slaves=2,sentinels=3
###############################################################################
3.当主节点进行切换后,一个从节点变成了主节点。此时从节点数量仍然是2,是因为在进行主从切换时,原来的故障的节点会被设置为新主的从节点,哨兵系统并不会对故障节点进行客观下线,而是认为该从节点一致存在。当故障修复之后,将会变为新的从节点投入适用
# 目前作为主节点的节点操作
[root@slave02 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master # 角色变成master
connected_slaves:1 # 因为有一个处于坏的状态,所以此除目前为1
slave0:ip=192.168.27.134,port=6379,state=online,offset=212499,lag=1
master_failover_state:no-failover
master_replid:07998603985d0b656d717d4f37e0bdb02c953982
master_replid2:5e55c3d768b534ecef617403530ee4680c4be1f7
master_repl_offset:212639
second_repl_offset:160901
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:85
repl_backlog_histlen:212555
4.继续使用主节点,验证是否会切换回来
# 继续投入使用
[root@master ~]# systemctl start redis
[root@slave02 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2 # 此时变凉了2个slave了
slave0:ip=192.168.27.134,port=6379,state=online,offset=246920,lag=1
slave1:ip=192.168.27.132,port=6379,state=online,offset=247060,lag=0
master_failover_state:no-failover
master_replid:07998603985d0b656d717d4f37e0bdb02c953982
master_replid2:5e55c3d768b534ecef617403530ee4680c4be1f7
master_repl_offset:247060
second_repl_offset:160901
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:85
repl_backlog_histlen:246976
5.查看哨兵epoch数字
#对于哨兵节点,主要是epoch相关配置的变化,进行一次主从切换,epoch相关的参数都会加1
[root@sentinel01 ~]# tail -9 /etc/redis/6379.conf
user default on nopass ~* &* +@all
sentinel myid 70ffb1f3f2d3e5416e0754a18b87a58d14390081
###############################################################################
sentinel config-epoch master 1
sentinel leader-epoch master 1
sentinel current-epoch 1
###############################################################################
sentinel known-replica master 192.168.93.104 6379
sentinel known-replica master 192.168.93.105 6379
sentinel known-sentinel master 192.168.93.103 6379 5ad8fc19259b812e91b56ae57fbcd309a0b88c5c
sentinel known-sentinel master 192.168.93.102 6379 746bec065aaae0b1f6b83f0612875cbf0af6b77b