Redis 主从复制(Master-Slave Replication)是一种数据复制机制,允许将一个 Redis 实例(主节点)上的数据同步到另一个或多个 Redis 实例(从节点)上。主从复制可以帮助提高数据的可用性、实现数据备份、分担读操作压力,并增强系统的容错能力。
一、主要架构
通常包括一个主节点(Master)和一个或多个从节点(Slave)。
1.主节点(Master)
负责处理读写请求。当主节点的数据发生变化时,它会将这些变化同步到从节点。
2.从节点(Slave)
只负责处理读取请求。每当主节点的数据发生变化,从节点会接收并更新自己的数据副本。
二、工作原理
Redis 的主从复制是异步的,即主节点在接收到写请求后会立即返回响应,并将更新操作异步地传播到从节点。具体的工作原理如下:
1.主从节点建立连接
从节点向主节点发送 SYNC 请求,请求与主节点建立连接并同步数据。
主节点回应从节点并开始同步数据。
2.全量同步
主节点会生成一个数据库快照(RDB),然后将这个快照数据传输给从节点,从节点通过快照同步数据。这个过程称为全量同步。
全量同步后,从节点会拥有和主节点一样的数据库状态。
3.增量同步
一旦全量同步完成,主节点会开始将后续的写操作传输给从节点,从节点会依次执行这些操作,使自己与主节点的数据保持一致。这些操作称为增量同步。
增量同步是基于复制偏移量(Replication Offset)实现的,主节点会向从节点发送增量数据,从节点根据增量数据执行更新。
4.心跳机制
从节点会定期向主节点发送 PSYNC 请求,确认从节点是否与主节点保持同步。
如果从节点与主节点断开连接,主节点会重新进行全量同步或者增量同步,具体取决于断开时间和数据同步情况。
5.从节点的角色
从节点接收到主节点的更新后,会异步执行并将更新后的数据保存在自己的内存中,从而实现数据的复制。
从节点不直接接受客户端写操作,所有写操作都会由主节点处理。客户端只能从从节点进行读取操作。
三、配置步骤
主要通过配置文件或者命令来设置主从关系。
1.配置文件方式
(1)主节点(Master)
启动并保持主节点的运行状态,主节点IP端口信息:127.0.0.1 6379。
# 启动 Redis 服务 $ redis-server /etc/redis/redis.conf |
(2)从节点(Slave)
通过从节点的配置文件(redis.conf)来指定主从关系。从节点需要配置为连接主节点。
在配置文件 redis.conf 中,使用 replicaof 指令来指定主节点的 IP 和端口。
bind 127.0.0.1 port 7000 # replicaof <master-ip> <master-port> replicaof 127.0.0.1 6379 replica-read-only yes |
启动从节点实例,从节点会自动连接到主节点,并开始进行数据同步。
2.命令方式
通过命令动态地配置 Redis 实例进行主从复制。
首先依次启动主从节点,并保持运行状态。
在从节点中选择以下任一命令方式进行动态绑定:
(1)SLAVEOF
SLAVEOF <master-ip> <master-port> #SLAVEOF 127.0.0.1 6379 |
(2)--replicaof
redis-server --replicaof <master-ip> <master-port> #redis-server --replicaof 127.0.0.1 6379 |
3.验证
可以通过 Redis 客户端命令 INFO replication 来检查主从节点的状态。
(1)在主节点执行以下命令
$ redis-cli INFO replication |
输出类似以下信息:
# Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=7000,state=online,offset=204,lag=1 |
(2)在从节点执行以下命令
$ redis-cli INFO replication |
输出类似以下信息:
# Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:2 master_sync_in_progress:0 |
四、数据一致性问题
Redis 的主从复制是异步的,因此可能会出现主节点和从节点之间的数据不一致的情况。
1.具体问题
(1)数据丢失
如果主节点在将数据写入磁盘之前发生崩溃或重启,可能导致某些数据没有同步到从节点。因为主节点会在将数据写入内存后异步发送到从节点。
(2)延迟
从节点的同步是异步的,因此可能会有一定的延迟。在高负载的情况下,从节点可能会滞后主节点的一些操作。
2.解决方案
(1)repl-backlog-size
用于设置复制回溯缓冲区的大小。
这个缓冲区用于存储主节点最近的变更(写操作日志),当从节点与主节点断开连接一段时间后重新连接时,从节点可以通过回溯缓冲区来同步主节点的最新数据。
修改回溯缓冲区大小的方式:
a.修改从节点配置文件(推荐)
replicaof 127.0.0.1 6379 # 主节点 replica-read-only yes # 只读 repl-backlog-size 1mb # 回溯缓冲区的大小为1MB |
b.命令动态修改
CONFIG SET repl-backlog-size 10485760 |
(2)min-slaves-to-write 和 min-slaves-max-lag
需要在主节点中进行配置。
这两个参数通常是一起使用的,用来增强 Redis 主从复制的容错能力和数据一致性。
min-slaves-to-write:
指定了从节点数量必须大于设定值:最小从节点数量,才能进行写操作。
可以保证在主节点写操作时,有足够的从节点来同步数据。
min-slaves-max-lag:
指定了从节点和主节点之间的最大延迟(以秒为单位),主节点仍然允许执行写操作。
如果从节点的同步延迟超过了这个最大延迟值,则主节点会暂停写操作。
配置示例:
至少有 2 个从节点能够同步,并且从节点的延迟不超过 5 秒。
min-slaves-to-write 2 min-slaves-max-lag 5 |
(3)replica-read-only
使用 replica-read-only 配置从节点为只读模式,防止误操作修改从节点数据。
(4)故障转移(Failover)
Redis 本身不提供自动故障转移机制。通常与 Sentinel 配合使用,Sentinel 是 Redis 提供的高可用方案,能够在主节点宕机时自动提升从节点为新的主节点,确保服务的可用性。
五、常见应用场景
1.提高读性能
在读密集型的应用场景中,可以通过将读请求分配到从节点,减轻主节点的压力,提升系统的性能和响应速度。
2.数据备份
从节点作为主节点数据的备份,一旦主节点发生故障,可以从从节点恢复数据,保证数据的高可用性。
3.灾难恢复
通过 Redis 主从复制架构,可以在主节点发生灾难性故障时,尽可能通过从节点进行恢复,减少系统停机时间。
六、总结
Redis 主从复制是实现高可用性和负载均衡的重要技术。它可以通过将主节点的数据同步到一个或多个从节点,保证数据的冗余,并且支持高并发的读操作。在配置时需要注意主从复制的延迟问题,尤其是在高负载环境下,考虑是否需要结合 Redis Sentinel 来实现高可用性。