Redis 的主从复制(Master-Slave Replication)是一种数据复制机制,通过它可以将一个 Redis 实例的数据复制到一个或多个从节点。这种机制可以用于数据备份、读写分离、灾难恢复等场景。以下是 Redis 主从复制的详细实现过程及其代码示例。
主从复制原理
- 主节点(Master):负责处理写操作(SET、DEL 等),并将数据变化同步到从节点。
- 从节点(Slave):负责处理读操作(GET 等),从主节点接收数据变化。
- 同步过程:
- 初次同步:从节点连接到主节点,主节点会将当前数据快照发送给从节点,从节点在接收到快照后会进行数据加载。
- 增量同步:在初次同步完成后,主节点会将所有新的写操作日志发送给从节点,从节点会持续应用这些操作以保持数据一致性。
配置主从复制
配置主节点
在 redis.conf 文件中,通常不需要进行特殊配置,只需要确保主节点正常运行即可。
配置从节点
在 redis.conf 文件中,添加如下配置,以指定主节点的 IP 地址和端口:
1replicaof <master-ip> <master-port> 2# 例如 3replicaof 192.168.1.100 6379 4
动态配置从节点
也可以在 Redis 运行时通过命令配置从节点:
1redis-cli REPLICAOF <master-ip> <master-port> 2# 例如 3redis-cli REPLICAOF 192.168.1.100 6379 4
如果需要将一个从节点转换回独立状态(停止复制),可以使用:
1redis-cli REPLICAOF NO ONE 2
Java 和 Jedis 实现主从复制
使用 Jedis 库可以通过编程接口实现 Redis 的主从复制配置。
- 添加 Jedis 依赖
确保在 pom.xml 文件中添加 Jedis 依赖:
1<dependency> 2 <groupId>redis.clients</groupId> 3 <artifactId>jedis</artifactId> 4 <version>4.2.3</version> 5</dependency> 6
- Java 示例代码
以下代码展示了如何使用 Jedis 库配置 Redis 主从复制:
1import redis.clients.jedis.Jedis; 2 3public class RedisReplicationExample { 4 public static void main(String[] args) { 5 // 主节点配置 6 String masterHost = "192.168.1.100"; 7 int masterPort = 6379; 8 9 // 从节点配置 10 String slaveHost = "192.168.1.101"; 11 int slavePort = 6379; 12 13 // 连接主节点 14 try (Jedis masterJedis = new Jedis(masterHost, masterPort)) { 15 masterJedis.set("key", "value"); 16 System.out.println("Master set key: " + masterJedis.get("key")); 17 } 18 19 // 配置从节点 20 try (Jedis slaveJedis = new Jedis(slaveHost, slavePort)) { 21 slaveJedis.slaveof(masterHost, masterPort); 22 System.out.println("Slave is replicating from Master"); 23 24 // 等待复制完成 25 Thread.sleep(1000); 26 27 // 从节点读取数据 28 String value = slaveJedis.get("key"); 29 System.out.println("Slave get key: " + value); 30 } catch (InterruptedException e) { 31 e.printStackTrace(); 32 } 33 } 34} 35
监控和故障处理
- 监控同步状态
使用命令 INFO replication 可以查看主节点和从节点的复制状态:
1# 在主节点上 2redis-cli INFO replication 3 4# 在从节点上 5redis-cli INFO replication 6
输出示例:
1# 在主节点上 2# Replication 3role:master 4connected_slaves:1 5slave0:ip=192.168.1.101,port=6379,state=online,offset=12345,lag=0 6 7# 在从节点上 8# Replication 9role:slave 10master_host:192.168.1.100 11master_port:6379 12master_link_status:up 13master_last_io_seconds_ago:0 14master_sync_in_progress:0 15slave_repl_offset:12345 16
- 处理主节点故障
在实际生产环境中,可能需要使用 Redis Sentinel 或 Redis Cluster 来实现高可用性和自动故障转移。
- Redis Sentinel:用于监控 Redis 主从架构的高可用性解决方案,可以自动进行主从切换。
- Redis Cluster:用于分布式 Redis 集群,实现高可用性和水平扩展。
使用 Redis Sentinel 进行高可用性配置
- 配置 Sentinel
创建一个 sentinel.conf 文件,配置 Sentinel 以监控主节点:
1sentinel monitor mymaster 192.168.1.100 6379 2 2sentinel down-after-milliseconds mymaster 5000 3sentinel parallel-syncs mymaster 1 4sentinel failover-timeout mymaster 10000 5
- 启动 Sentinel
1redis-server /path/to/sentinel.conf --sentinel 2
- 使用 Jedis 进行连接
可以使用 JedisSentinelPool 来连接 Sentinel 和 Redis 集群:
1import redis.clients.jedis.Jedis; 2import redis.clients.jedis.JedisSentinelPool; 3 4import java.util.HashSet; 5import java.util.Set; 6 7public class RedisSentinelExample { 8 public static void main(String[] args) { 9 Set<String> sentinels = new HashSet<>(); 10 sentinels.add("192.168.1.101:26379"); 11 12 try (JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels); 13 Jedis jedis = pool.getResource()) { 14 jedis.set("key", "value"); 15 System.out.println("Set key: " + jedis.get("key")); 16 } 17 } 18} 19
总结
Redis 主从复制是一种重要的数据备份和读写分离机制。通过合理配置主从节点,可以实现数据的高可用性和负载均衡。在实际应用中,结合 Redis Sentinel 或 Redis Cluster 可以进一步提高系统的高可用性和容灾能力。通过本文的详细介绍和代码示例,希望能帮助您更好地理解和实现 Redis 的主从复制功能。
《Redis(59)Redis的主从复制是如何实现的?》 是转载文章,点击查看原文。

