redis学习-哨兵

redis哨兵作用

监控主从节点状态,主节点出问题后自动切换从节点为主节点,保证主节点的高可用,自动化的故障恢复

主从配置

配置环境:

1
2
3
4
5
6
主节点   127.0.0.1 6000
从节点 127.0.0.1 6001
从节点 127.0.0.1 6002
哨兵节点 127.0.0.1 7000
哨兵节点 127.0.0.1 7001
哨兵节点 127.0.0.1 7002

哨兵节点配置如下:

1
2
port 7000
sentinel monitor masternode 127.0.0.1 6000 2

其中7000为哨兵的通信端口,masternode为主节点名称,127.0.0.1 6000为初始主节点的ip和端口,2代表至少有两个哨兵节点判定主节点故障,才能进行故障转移。一个哨兵节点可以监控多个主节点,只需要配置多行即可。注意:哨兵节点启动成功后配置文件会自动修改;配置的主节点IP应该使用应用可访问到的IP,因为哨兵只做主节点的配置发现不做代理。

故障恢复过程

  • 发现故障

通过定时任务,哨兵发现主节点没有响应,将主节点标为主观下线

  • 确认故障

哨兵发送命令给其他哨兵,如果判定主节点故障的哨兵个数达到配置值,则将主节点标记为客观下线。

  • 选举哨兵leader

标记主节点为客观下线的哨兵A,向其他哨兵节点发送命令,要求对方选举自己为哨兵leader,目标哨兵如果没有答应过其他哨兵为leader,则会同意哨兵A为leader,超过半数的哨兵同意后,哨兵A成为哨兵leader

  • 选择主节点

哨兵leader负责挑选主节点,规则如下:先按从节点优先级判定,优先级一致则选择同步偏移量最大的从节点,如果还一致,则选择ID较小的从节点。

  • 修改主从配置

哨兵leader给选定的从节点发送 slaveof none one 命令,从节点变为主节点,给其他从节点发送 slaveof 命令使其成为新的主节点的从节点,其他从节点修改主节点后开始同步数据。旧的主节点标记为新的主节点的从节点,如果旧的主节点再次上线,将成为从节点。

应用使用

1
2
3
4
5
6
7
8
9
10
11
12
const Redis = require('ioredis');

const redis = new Redis({
sentinels: [{ host: '127.0.0.1', port: 7000 }, { host: '127.0.0.1', port: 7001 }, { host: '127.0.0.1', port: 7002 }],
name: 'masternode'
});

setInterval(async () => {
const result = await redis.info('Replication');
console.log('-----------------------------------');
console.log(result);
}, 2000);

哨兵部署好之后,通过以上代码不断查询节点信息,在主节点故障后,连接会有短时间无法连接错误,应用暂不可用,等待哨兵重新选定主节点后,应用即可恢复。

参考

深入学习Redis(4):哨兵