redis哨兵
setinel介绍
redis的主从模式下.主节点一旦发生故障不能提供服务,需要人工预收,将从节点晋升为主节点,同时还需要修改客户端配置.对于很多应用场景这种方式无法接受.
sentinel(哨兵)架构解构了redis主从人工干预的问题.
redis sentinel是redis的高可用实现方案,实际生产环境中,对提高整个系统可用性非常有帮助的.
哨兵主要功能
redis sentinel是一个分布式系统, redis sentinel为redis提供高可用性,可以在没有人干预的情况下组织某种类型的故障.
redis的sentinel系统用于管理多个redis服务器(instance)该系统执行以下三干任务:
1.监控(monitoring):
sentinel会不断地定期检查你的主服务器和从服务器是否运作正常
2.提醒(Notification)
当被监控的某个redis服务器出现问题时,sentinel可以通过API向管理员或者其他应用程序发生通知.
3.自动故障迁移(Automaticfailover)
当一个主服务器不能正常工作时,sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器,当客户端试图链接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器
部署哨兵
主机规划
角色 | IP | 端口 |
---|---|---|
master/sentinel-01 | 172.16.210.53 | 6379/26379 |
slaversentinel-02 | 172.16.210.54 | 6379/26379 |
slaver/sentinel-03 | 172.16.210.55 | 6379/26379 |
1.准备三台安装安装有redis的主机
1.在master节点编写hosts文件
[root@db01 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
db01 172.16.210.53
db02 172.16.210.54
db03 172.16.210.55
2.创建相关目录
[root@db01 ~]# mkdir -p /data/soft ##创建软件存放目录
[root@db01 ~]# mkdir -p /data/redis_cluster/redis_6379 ##创建数据存放目录
[root@db01 ~]# mkdir -p /data/redis_cluster/redis_6379 ##创建数据存放目录
[root@db01 ~]# mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs} ##创建redis相关信息目录
3.获取安装包并编译
[root@db01 ~]# cd /data/soft/
[root@db01 soft]# wget http://download.redis.io/releases/redis-3.2.9.tar.gz ##获取redis 的安装包
--2020-06-12 17:08:03-- http://download.redis.io/releases/redis-3.2.9.tar.gz
正在解析主机 download.redis.io (download.redis.io)... 109.74.203.151
正在连接 download.redis.io (download.redis.io)|109.74.203.151|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 302 Found
位置:http://117.128.6.28/cache/download.redis.io/releases/redis-3.2.9.tar.gz?ich_args2=528-12170713052158_fcf495896a00289755434f539a1a387e_10001002_9c896d2ddec6f3d9943e518939a83798_c4d476f5af6cd0116d51bd1ef853167b [跟随至新的 URL]
--2020-06-12 17:08:04-- http://117.128.6.28/cache/download.redis.io/releases/redis-3.2.9.tar.gz?ich_args2=528-12170713052158_fcf495896a00289755434f539a1a387e_10001002_9c896d2ddec6f3d9943e518939a83798_c4d476f5af6cd0116d51bd1ef853167b
正在连接 117.128.6.28:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1547695 (1.5M) [application/x-gzip]
正在保存至: “redis-3.2.9.tar.gz”
100%[==============================================>] 1,547,695 1.06MB/s 用时 1.4s
2020-06-12 17:08:05 (1.06 MB/s) - 已保存 “redis-3.2.9.tar.gz” [1547695/1547695])
[root@db01 soft]# tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/ ##解压安装包到指定目录
[root@db01 soft]# cd /opt/redis_cluster/
[root@db01 redis_cluster]# ln -s redis-3.2.9 redis ##创建一个软链接
[root@db01 redis_cluster]# cd redis
[root@db01 redis]# make install ##开始编译安装
4.编辑配置文件
[root@db01 redis]# cat /opt/redis_cluster/redis_6379/conf//redis_6379.conf
## 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 172.16.210.53
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump,rdb
##15分钟内,有1个key发生改变,就会执行bgasave命令
save 900 1
#5分钟内,有10个key发生改变,就会执行bgasave命令
save 300 10
#1分钟内,有10000个key发生改变,就会执行bgasave命令
save 60 10000
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
5.打包配置文件再传给其他主机
[root@db01~]# cd /opt/
[root@db01 opt]# tar zcvf db01.tar * ##打包redis的软件目录
[root@db01 opt]# scp db01.tar 172.16.210.54:/opt ##把打包好的redis软件目录传给从库主机的opt目录
[root@db01 opt]# scp db01.tar 172.16.210.55:/opt ##把打包好的redis软件目录传给从库主机的opt目录
6.两台从库安装redis
在54和55两台主机操作
cd /opt/ ##进入opt目录
tar tar -xzvf db01.tar ##把master主机传过来的压缩目录解压
cd redis_cluster/redis ##进入redis目录
make install ##开始编译
mkdir /data/redis_cluster/redis_6379/ -p ##创建数据目录
7.修改配置文件的监听地址
在54主机操作
sed -i 's#bind 172.16.210.53#bind 172.16.210.54#g' /opt/redis_cluster/redis_6379/conf/redis_6379.conf ##修改监听端口为sentinel-02的ip地址
在55主机操作
sed -i 's#bind 172.16.210.53#bind 172.16.210.55#g' /opt/redis_cluster/redis_6379/conf/redis_6379.conf ##修改监听端口为sentinel-02的ip地址
8.启动redis并连接测试
在3台主机操作
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf ### 启 动redis
redis-cli -h 172.16.210.53 ##连接53主机的redis
redis-cli -h 172.16.210.54 ##连接54主机的redis
redis-cli -h 172.16.210.55 ##连接55主机的redis
此时,3台主机的redis已经部署完成
2.创建redis哨兵相关的配置文件
在主机53上操作
[root@db01 ~]# mkdir -p /data/redis_cluster/redis_26379 ##创建数据目录
[root@db01 ~]# mkdir -p /opt/redis_cluster/redis_26379 ##
[root@db01 ~]# mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
[root@db01 ~]# vim /opt/redis_cluster/redis_26379/conf/redis_26379.conf
bind 172.16.210.53
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379
sentinel monitor mymaster 172.16.210.53 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000
[root@db01 ~]# rsync -avz /opt/* 172.16.210.54:/opt ##将配置文件数据同步到第二台主机
[root@db01 ~]# rsync -avz /opt/* 172.16.210.55:/opt ##将配置文件数据同步到第三台主机
在主机54上操作
[root@db02 ~]# sed -i 's#bind 172.16.210.53#bind 172.16.210.54#g' /opt/redis_cluster/redis_6379/conf/redis_6379.conf ##修改监听地址为54主机的ip地址
[root@db02 ~]# sed -i 's#bind 172.16.210.53#bind 172.16.210.54#g' /opt/redis_cluster/redis_26379/conf/redis_26379.conf ##修改监听地址为54主机的ip地址
[root@db02 ~]# echo "slaveof 172.16.210.53 6379" >> /opt/redis_cluster/redis_6379/conf/redis_6379.conf ##把同步53节点的命令写入配置文件里
在sentinel-03(55)上操作
[root@db03 redis]# mkdir -p /data/redis_cluster/redis_26379 ##创建数据目录
[root@db03 redis]# sed -i 's#bind 172.16.210.53#bind 172.16.210.55#g' /opt/redis_cluster/redis_6379/conf/redis_6379.conf ##修改监听地址为55主机的ip地址
[root@db03 redis]# sed -i 's#bind 172.16.210.53#bind 172.16.210.55#g' /opt/redis_cluster/redis_26379/conf/redis_26379.conf ##修改监听地址为55主机的ip地址
[root@db03 redis]# echo "slaveof 172.16.210.53 6379" >> /opt/redis_cluster/redis_6379/conf/redis_6379.conf ##把同步53节点的命令写入配置文件里
配置文件详解
sentinel monitor mymaster 172.16.210.53 6379 2
##mymaster 主节点别名 主节点 ip 和端口,判断主节点失败,两个sentinel节点同意
sentinel down-after-milliseconds mymaster 3000
##选项指定了sentinel认为服务器已经断线所需的毫秒数
sentinel parallel-syncs mymaster 1
##向新的主节点发起复制操作的从节点个数,1轮循发起复制
sentinel failover-timeout mymaster 18000
##故障转移超时时间
3.启动redis和redis哨兵
在三台主机操作
pkill redis ##关闭和redis有关的进程
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf ##启动redis
redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf ##启动哨兵
检查三台主机的redis和哨兵都是否正常启动
在三台主机检查
[root@db01 ~]# ps -ef |grep redis
root 2865 1 0 20:06 ? 00:00:00 redis-server 172.16.210.53:6379
root 2886 1 0 20:08 ? 00:00:00 redis-sentinel 172.16.210.53:26379 [sentinel]
root 2890 2145 0 20:08 pts/0 00:00:00 grep --color=auto redis
redis和redis哨兵都正常启动
注意
[root@db01 ~]# cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf
bind 172.16.210.53
port 26379
daemonize yes
logfile "/opt/redis_cluster/redis_26379/logs/redis_26379.log"
dir "/data/redis_cluster/redis_26379"
sentinel myid 7661e27af1c8737f068456604e665b2193f9b38b
sentinel monitor mymaster 172.16.210.53 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 18000
# Generated by CONFIG REWRITE
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-sentinel mymaster 172.16.210.55 26379 9636d32c6e8187d7c96b9f8275f2ccdcc1c1c8f8
sentinel known-sentinel mymaster 172.16.210.54 26379 bb7728148e8515beda9972413c9a981569af9890
sentinel current-epoch 1
当所有节点启动后,配置文件的内容发生了变化,体现在三个方面
- sentinel节点自动发现了从节点.
- 去掉了默认配置,例如parallel-syncs failover-timeout参数
- 添加了配置纪元相关参数
4.哨兵常用操作
[root@db01 ~]# redis-cli -h 172.16.210.53 -p 26379 ##连接哨兵
172.16.210.53:26379> INFO sentinel ##获取当前哨兵的信息
172.16.210.53:26379> sentinel masters ##获取组的信息
172.16.210.53:26379> sentinel master mymaster ##获取mymaster组的master信息
172.16.210.53:26379> sentinel slaves mymaster ##获取mymaster组的slaver信息
5.故障模拟演练
在53节点操作
[root@db01 ~]# pkill redis ##把主节点的redis关闭
此时查看54节点的哨兵配置文件
[root@db02 ~]# cat /opt/redis_cluster/redis_6379/conf/redis_6379.conf
sentinel monitor mymaster 172.16.210.55 6379 2 ##发现主节点就已经切换成了55节点
再查看55节点的哨兵配置文件
[root@db03 redis]# cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf
sentinel monitor mymaster 172.16.210.55 6379 2
验证:
[root@db03 redis]# redis-cli -h 172.16.210.55 -p 26379 ##登录55主节点
172.16.210.55:26379> sentinel get-master-addr-by-name mymaster
1) "172.16.210.55" ##可以看到master节点已经变成53了
2) "6379"
[root@db03 redis]# redis-cli -h 172.16.210.55 ##登录redis
172.16.210.55:6379> set k1 v1
OK ##也可以写入数据
在54从节点验证
[root@db02 ~]# redis-cli -h 172.16.210.54
172.16.210.54:6379> set k2 v2
(error) READONLY You can't write against a read only slave. ##因为是从节点,所以是不能写数据的
172.16.210.54:6379> get k1
"v1" ##但是可以查看数据
故障修复
重启53节点的redis和哨兵
[root@db01 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@db01 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf
验证:
[root@db01 ~]# redis-cli -h 172.16.210.53 ##连接53的redis
172.16.210.53:6379> GET k1
"v1" ##可以查看数据
172.16.210.53:6379> set k2 v2
(error) READONLY You can't write against a read only slave. ##但不能插入数据,所以此时的53节点就已经变为从库
修改优先级
现在的主从切换是哨兵通过选举选出来的主节点,我们可以通过修改优先级,来自定义故障后的主节点.
查看每个节点的优先级
[root@db01 ~]# redis-cli -h 172.16.210.53
172.16.210.53:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100"
[root@db02 ~]# redis-cli -h 172.16.210.54
172.16.210.54:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100"
[root@db03 redis]# redis-cli -h 172.16.210.55
172.16.210.55:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100"
三台主机默认的优先级都是是100
设置优先级
将53主机的优先级调高
[root@db01 ~]# redis-cli -h 172.16.210.53
172.16.210.55:6379> CONFIG SET slave-priority 150
OK ##修改优先级为150
172.16.210.55:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "150" ##查看优先级,修改成功
强制发生重新选举
[root@db01 ~]# redis-cli -h 172.16.210.53 -p 26379 ##连接53主机的哨兵
172.16.210.53:26379> sentinel failover mymaster
OK ##重新选举成功
172.16.210.53:26379> sentinel get-master-addr-by-name mymaster
1) "172.16.210.53" ##查看当前主节点地址为53,证明已经重新选举成功
2) "6379"
把优先级还原
如果不是特别需要指定那台主机做主节点,所以推荐3台主机的优先级一样
[root@db01 ~]# redis-cli -h 172.16.210.53
172.16.210.53:6379> CONFIG SET slave-priority 100
OK ##修改回100成功
172.16.210.53:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100" ##当前权重值回到100