Redis 主从同步(Master-Slave Replication)是一种数据复制机制,用于将数据从一个主节点(Master)同步到一个或多个从节点(Slave)。这种机制可以提高数据的可用性和读取性能。
主从同步的基本原理
- 主节点(Master):负责处理写请求和一部分读请求,保存数据的最新状态。
- 从节点(Slave):复制主节点的数据,处理只读请求,分担主节点的读取压力。
同步过程
-
初次同步:
- 当从节点第一次连接到主节点时,会发送一个
SYNC
命令。 - 主节点接收到
SYNC
命令后,会执行BGSAVE
命令生成一个快照(RDB 文件),并将快照发送给从节点。 - 同时,主节点会将从生成快照以来的写操作记录到积压缓冲区(Replication Backlog)。
- 从节点接收到快照后,清空现有数据并加载快照,然后再从积压缓冲区中接收和应用增量数据。
- 当从节点第一次连接到主节点时,会发送一个
-
增量同步:
- 初次同步完成后,主节点会将每次写操作(如 SET、DEL 等)发送给从节点,从节点按顺序应用这些操作。
-
断线重连:
- 如果从节点与主节点的连接断开,当连接重新建立时,从节点会发送
PSYNC
命令。 - 如果从节点的偏移量还在主节点的积压缓冲区范围内,主节点只需将缓冲区中的增量数据发送给从节点。
- 否则,从节点需要重新进行一次完整的初次同步。
- 如果从节点与主节点的连接断开,当连接重新建立时,从节点会发送
主从同步的优势
- 读写分离:将读请求分散到多个从节点,减少主节点的负载,提高系统的读取性能。
- 高可用性:主节点故障时,可以将一个从节点提升为新的主节点,保证数据的高可用性。
主从同步的配置
在 redis.conf
文件中进行配置:
# 在从节点的配置文件中添加如下配置,指定主节点的地址和端口
slaveof <master-ip> <master-port>
# 如果主节点设置了密码保护,还需添加主节点的密码
masterauth <master-password>
或者在运行时通过命令行配置:
# 在从节点上执行
redis-cli SLAVEOF <master-ip> <master-port>
# 如果主节点设置了密码保护,还需配置主节点的密码
redis-cli CONFIG SET masterauth <master-password>
Java 代码示例
使用 Jedis 库进行 Redis 的主从同步操作:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisReplicationExample {
public static void main(String[] args) {
// 主节点信息
String masterHost = "master-host";
int masterPort = 6379;
// 从节点信息
String slaveHost = "slave-host";
int slavePort = 6379;
// 连接主节点
JedisPoolConfig poolConfig = new JedisPoolConfig();
JedisPool masterPool = new JedisPool(poolConfig, masterHost, masterPort);
Jedis masterJedis = masterPool.getResource();
// 连接从节点
JedisPool slavePool = new JedisPool(poolConfig, slaveHost, slavePort);
Jedis slaveJedis = slavePool.getResource();
// 配置从节点同步主节点
slaveJedis.slaveof(masterHost, masterPort);
// 示例操作
masterJedis.set("key", "value");
String value = slaveJedis.get("key");
System.out.println("The value of 'key' is: " + value);
// 关闭连接
masterJedis.close();
masterPool.close();
slaveJedis.close();
slavePool.close();
}
}
以上代码实现了通过 Jedis 库配置 Redis 的主从同步,并进行简单的数据操作。