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