Redis 主从复制介绍
Redis 的 主从复制 是一种常用的分布式部署模式,在该模式下,数据从主节点(Master)同步到一个或多个从节点(Slave)。主节点负责处理写请求,从节点负责处理读请求。主从复制可以提高系统的可用性、扩展性,并且能够通过分离读写操作来提升性能。
主从复制的工作原理
1.主节点与从节点:
- 主节点(Master):负责处理所有写请求(SET、INCR、DEL 等)。
- 从节点(Slave):负责复制主节点的数据,并处理所有读请求(GET、LRANGE、SMEMBERS 等)。
2.复制过程:
- 启动时,从节点会向主节点发送 SYNC 命令请求复制。
- 主节点接收到请求后,会将当前数据库的状态传送给从节点,并且开始将新写入的命令通过 增量复制 方式同步到从节点。
- 从节点会将主节点的数据更新到本地,并且开始处理读请求。
3.复制模式:
- 全量复制:从节点第一次连接到主节点时,主节点会将数据库中的所有数据发送给从节点,这个过程被称为全量复制。
- 增量复制:主节点将新产生的写命令实时地同步到从节点,这个过程是增量的。
4.数据同步:
- RDB快照:Redis 会定期生成 RDB 快照,将数据持久化到磁盘,复制过程中如果涉及到持久化,会在这个快照文件的基础上进行同步。
- AOF日志:如果启用了 AOF 持久化,写命令会记录到日志中,这些命令会同步到从节点。
假设我们有一个简单的 Redis 集群,包含一个主节点和两个从节点。
步骤 1:启动主节点
首先,启动主节点 Redis 实例。
主节点的 redis.conf 文件内容如下:
# 主节点配置 port 6379 bind 127.0.0.1 daemonize yes # 不设置 replicaof,表示该节点为主节点
启动主节点:
$ redis-server /path/to/redis.conf
步骤 2:启动从节点
接下来,启动第一个从节点。redis.conf 文件内容如下:
# 从节点配置 port 6380 bind 127.0.0.1 daemonize yes replicaof 127.0.0.1 6379 # 配置主节点的 IP 和端口
启动从节点:
$ redis-server /path/to/redis.conf
启动第二个从节点,配置与第一个从节点相同,只是端口不同:
# 从节点配置 port 6381 bind 127.0.0.1 daemonize yes replicaof 127.0.0.1 6379 # 配置主节点的 IP 和端口
$ redis-server /path/to/redis.conf
步骤 3:验证主从复制
- 在主节点写入数据:通过 redis-cli 连接到主节点并写入一些数据:
- 检查从节点同步数据:通过 redis-cli 连接到从节点 6380,验证是否已经同步主节点的数据:可以看到,从节点已经从主节点同步了 key1 和 key2 的数据。
- 继续写入数据:在主节点上继续写入数据:这时,从节点会自动同步该写操作。
- 验证数据同步:再次通过 redis-cli 连接从节点,检查是否同步了 key3:
步骤 4:手动故障转移(可选)
如果主节点出现故障(如宕机),从节点不会自动成为主节点,除非通过外部机制(如 Redis Sentinel)进行故障转移。
不过,可以手动通过以下命令来让某个从节点提升为主节点:
$ redis-cli -p 6380 > SLAVEOF NO ONE
该命令会使从节点停止复制,并变成主节点。此时,该节点就会接受写请求,其他从节点会自动复制新的主节点的数据。
主从复制的优缺点
优点
- 提高读性能:通过将读取请求分发到多个从节点,可以大大提高 Redis 系统的读性能。
- 数据冗余:从节点充当主节点的备份,增强数据的安全性和可用性。
- 简易配置:主从复制的配置非常简单,适合中小型应用。
缺点
- 写入性能受限:写操作只能通过主节点进行,无法通过从节点处理,因此写性能仍然受限于主节点的负载。
- 无自动故障转移:如果主节点出现故障,系统不会自动进行故障转移。需要借助 Redis Sentinel 或 客户端实现故障转移。
- 一致性问题:从节点的数据是异步复制的,可能会存在短暂的不一致性,尤其是在主节点写操作非常频繁时。
Redis的碎碎念 文章被收录于专栏
Redis面试中的碎碎念

