<返回目录     Powered by claud/xia兄

第12课: 主从复制

Replication高可用

课程简介

本课程将深入讲解主从复制的核心概念和实践应用。主要内容包括:REPLICAOF、Sentinel、读写分离、故障转移。

核心知识点

详细内容

Redis的主从复制是非常重要的功能模块,在实际开发中有广泛的应用。通过本课程的学习,你将全面掌握主从复制的使用技巧。

一、主从复制基础

1. 基本概念

Redis主从复制是一种数据同步机制,允许将一个Redis服务器(主节点)的数据复制到多个Redis服务器(从节点)。

2. 主从复制的优势

二、配置方法

1. 命令行配置

# 在从节点上执行
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

2. 配置文件配置

# 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

三、复制流程

1. 全量复制

当从节点首次连接主节点时,会执行全量复制:

  1. 从节点向主节点发送SYNC命令
  2. 主节点执行BGSAVE生成RDB文件
  3. 主节点将RDB文件发送给从节点
  4. 从节点接收并加载RDB文件
  5. 主节点将生成RDB期间的写操作记录到复制缓冲区
  6. 主节点将复制缓冲区中的写操作发送给从节点
  7. 从节点执行这些写操作,完成数据同步

2. 增量复制

全量复制完成后,主节点会将后续的写操作实时同步给从节点:

  1. 主节点执行写操作
  2. 主节点将写操作记录到复制缓冲区
  3. 主节点将写操作发送给从节点
  4. 从节点接收并执行写操作

3. 复制偏移量

主节点和从节点都维护一个复制偏移量,用于跟踪数据同步进度:

# 查看主节点复制信息
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

四、读写分离实践

1. 基本架构

2. 实现方式

# 示例: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等

3. 注意事项

五、哨兵模式(Sentinel)

1. 哨兵的作用

Redis Sentinel是一个分布式系统,用于监控Redis主从集群的健康状态,并在主节点故障时自动执行故障转移。

2. 哨兵配置

# 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

3. 哨兵工作流程

  1. 哨兵定期向主节点和从节点发送PING命令,检查节点健康状态
  2. 当哨兵发现主节点无响应超过down-after-milliseconds时间,标记为主观下线
  3. 其他哨兵也检查主节点状态,如果多数哨兵认为主节点下线,标记为客观下线
  4. 哨兵选举出一个领导者,负责执行故障转移
  5. 领导者哨兵选择一个从节点作为新的主节点
  6. 领导者哨兵命令其他从节点复制新的主节点
  7. 领导者哨兵更新配置,将旧的主节点标记为从节点
  8. 故障转移完成,新的主节点开始接收写请求

4. 客户端连接哨兵

# 示例: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. 最佳实践

3. 常见问题与解决方案

七、实际应用场景

1. 高流量网站

# 架构: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

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

3. 游戏系统

# 架构: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 修改复制相关配置 动态调整配置
重要提示:

性能优化建议

实践练习

练习任务:
  1. 基础配置:搭建一个1主2从的Redis集群,使用REPLICAOF命令配置主从关系
  2. 读写分离:实现一个简单的读写分离客户端,写操作使用主节点,读操作使用从节点
  3. 哨兵配置:配置3个哨兵节点,监控主从集群的健康状态
  4. 故障转移测试:模拟主节点故障,观察哨兵是否能自动执行故障转移
  5. 性能测试:测试不同从节点数量对主节点性能的影响
  6. 监控配置:使用INFO replication命令监控复制状态
  7. 级联复制:搭建一个级联复制架构,主节点 → 从节点1 → 从节点2
  8. 故障恢复:当主节点恢复后,将其重新加入集群作为从节点

总结

通过本课程的学习,你已经掌握了Redis主从复制的核心概念和使用方法:

主从复制是Redis高可用性的基础,通过合理配置主从集群,可以显著提高系统的可用性和可靠性。在实际项目中,你需要根据业务需求和系统规模,选择合适的主从架构,并结合哨兵模式实现自动故障转移,确保系统在面对节点故障时能够快速恢复。继续深入学习和实践,你将能够构建更加稳定、高效的Redis集群。