语法
2025年02月22日
一、认识
在 ioredis
中,连接 Redis Sentinel
需要提供 Sentinel
服务器列表,以及监控的主节点名称, 并使用 Redis
进行主从复制, 读写分离。ioredis
允许你在 sentinels
配置中指定 role
参数, role: "master"
, 用于写入数据,确保始终连接的是主节点; role: "slave"
, 用于读取数据,连接到从节点,避免主节点压力过大;
当 Redis
主节点发生故障时,Sentinel
会自动将新的主节点 IP
通知 ioredis
,确保客户端始终连接到正确的主节点。
二、实现
const redisMaster = new Redis({
name: "mymaster",
role: "master", // 仅连接到主节点
sentinels: [
{ host: "192.168.1.101", port: 26379 },
{ host: "192.168.1.102", port: 26379 },
{ host: "192.168.1.103", port: 26379 },
]
});
const redisSlave = new Redis({
name: "mymaster",
role: "slave", // 仅连接到从节点
sentinels: [
{ host: "192.168.1.101", port: 26379 },
{ host: "192.168.1.102", port: 26379 },
{ host: "192.168.1.103", port: 26379 },
]
});
redisMaster.on("connect", () => {
console.log("Connected to Redis Sentinel");
});
redisMaster.on("error", (err) => {
console.error("Redis Sentinel error:", err);
});
redisMaster.on("ready", () => {
console.log("Redis connection is ready.");
});
redisSlave.on("connect", () => {
console.log("Connected to Redis Sentinel");
});
redisSlave.on("error", (err) => {
console.error("Redis Sentinel error:", err);
});
redisSlave.on("ready", () => {
console.log("Redis connection is ready.");
});
// 读写分离测试
async function test() {
await redisMaster.set("foo", "bar");
const value = await redisSlave.get("foo");
console.log("Read from slave:", value);
}
test().catch(console.error);
-
name
: 对应sentinel.conf
中sentinel monitor
指定的主节点名称(必须匹配) -
sentinels
: 定义多个Sentinel
服务器的host
和port
,以便客户端能够通过任意一个Sentinel
获取Redis
主节点信息。 -
password
: 如果Redis
设置了密码,需要提供,否则可以省略。 -
sentinelPassword
:如果Sentinel
本身也设置了密码(requirepass
),则需要提供。