一、场景引入
- 我们知道Redis采用高可用架构方案,在Redis进行主从复制时,当主节点宕机时,主从复制不具备自动恢复能力,此时如果还需要进行主从复制,就需要人工过程进行干预,同时还会造成一段时间内服务器会处于一个不可用的状态,同时也会导致安全性也会处于一个不可用的状态。
- 使用了Redis哨兵模式,弥补其主从模式哨兵的不足,Sentinel通过监控Master和Slave,获取Redis服务工作状态是否正常,当主机发生故障时,Sentinel会自动进行故障转移,将监控的从机提升为主服务器(Master),从而保证系统可用性。
- 哨兵(Sentinel)即是一个分布式系统,当一个架构中运行多个哨兵Sentinel进程,这些的进程之间使用协议gossipprotocols, 接收Master下线信息,并根据投票协议来决定故障的转移,从而决定哪个slave作为新的Master。
- 每个哨兵会定时向其他哨兵(Sentinel)、Master、Slave发生定时消息以确认是否存活,如果发现其在指定时间内未回应,即认为对方机器已经挂了,主观认为其宕机了(sdown).
- 虽然哨兵作为一个单独的可执行文件Redis-Sentinel,但实际上他是一个运行在Redis上的特殊配置服务,通过--Sentinel来启动哨兵
二、Sentinel工作原理
Sentinel服务启动之后,会先读取到Sentinel.conf主配置文件,并通过文件Sentinel monitor主配置文件信息指定要监控的Master机器,为了考虑到主库的IP和端口故障切换变化,所以尽量用IP和端口表示这个库,从而让一个哨兵监控多个主从网状系统。
Sentinel与监控主机建立连接之后,Sentinel会定时执行以下操作:
- 每10s会向Master数据库和从数据库发送INFO命令
- 每隔1s向Master、slave其他哨兵节点发送PING命令
- Sentinel启动后,向主库发送INFO命令使得Sentinel可以获取当前主库的相关信息
三、主要功能
- 集群监控:监控Redis的Master和Slave状态
- 消息通知:如果Redis实例出现故障,那么哨兵信息报警发给管理员
- 故障转移:Master节点出现故障时,会自动转移到slave上
- 配置中心:配置出现故障时,会通知client客户端新的Master地址
sdown与odown区别和差异:sdown针对Redis实例做出单个下线状态判断,而odown是单个Sentinel向另一个Sentinel发送消息通知Master已经down掉了,那么即可认为此时状态是odown状态了。
四、Sentinel实战
redis哨兵环境部署
Redis哨兵:10.0.0.8
Redis主库:10.0.0.6
Redis从库:10.0.0.7
yum源安装redis服务
1.Redis哨兵服务启动
/usr/bin/redis-sentinel /etc/redis-sentinel.conf
2.备份一份Redis-sentinel.conf目录
cp /etc/redis-sentinel.conf /tmp/
3.去掉配置文件空行
grep -v "^#" /etc/redis-sentinel.conf | grep -v "^$"
配置文件修改部分详解
重启Sentinel哨兵服务
/usr/bin/redis-sentinel /etc/redis-sentinel.conf
检查进程和端口的使用情况
ps -ef | grep redis
netstat -tnlp | grep 26379
查看哨兵日志
more /var/log/redis/sentinel.log
哨兵集群中出现Redis中master服务宕机,通过选举机制转移了
通过检查哨兵配置文件发现只修改了哨兵配置文件,但是主从配置中的replicaof不会改变。
但如果说重启了redis服务,那么将会导致出现主从配置连接异常情况(建议使用源码编译安装)
软件包源码安装
- Redis软件编译安装
## 下载redis安装包
wget http://download.redis.io/releases/redis-6.2.7.tar.gz
## 解压并进行预编译操作
yum -y install tar
tar zxf redis-6.2.7.tar.gz
cd redis-6.2.7/
yum -y install jemalloc jemalloc-devel
yum -y install gcc
# 假设已下载并解压 redis-7.0.12.tar.gz
cd redis-7.0.12
yum -y install make
make distclean # 清理
make -j$(nproc) # 编译
make PREFIX=/usr/local/redis install # 安装到指定目录
cp sentinel.conf /usr/local/redis/
- 生效环境变量(/etc/profile)
echo "export PATH=/usr/local/redis/bin:$PATH" >> /etc/profile
- 确定其版本是否一致
/usr/local/redis/bin/redis-server --version
Redis server v=6.2.7 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=fec0b680d2210c
- 替换源文件删除空行和包含#号行的内容
sed -i -e '/#/d' -e '/^$/d' sentinel.conf
- 完成sentinel.conf和redis.conf配置修改
## 源码安装的启动目录
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf
nohup/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &
- 通过源码编译方式完成了一主两从服务的搭建
- 检查哨兵是否能更改主从配置节点信息