Redis 的主从复制(Master-Slave Replication)是一种数据复制机制,用于将数据从主节点(Master)复制到从节点(Slave)。这种机制可以实现读写分离,提高读性能,并提供数据冗余以增强数据的可靠性。
1. 设置主从复制
配置主节点
主节点通常不需要特别的配置,默认情况下它就是一个独立的 Redis 实例。
配置从节点
从节点需要在 redis.conf 文件中指定主节点的信息:
conf
# 指定主节点的 IP 和端口
replicaof 127.0.0.1 6379
# 设置从节点的认证密码,如果主节点有设置 requirepass
# masterauth your_master_password
2. 动态配置主从复制
除了在配置文件中设置外,还可以通过命令行动态配置主从复制。
在从节点上运行以下命令
bash
redis-cli
进入 Redis 命令行界面后,执行以下命令来设置主节点:
bash
replicaof <master-ip> <master-port>
# 如果主节点有密码保护,还需要执行以下命令
# auth your_master_password
3. 示例代码
启动 Redis 实例
首先,启动两个 Redis 实例,一个作为主节点,一个作为从节点。假设我们在本地使用默认端口 6379 作为主节点,使用端口 6380 作为从节点。
使用以下命令启动 Redis 实例:
bash
# 启动主节点
redis-server --port 6379
# 启动从节点
redis-server --port 6380
配置从节点连接主节点
通过命令行连接从节点并设置主从关系:
bash
redis-cli -p 6380
在从节点的 Redis 命令行中执行以下命令:
bash
replicaof 127.0.0.1 6379
这将把从节点(端口 6380)配置为主节点(端口 6379)的从节点。
4. Java 示例代码
使用 Jedis 库在 Java 中实现主从复制。
连接主节点并写入数据
java
import redis.clients.jedis.Jedis;
public class RedisMaster {
public static void main(String[] args) {
try (Jedis jedis = new Jedis("localhost", 6379)) {
// 写入数据到主节点
jedis.set("key1", "value1");
jedis.set("key2", "value2");
System.out.println("Data written to master node.");
}
}
}
连接从节点并读取数据
java
import redis.clients.jedis.Jedis;
public class RedisSlave {
public static void main(String[] args) {
try (Jedis jedis = new Jedis("localhost", 6380)) {
// 从从节点读取数据
String value1 = jedis.get("key1");
String value2 = jedis.get("key2");
System.out.println("Data read from slave node:");
System.out.println("key1: " + value1);
System.out.println("key2: " + value2);
}
}
}
5. 主从复制原理
初始同步
当从节点首次连接到主节点时,会执行一次完整的同步过程:
- 从节点向主节点发送
PSYNC命令。 - 主节点生成 RDB 快照并将快照发送到从节点。
- 在快照发送期间,主节点将所有新的写操作记录到内存缓冲区。
- 从节点加载快照,同时接收并应用主节点缓冲区中的写操作。
增量同步
初始同步完成后,主节点会将所有新的写操作通过 REPLCONF ACK 命令实时复制到从节点,从而保持数据的一致性。
6. 故障转移(Failover)
Redis 不自带自动故障转移机制,但可以使用 Redis Sentinel 或 Redis Cluster 实现自动故障转移。
使用 Redis Sentinel
Redis Sentinel 是一个管理 Redis 实例的工具,支持主从切换和高可用性。
配置 Redis Sentinel
创建一个 Sentinel 配置文件 sentinel.conf,内容如下:
conf
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
启动 Sentinel:
bash
redis-sentinel sentinel.conf
使用 Redis Cluster
Redis Cluster 是 Redis 的分布式解决方案,支持自动分片和故障转移。
7. 验证主从复制
在实际操作中,为了验证主从复制的效果,可以按照以下步骤:
- 写入数据:在主节点上写入数据。
- 读取数据:在从节点上读取数据,验证数据是否已经同步。
通过这些步骤,可以确认主从复制的正确性和有效性。
8. 高级配置和优化
配置从节点只读
为了确保从节点不被误写,可以将从节点设置为只读:
conf
# 在 redis.conf 文件中设置
replica-read-only yes
网络优化
为了提高复制性能,可以调整网络相关配置,如 TCP 参数、带宽等。
总结,Redis 的主从复制机制通过简单的配置和命令,可以实现数据的同步和冗余。结合 Sentinel 或 Cluster,可以进一步增强 Redis 的高可用性和故障转移能力。通过上述详细示例和步骤,可以轻松实现 Redis 的主从复制。