主节点(Master):负责处理所有的写入请求,并将数据更新发送给从节点。
从节点(Slave):通过复制主节点的数据来保持与主节点的数据一致性,通常用于读取请求以分担主节点的负载。
复制过程:
全量复制:从节点首次连接主节点时,会进行全量数据同步,主节点将所有数据传输给从节点。
增量复制:全量复制完成后,主节点会将后续的写操作以增量的形式发送给从节点,保持数据同步。
特点
高可用性:主从复制提供了数据冗余,提高了系统的可用性。在主节点故障时,可以将从节点提升为新的主节点。
负载均衡:通过将读取请求分散到多个从节点,可以减少主节点的压力,提高系统性能。
异步复制:默认情况下,主从复制是异步的,这意味着从节点可能会滞后于主节点。但可以配置为同步复制以确保数据一致性。
Redis 主从复制(Replication)是一种数据复制机制,是 Redis 高可用架构的基础,主要用于实现高可用性和数据备份。通过主从复制,可以将主节点的数据实时复制到一个或多个从节点,从而提高系统的读性能并实现数据冗余。Redis 的主从复制主要有以下几种方式:
- 全量复制(Full Synchronization)
- 触发条件:
- 从节点第一次连接主节点。
- 主节点和从节点之间数据不一致时(例如从节点重启)。
- 过程:
- 从节点向主节点发送 PSYNC 命令。
- 主节点生成快照(RDB 文件),并通过网络将快照数据发送给从节点。
- 在发送快照期间,主节点会将新增写入操作记录到复制缓冲区中。
- 从节点接收快照并加载到内存中,同时主节点将缓冲区中的新增数据同步给从节点。
- 优点:
- 确保从节点获得主节点的完整数据。
- 缺点:
- 数据量大时会消耗更多的网络带宽和时间。
- 增量复制(Partial Synchronization)
- 触发条件:
- 主从节点之间的网络短暂中断后重新连接。
- 过程:
- 从节点发送 PSYNC 命令,包含从节点上次同步的复制 ID 和偏移量。
- 如果主节点的复制缓冲区中仍然存在从节点需要的数据,主节点只发送增量数据。
- 从节点接收增量数据并应用到本地。
- 优点:
- 数据量小,效率高。
- 缺点:
- 如果主节点的复制缓冲区中没有足够的数据,可能会回退到全量复制。
- 阻塞同步(Synchronous Replication with Diskless Option)
- 触发条件:
- 从节点以阻塞模式请求同步。
- 特点:
- 主节点可以不通过写入磁盘直接将 RDB 快照通过网络发送到从节点。
- 优点:
- 减少磁盘 I/O,提高同步效率。
- 缺点:
- 需要额外的内存和 CPU 资源来处理数据传输。
- 异步复制(Asynchronous Replication)
- 特性:
- 默认情况下,Redis 的主从复制是异步的。
- 主节点在处理客户端写请求后,不会等待从节点的复制确认。
- 优点:
- 写性能高,主节点不会因从节点的复制延迟而阻塞。
- 缺点:
- 数据可能存在短暂的不同步,主节点宕机时,从节点可能丢失最新的数据。
- 半同步复制(Semi-Synchronous Replication)
- 特性:
- Redis 提供了 min-slaves-to-write 和 min-slaves-max-lag 配置,可以实现主节点写操作时确保至少有一定数量的从节点已同步数据。
- 优点:
- 提供一定程度的数据一致性保证。
- 缺点:
- 增加了主节点的写延迟,依赖于从节点的响应速度。
Redis 主从复制方式因场景不同而有所选择:
- 全量复制:初次同步或主从数据严重不一致时。
- 增量复制:主从短暂中断后的恢复过程。
- 异步复制:默认模式,性能优先。
- 半同步复制:需要更高的数据一致性时。
- 阻塞同步(无磁盘模式):提高效率的特殊同步方式。
Redis 通过灵活的复制方式,适应不同的高可用需求和性能场景。
在 Redis 中,主从复制 不是完全自动的,需要手动配置或启动。根据使用的场景,具体可以分为以下几种情况:
- 手动配置主从复制
这种方式通过命令或配置文件直接指定主从关系。
步骤
配置主节点
主节点无需特殊配置,只需要启动 Redis 实例即可。例如:
redis-server /path/to/master.conf
配置从节点
从节点通过 slaveof 命令或配置文件指定主节点。
在从节点的 Redis CLI 中执行:
SLAVEOF <master_host> <master_port>
配置文件配置
编辑从节点的配置文件(如 slave.conf),添加:
replicaof <master_host> <master_port>
然后启动从节点:
redis-server /path/to/slave.conf
- 自动主从复制
可以在 Redis 的集群架构中通过工具或脚本自动实现主从复制配置。
Sentinel 模式
Redis Sentinel 是一种高可用解决方案,可以自动完成主从切换和监控。
配置主节点和从节点:
按上述方式配置主节点和从节点。
配置 Sentinel 文件(sentinel.conf)
sentinel monitor mymaster <master_host> <master_port> <quorum>
启动 Sentinel:
redis-sentinel /path/to/sentinel.conf
自动复制:
当 Sentinel 检测到主节点不可用时,会自动提升从节点为主节点并重新配置其他从节点进行复制。
-
使用 Redis Cluster(集群模式)
Redis Cluster 本质上是一个无中心的分布式架构,它通过分片(sharding)和多主多从实现高可用。 -
程序动态配置
在应用程序中通过 Redis 客户端调用命令配置主从关系。
Jedis jedis = new Jedis("slave_host", 6379);
jedis.slaveof("master_host", 6379);
Redis 启动主从复制的几种方式:
手动配置:
通过命令或配置文件(SLAVEOF 或 replicaof)。
Sentinel 模式:
高可用方案,支持自动故障转移和复制。
Redis Cluster 模式:
分布式架构,通过多主多从实现高可用和自动化复制。
程序动态配置:
应用程序运行时动态设置主从关系。
根据业务场景和需求,可以选择合适的方式启动和管理主从复制。