前两次学习了 Redis
的基础知识和持久化方式, 今天开始学习 Redis
的主从复制架构.
先上图
![](https://img.haomeiwen.com/i7115372/adef616ec00d0c37.png)
上图就是一个最基本的主从架构.
Redis
的主从复制架构是一种常见的高可用性和性能提升方案. 在Redis
中, 主从复制允许将一个 Redis
服务器(主节点)的数据复制到一个或多个其他 Redis
服务器(从节点), 从而实现数据的备份, 读取负载均衡和故障恢复等功能.
1. 主从复制的基本原理
- 主节点 (Master)
主节点是负责处理写操作和更新的节点. 它负责接收客户端的写请求, 将写入的数据持久化到磁盘, 并将写操作的指令复制到连接的从节点. - 从节点 (Slave)
从节点是主节点的复制品. 它从主节点复制数据, 并在接收到数据后存储副本. 从节点通常用户处理读操作, 它可以分担主节点的读取压力, 并提供备份数据.
2. 主从复制的工作流程
主从复制又分为 全量复制 和 部分复制
2.1 全量复制
- 从节点启动后, 会从配置文件中所配置的
replicaof
地址从主节点实例复制数据, 使用psync
命令来同步数据.发送命令之前会和主节点建立socket
长连接. (无论从节点是否是第一次连接上主节点, 都会发送psync
命令请求复制数据) - 主节点收到
psync
命令后, 执行bgsave
生成最新的rdb
快照数据.(主节点在生成快照的同时如果接收到新的写的命令, 就会将命令放到一个内存缓冲区中.) - 主节点将生成的
rdb
快照数据发送到从节点. - 从节点清空旧数据, 并且加载主节点的
rdb
. - 主节点将内存缓冲区中新的写命令, 发动到从节点.
- 从节点执行主节点发送的缓冲区的命令, 写入到内存.
- 主节点通过
socket
长连接持续把命令发送给从节点, 从而保持主从数据的一致性.
注意: 当 master 与 slave 之间的连接由于某些原因而断开时, slave 能够自动重连 master, 如果 master 收到了多个 slave 并发的连接请求, 它只会进行一次持久化, 然后再把这一份持久化的数据发送给多个并发连接的 slave.
![](https://img.haomeiwen.com/i7115372/f192920f2e3a784c.png)
2.2 部分复制
当 master
和 slave
断开连接又重连后, 一般都会对整份数据进行复制, 但是从 Redis 2.8
版本开始, Redis
改用可以支持部分数据复制命令 psync
去 master
同步数据, slave
和 master
能够在网络连接断开重连后, 只进行部分数据的复制. 流程如下
- 从节点断开和主节点的连接又重新连接上后, 同样也会发送
psync
命令, 但是会带上一个上一次同步后的偏移量offset
- 主节点收到命令后, 会判断从节点的偏移量
offset
是否在repl backlong buffer
中, 也就是一块缓冲区. (backlog 大小可配置, 默认为1M, 缓冲区内保存了主节点最近一段时间的命令.)- 如果存在, 则主节点会将缓冲区从从节点的
offset
之后的数据一次性同步给子节点. - 如果不存在, 还是会进行全量同步的操作.
- 如果存在, 则主节点会将缓冲区从从节点的
- 主节点通过
socket
长连接持续把命令发送给从节点, 从而保持主从数据的一致性.
master 会在内存中创建一个复制数据用的缓存队列, 缓存最近一段时间的数据, master 和它所有的 slave 都维护了复制的数据下标 offset 和 master 的进程 ID, 因此当网络断开后, slave 会请求 master继续进行未完成的复制, 从所记录的数据下标开始.
如果 master 的进程 ID 变化了, 或者从节点数据下标 offset 太旧, 已经不在 master 的缓存队列里了, 那么将会进行一次全量数据的复制.
3. 主从复制的搭建配置
搭建主从架构一般都是配置从节点.
-
复制一份
redis.conf
文件到从节点. -
修改相关配置, 假设 192.168.1.1 123 是主节点, 192.168.1.2 456 是从节点.
port 456
pidfile /var/run/redis_456pid.pid #pid进程号写入pidfile, 456为从节点的端口号
logfile "456.log" #456 为从节点的端口号
dir /usr/local/redis/data/456 #指定数据存放目录., 456为从节点的端口号
# 需要注释掉bind
# bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通 过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
- 配置主从复制
replicaof 192.168.1.1 123 #配置从节点向 123 的redis实例复制数据,
replica-read-only yes #配置从节点只读
- 启动从节点
redis-server redis.conf
- 连接从节点
Redis-cli -p 456
- 测试在123实例上写数据, 456实例是否能及时同步新修改的数据.
4. 主从复制风暴
什么是复制风暴:当有多个从节点, 同时从主节点复制数据, 就会导致直接点压力过大.
为了解决复制风暴问题, 可以从架构上调整, 让部分从节点与从节点同步数据, 类似阶梯式.
![](https://img.haomeiwen.com/i7115372/e9b1b82af5d5ca7a.png)
网友评论