Nodejs对接redis sentinel

注:该文档的实验环境基于《redis高可用方案redis sentinel的介绍和实践》搭建,如有疑问详见上述文档

本文档是对《redis高可用方案redis sentinel的介绍和实践》的一些补充,主要说明使用nodejs来对接redis sentinel,以及进行简单的容灾实验测试。

redis-sentinel对接

nodejs对接redis sentinel使用到的库是redis-sentinel,使用的详情如下

const sentinel = require('redis-sentinel');
const sentinels = [ // 哨兵节点的地址与端口集合
  { host: '172.17.0.1', port: 26380 },
  { host: '172.17.0.1', port: 26381 },
  { host: '172.17.0.1', port: 26382 },
]
const masterName = 'master'; // master节点的名字
const opts = { // node_redis的相关属性设置
  auth_pass: 'password', // 在版本较低的node_redis中使用auth_password作为密码,redis-sentinel及时属于版本较低的node_redis
  // password: 'password', // 在版本高的node_redis中的密码属性
  db: 0, // 如果设置,客户端将在连接上运行Redis select命令。
};

// 创建redisClient实例
const redisClient = sentinel.createClient(sentinels, masterName, opts);

redisClient.set('testName', 'lxjTest1');

实验

正常情况下读写操作

不出所料的读写操作正常,主节点和分支节点都能正确的查询到设置的值。

关闭master节点之后的读写操作

将master节点停掉之后,写入失败,获取不到信息

127.0.0.1:6382> get testName
(nil)

大约20-30秒之后,nodejs程序在控制台打出

Received +switch-master message from Redis Sentinel.  Reconnecting clients.

表示redis主从节点切换成功,此时通过slave-1和slave-2均能查到插入信息。通过命令行查看节点的状态,发现端口为6082的redis变成了master节点。

127.0.0.1:6382> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.17.0.1,port=6381,state=online,offset=1543804,lag=1

恢复关闭节点继续读写操作

将关闭的docker容器重新启动,待状态显示已经连上去之后继续进行模拟读写请求,结果也没有出人意表,可以正常进行读写操作。

127.0.0.1:6382> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.1,port=6381,state=online,offset=1576998,lag=1
slave1:ip=172.17.0.1,port=6380,state=online,offset=1576998,lag=1

仅剩一个节点的读写操作

使用docker命令关闭节点,在关闭节点过程中先关闭了一个slave节点,服务器控制台没有任何异常,读写操作正常。

当剩下两个节点的时候,尝试关闭当时的master节点。此时的情况与关闭主节点之后的读写操作一个情况。在大约20-30秒之后,nodejs程序在控制台打出

Received +switch-master message from Redis Sentinel.  Reconnecting clients.

表示redis主从节点切换成功,此时读写操作正常进行。

结论

redis sentinel主从节点在不全部挂掉的情况下,不会影响整个系统的正常运行。但是主节点挂掉会导致服务器处于十几秒的无法正常操作状态,从节点则不影响。