简介
哨兵:Sentinel,一个独立运行的进程,监控主从机器,在故障时自动转移。
用途:让redis宕机后可以自动进行故障转移。用有一个或多个哨兵组成哨兵系统,来监视任意数量服务器(包括主机和主机下属的从机),并在被监视的主机故障下线时,自动将主机下的从机升级为主机。
分类:
- 单机哨兵
- 多哨兵
单哨兵工作过程:
哨兵发送命令给各个服务器
各个服务器响应并返回运行状态给哨兵
哨兵发现主机宕机,
- 就自动将slave切换成master
- 通过发布订阅模式告知其他服务器,修改配置文件,切换主机。
多哨兵模式:
- 使用多个哨兵监控服务器。
- 且各哨兵之间相互监控。
- 一般是3个及以上。
多哨兵工作、故障切换:
- 主服务器宕机,哨兵1先检测到,但系统并不会马上进行failover过程,这是因为仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。
- 当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。
- 切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。
哨兵结构
类型 | ip地址 | 端口 |
---|---|---|
redis服务器(主机) | A | p1 |
redis服务器(备机) | B | p1 |
哨兵1 | A | p2 |
哨兵2 | B | p2 |
首先,建立主备关系,确认从机隶属的主机。
其次,建立哨兵,确认哨兵监听的主机。
这样,当哨兵监听的主机下线时,会自动获取主机下的从机作为主机。
配置服务器
修改redis.conf文件。
主机
1 | 开启保护模式 |
从机
从机,比主机,多一个slaveof的配置和密码。
1 | protected-mode yes |
查看redis版本
./redis-server –version
./redis-server -v
./redis-cli –version
./redis-cli -v
配置哨兵
cd /app/redis/bin
,发现有可执行文件 redis-sentinel
。
cd /app/redis/conf
,手动增加并修改sentinel.conf
文件。
多个哨兵分布在不同服务器上,sentinel.conf 相同。(也可多个哨兵分布在同一个服务器,端口不同)
复制到其他服务器 scp sentinel.conf 用户名@ip地址:/app/redis/conf/sentinel.conf
1 | daemonize yes |
启动并验证
配置和启动时候,一定要注意用户是否有权限启动,比如chmod 775 bin
/ chown want.want dump.rdb
。
如果启动不成功,需要查看日志原因 tailf -n 100 /app/redis/log/redis.log
。
1 | cd /app/redis/bin |
主从验证
1 | ./redis-cli -h localhost -p 6379 -a 密码 |
主从恢复
SLAVEOF,用于在 Redis 运行时,动态地修改复制(replication)功能的行为。
- SLAVEOF host port : 将当前服务器(无论从、主),变为指定服务器host:port的从机。
- 如果当前机器本是A主机的从机,那会变成指定的host:port主机的从机。当前机器【会丢弃】从A同步的数据集,全新同步新主机的数据。
- 如果当前机器本是主机,那会变成指定的host:port主机的从机。当前机器【会丢弃】原来的数据集,全新同步新主机的数据。
- SLAVEOF NO ONE:将从机变为主机,且【不丢弃】原来同步的数据集。【故而主机故障时,从机变为主机,数据不丢失,实现了无间断运行】
1 | 当Redis运行时,突然主机故障,可以使用`SLAVEOF`命令,手动重设主备关系(而不需要重启redis)。 |
读写分离验证
仅主机能写入,但都能读到
1 | 查看当前所有key |
哨兵验证
当主机A故障,从机B成为主机,此时主机A又恢复了,B仍然是主机,而不被A抢回。
哨兵信息查看
哨兵节点本质上是一个特殊的Redis节点,可以通过redis-cli查询相关信息。
1 | ./redis-cli -h 127.0.0.1 -p 26379 info Sentinel |
验证哨兵自动恢复
- 启动所有redis
启动所有哨兵 - 查看哨兵日志
查看主机/从机的状态 info replication - kill -9 主机进程ID
- 查看哨兵日志
查看主机/从机的状态 info replication,发现重新选举了主机。
哨兵日志
跟踪日志: tailf -n 100 /app/redis/log
日志内容:
- sdown:主观宕机,一个哨兵,ping一个主机超时了,这个哨兵自己就主观认为宕机了。
- odown:客观宕机,一个哨兵在一定时间内,收到了满足一定数量的哨兵的消息,大家都觉得主机宕机了。
- new-epoch: 标注版本号
- try-failover:达到故障转移条件,发起转移,开始等待其他哨兵的选举(只有发起哨兵有这个)
- vote-for-leader: 所有哨兵投票
- selected-slave:选出一个备机当新主机
- switch-master apnmaster:进行身份切换
- convert-to-slave slave:进行身份切换
- failover-end:故障转移完成
spring boot中使用哨兵模式
maven依赖
1 | <dependency> |
原理性程序
1 | public void testSentinel() { |
springboot调用
application.properties
增加spring.redis.sentinel
相关配置
1 | #spring.redis.host=10.14.6.121 # 单机模式才需要 |
方式1:springboot java 程序
读取application.properties
1 | "redis") (prefix = |
程序调用
1 | public class RedisClientAutoConfiguration { |
方式2:springboot xml程序
1 | <!-- pool注册到代码中使用,RedisCache参见下文 --> |
使用示例
1 |
|
RedisCache封装常见redis操作
1 | public interface ICache { |
1 | public class RedisCache implements ICache { |