Replication高可用
本课程将深入讲解主从复制的核心概念和实践应用。主要内容包括:REPLICAOF、Sentinel、读写分离、故障转移。
Redis的主从复制是非常重要的功能模块,在实际开发中有广泛的应用。通过本课程的学习,你将全面掌握主从复制的使用技巧。
Redis主从复制是一种数据同步机制,允许将一个Redis服务器(主节点)的数据复制到多个Redis服务器(从节点)。
# 在从节点上执行
REPLICAOF master_ip master_port
# 或 Redis 5.0之前的版本使用
SLAVEOF master_ip master_port
# 示例:将当前Redis实例设置为192.168.1.100:6379的从节点
REPLICAOF 192.168.1.100 6379
# 返回: OK
# 取消从节点身份
REPLICAOF no one
# 返回: OK
# 实际应用:临时设置从节点
# 在从节点redis-cli中执行
REPLICAOF 10.0.0.1 6379
# redis.conf中的主从复制配置
# 从节点配置
replicaof 192.168.1.100 6379
# 从节点只读模式
replica-read-only yes
# 复制超时时间
repl-timeout 60
# 复制缓冲区大小
repl-backlog-size 1mb
# 复制缓冲区保留时间
repl-backlog-ttl 3600
# 最小从节点数量(用于哨兵模式)
min-replicas-to-write 3
min-replicas-max-lag 10
# 主节点密码(如果主节点有密码)
masterauth your_master_password
# 实际应用:生产环境配置
# 在从节点的redis.conf中添加
replicaof 10.0.0.1 6379
replica-read-only yes
masterauth my_secure_password
repl-timeout 180
当从节点首次连接主节点时,会执行全量复制:
全量复制完成后,主节点会将后续的写操作实时同步给从节点:
主节点和从节点都维护一个复制偏移量,用于跟踪数据同步进度:
# 查看主节点复制信息
INFO replication
# 查看master_repl_offset字段
# 查看从节点复制信息
INFO replication
# 查看slave_repl_offset字段
# 示例输出(从节点)
# replication:
# role:slave
# master_host:192.168.1.100
# master_port:6379
# master_link_status:up
# master_last_io_seconds_ago:1
# master_sync_in_progress:0
# slave_repl_offset:12345
# slave_priority:100
# slave_read_only:1
# 示例:Java客户端实现读写分离
// 主节点连接
Jedis masterJedis = new Jedis("192.168.1.100", 6379);
// 从节点连接
List<Jedis> slaveJedisList = new ArrayList<>();
slaveJedisList.add(new Jedis("192.168.1.101", 6379));
slaveJedisList.add(new Jedis("192.168.1.102", 6379));
// 写操作 - 使用主节点
public void set(String key, String value) {
masterJedis.set(key, value);
}
// 读操作 - 使用从节点(轮询或随机)
private int slaveIndex = 0;
public String get(String key) {
Jedis slaveJedis = slaveJedisList.get(slaveIndex);
slaveIndex = (slaveIndex + 1) % slaveJedisList.size();
return slaveJedis.get(key);
}
# 实际应用:使用Redis客户端库的内置读写分离功能
# 如Spring Data Redis、JedisCluster等
Redis Sentinel是一个分布式系统,用于监控Redis主从集群的健康状态,并在主节点故障时自动执行故障转移。
# sentinel.conf配置文件
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
# 配置说明:
# monitor <master-name> <ip> <port> <quorum>
# down-after-milliseconds <master-name> <milliseconds>
# failover-timeout <master-name> <milliseconds>
# parallel-syncs <master-name> <numslaves>
# 启动哨兵
redis-sentinel sentinel.conf
# 或
redis-server sentinel.conf --sentinel
# 示例:Java客户端连接哨兵
Set<String> sentinelSet = new HashSet<>();
sentinelSet.add("192.168.1.100:26379");
sentinelSet.add("192.168.1.101:26379");
sentinelSet.add("192.168.1.102:26379");
JedisSentinelPool pool = new JedisSentinelPool(
"mymaster", // 主节点名称
sentinelSet, // 哨兵地址列表
new JedisPoolConfig(),
10000, // 连接超时
"password" // 密码
);
// 获取连接
Jedis jedis = pool.getResource();
try {
jedis.set("key", "value");
String value = jedis.get("key");
} finally {
jedis.close();
}
# 实际应用:使用支持哨兵的Redis客户端库
# 架构:1主2从1哨兵
# 主节点:处理写请求
# 从节点:处理读请求
# 哨兵:监控集群状态,执行故障转移
# 配置示例:
# 主节点 redis.conf
# 无需特殊配置
# 从节点1 redis.conf
replicaof 192.168.1.100 6379
replica-read-only yes
# 从节点2 redis.conf
replicaof 192.168.1.100 6379
replica-read-only yes
# 哨兵 sentinel.conf
sentinel monitor mymaster 192.168.1.100 6379 2
# 架构:1主3从3哨兵
# 要求:高可用性,数据一致性
# 配置要点:
# 主节点:开启AOF持久化
appendonly yes
appendfsync everysec
# 从节点:设置较高的优先级
replica-priority 100
# 哨兵:更严格的监控配置
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
# 架构:1主4从2哨兵
# 特点:读多写少,需要高并发处理
# 优化措施:
# 主节点:优化内存配置,使用更大的复制缓冲区
repl-backlog-size 10mb
# 从节点:使用无盘复制,减少I/O开销
repl-diskless-sync yes
repl-diskless-sync-delay 5
# 客户端:实现智能读写分离,根据业务需求选择节点
| 命令 | 功能说明 | 使用场景 |
|---|---|---|
| REPLICAOF | 设置从节点 | 配置主从关系 |
| INFO replication | 查看复制信息 | 监控复制状态 |
| SLAVEOF | 设置从节点(Redis 5.0之前) | 配置主从关系(旧版本) |
| SYNC | 手动触发全量同步 | 调试复制问题 |
| PSYNC | 部分同步 | 增量复制 |
| CONFIG GET replication | 查看复制相关配置 | 配置管理 |
| CONFIG SET replication | 修改复制相关配置 | 动态调整配置 |
通过本课程的学习,你已经掌握了Redis主从复制的核心概念和使用方法:
主从复制是Redis高可用性的基础,通过合理配置主从集群,可以显著提高系统的可用性和可靠性。在实际项目中,你需要根据业务需求和系统规模,选择合适的主从架构,并结合哨兵模式实现自动故障转移,确保系统在面对节点故障时能够快速恢复。继续深入学习和实践,你将能够构建更加稳定、高效的Redis集群。