在 Redis 主从架构中,通常包含一个主节点(Master)和一个或多个从节点(Slave)。主节点负责处理写请求,并将数据同步到从节点。读请求可以由从节点处理,从而实现读写分离,提升性能。
要搭建 Redis 主从架构,需要至少两台 Redis 服务器(或实例),一个作为主节点,另一个作为从节点。
首先,需要配置主节点。通常,Redis 默认配置就可以作为主节点使用。
假设 Redis 主节点的配置文件为 redis.conf
,启动主节点:
redis-server /path/to/redis.conf
从节点需要配置成主节点的从节点,可以在从节点的配置文件中指定主节点的 IP 地址和端口,或者通过命令行参数指定。
假设主节点的 IP 地址为 192.168.1.100
,端口为 6379
,从节点的配置文件为 slave-redis.conf
:
slaveof 192.168.1.100 6379
或者,启动从节点时使用命令行参数指定主节点:
redis-server --slaveof 192.168.1.100 6379
启动主从节点后,可以通过 Redis CLI 工具连接到从节点,执行 INFO replication
命令来查看主从同步状态:
redis-cli -h 127.0.0.1 -p 6379 INFO replication
在输出中可以看到从节点的状态和正在跟随的主节点信息。
Redis 主从架构的核心在于主从同步机制,从节点通过复制主节点的数据来保持数据一致性。主从同步有两种模式:全量同步和增量同步。
当从节点首次连接到主节点时,或在某些情况下(例如从节点数据丢失或数据与主节点不一致时),会触发全量同步。全量同步的步骤如下:
全量同步可能会占用大量的网络带宽,且在同步期间从节点无法提供读服务。
在全量同步之后,如果主从节点之间的连接保持稳定,主节点会将所有写操作记录到复制积压缓冲区(Replication Backlog)。如果从节点再次断开连接后重连,主节点会根据从节点的偏移量(Offset)只发送增量数据,从而实现增量同步。
增量同步的优势在于它的高效性,只需传输变化的数据即可,减少了网络带宽的占用。
Java 应用程序中可以使用 Jedis 或 Redisson 等 Redis 客户端库来与 Redis 主从架构进行交互。以下是使用 Jedis 实现 Redis 主从架构操作的示例代码。
在 Maven 项目的 pom.xml
文件中添加 Jedis 依赖:
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>4.0.0version>
dependency>
使用 Jedis 提供的 Jedis
类连接到主节点,使用 JedisSentinelPool
类连接到主从架构中的哨兵节点,实现自动化的主从切换和高可用性。
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;
import java.util.HashSet;
import java.util.Set;
public class RedisMasterSlaveExample {
public static void main(String[] args) {
// 定义哨兵节点集合
Set<String> sentinels = new HashSet<>();
sentinels.add("127.0.0.1:26379"); // 哨兵节点1
sentinels.add("127.0.0.1:26380"); // 哨兵节点2
// 创建Jedis哨兵池
try (JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels)) {
// 从哨兵池中获取连接
try (Jedis jedis = pool.getResource()) {
// 操作Redis
jedis.set("key", "value");
System.out.println("key: " + jedis.get("key"));
// 模拟主从切换
jedis.sentinelFailover("mymaster");
// 重新获取连接,测试主从切换
try (Jedis jedisAfterFailover = pool.getResource()) {
System.out.println("After failover, key: " + jedisAfterFailover.get("key"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
在这个示例中,我们首先定义了哨兵节点的集合,然后创建了 JedisSentinelPool
对象来管理 Redis 主从架构的连接。我们可以通过哨兵节点进行主从切换和高可用性管理。
Redis 主从架构支持手动和自动的主从切换。在 Redis Sentinel 架构中,当主节点发生故障时,哨兵节点会自动选择一个从节点提升为新的主节点,继续提供服务。Jedis 客户端可以通过 JedisSentinelPool
自动检测并重新连接到新的主节点。
Redis 从节点默认是只读的,不能接受写请求。这可以防止数据不一致和数据冲突。在某些场景下,可以将从节点设置为可读写(使用 slave-read-only no
配置),但这需要额外的冲突管理和一致性控制。
Redis 主从架构适用于以下场景:
Redis 主从架构是一种常用的数据库高可用和扩展解决方案,通过数据复制和读写分离机制,实现了高可用性和性能优化。在 Java 中,可以使用 Jedis 或其他 Redis 客户端库方便地与 Redis 主从架构进行交互,管理和处理数据。通过合理的架构设计和配置,Redis