阿里云云数据库 Redis 配置主从复制和哨兵模式,实现高可用方案,步骤如下:
一、主从复制配置 👯
-
创建 Redis 实例(主节点)
- 登录阿里云控制台,进入云数据库 Redis 版。
- 选择地域,点击“创建实例”。
- 选择“标准版”或“集群版”(主从复制适用于标准版,集群版本身具有数据分片和高可用特性)。
- 配置实例规格(内存、CPU等),网络类型(VPC),设置密码等。
- 确认配置,完成创建。
-
创建 Redis 实例(从节点)
- 按照创建主节点的步骤,再次创建一个或多个 Redis 实例作为从节点。 ⚠️ 注意:确保从节点与主节点在同一 VPC 下,以便网络互通。
-
配置主从关系
- 登录阿里云控制台,进入主 Redis 实例的管理页面。
- 在“数据安全”或“备份恢复”等相关选项卡下,找到“只读实例”或“添加只读实例”等功能。 (不同版本的控制台页面布局可能略有不同)
- 点击“添加只读实例”或类似按钮,选择要作为从节点的 Redis 实例。
- 系统会自动建立主从复制关系。
-
验证主从复制
- 连接到主 Redis 实例,写入一些数据。
- 连接到从 Redis 实例,读取这些数据,确认数据已同步。 🥳
- 或者,在主节点执行
INFO replication 命令,查看 role:master 和 connected_slaves 信息。在从节点执行同样的命令,查看 role:slave 和 master_host, master_port, master_link_status 信息。
二、哨兵模式配置 💂
-
创建 Redis 实例(哨兵节点)
- 在阿里云控制台中,创建多个 Redis 实例作为哨兵节点。 至少需要 3 个哨兵节点,以保证多数派原则,避免脑裂。 🧠
- 哨兵节点也需要选择“标准版”或“集群版”,但它们主要用于监控,因此配置可以适当降低。
- 同样,确保哨兵节点与主从节点在同一 VPC 下。
-
配置哨兵
- 登录阿里云控制台,进入每个哨兵 Redis 实例的管理页面。
- 找到“配置文件”或“自定义参数”等选项卡。
- 修改
redis.conf 文件(或者在自定义参数中设置):
sentinel monitor <master-name> <master-ip> <master-port> <quorum> (<master-name> 是你给主节点起的名字,例如 mymaster。<master-ip> 和 <master-port> 是主节点的 IP 地址和端口。 <quorum> 是判断主节点失效所需的哨兵数量,通常设置为哨兵总数的一半加一。 例如,3 个哨兵,则 <quorum> 为 2。)
sentinel down-after-milliseconds <master-name> <milliseconds> (指定哨兵认为主节点失效的超时时间,单位为毫秒。 建议设置为 5000-10000。)
sentinel failover-timeout <master-name> <milliseconds> (故障转移的超时时间,单位为毫秒。)
sentinel parallel-syncs <master-name> <numslaves> (指定在故障转移期间,可以同时进行同步的从节点数量。)
- `sentinel auth-pass `(如果主节点设置了密码,需要配置此项,将密码配置到sentinel中)
- 保存配置并重启哨兵节点。
-
验证哨兵模式
- 模拟主节点故障(例如,停止主 Redis 实例)。 💀
- 观察哨兵节点的日志,确认它们检测到主节点失效,并选举出一个新的主节点。
- 连接到哨兵节点,使用
SENTINEL get-master-addr-by-name <master-name> 命令获取当前主节点的地址。
- 连接到新的主节点,验证数据是否已同步。 👌
三、客户端配置 💻
-
连接哨兵
- 在你的应用程序中,配置 Redis 客户端连接到哨兵节点,而不是直接连接到主节点。
- 客户端需要支持哨兵模式,并能自动发现当前的主节点。
- 常见的 Redis 客户端库(如 Jedis, Lettuce, Redisson 等)都支持哨兵模式。
-
连接参数
- 指定多个哨兵节点的地址和端口。
- 指定主节点的名称(在哨兵配置中设置的
<master-name>)。
- 如果 Redis 实例设置了密码,需要提供密码。
-
示例代码(Java, 使用 Jedis)
JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster",
new HashSet<String>(Arrays.asList("sentinel1:26379", "sentinel2:26379", "sentinel3:26379")),
"password"); // 如果没有密码,则留空
try (Jedis jedis = sentinelPool.getResource()) {
jedis.set("foo", "bar");
String value = jedis.get("foo");
System.out.println(value);
} finally {
// sentinelPool.close(); // 在程序结束时关闭连接池
}
注意事项 💡
- 网络隔离: 确保所有 Redis 实例(主节点、从节点、哨兵节点)都在同一个 VPC 下,并且安全组规则允许它们之间的网络通信。
- 资源规划: 根据业务需求,合理规划 Redis 实例的规格和数量。
- 监控告警: 配置完善的监控告警机制,及时发现和处理 Redis 实例的故障。 🚨
- 持久化: 开启 Redis 的持久化功能(RDB 或 AOF),防止数据丢失。
- 密码保护: 为 Redis 实例设置密码,增强安全性。 🔒
- 版本兼容:确保所有Redis实例(包括主节点、从节点和哨兵节点)的版本兼容。 版本不兼容可能导致复制错误或哨兵无法正常工作。
通过以上步骤,你就可以在阿里云云数据库 Redis 上配置主从复制和哨兵模式,实现高可用架构。 🎉