跳到主要内容

语法

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.confsentinel monitor 指定的主节点名称(必须匹配)

  • sentinels: 定义多个 Sentinel 服务器的 hostport,以便客户端能够通过任意一个 Sentinel 获取 Redis 主节点信息。

  • password: 如果 Redis 设置了密码,需要提供,否则可以省略。

  • sentinelPassword:如果 Sentinel 本身也设置了密码(requirepass),则需要提供。