目录
主从复制
在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他服务器,满⾜故障恢复和负载均衡等需求。Redis 也是如此,它为我们提供了复制的功能,实现了相同数据的多个 Redis 副本。复制功能是⾼可⽤ Redis 的基础,哨兵和集群都是在复制的基础上构建的。本篇文章主要从以下三个方面介绍主从复制:
- 介绍复制的使⽤⽅式:如何建⽴或断开复制、安全性、只读等。
- 说明复制可⽀持的拓扑结构,以及每个拓扑结构的适⽤场景。
- 分析复制的原理,包括:建⽴复制、全量复制、部分复制、⼼跳检测等。
1.配置主从复制
配置连接
参与复制的 Redis 实例划分为主节点(master)和从节点(slave)。每个从结点只能有⼀个主节点,⽽⼀个主节点可以同时具有多个从结点。复制的数据流是单向的,只能由主节点到从节点。配置复制的⽅式有以下三种:
- 在配置⽂件中加⼊ slaveof {masterHost} {masterPort} 随 Redis 启动⽣效。
- 在 redis-server 启动命令时加⼊ --slaveof {masterHost} {masterPort} ⽣效。
- 直接使⽤ redis 命令:slaveof {masterHost} {masterPort} ⽣效。
接下来,我们将 redis.conf 配置⽂件复制⼀份 redis-slave.conf,并且修改其 daemonize 为 yes。
接下来,默认启动的 redis 作为主 Redis,重新通过命令⾏启动⼀个 Redis 实例作为从 Redis:
# ubuntu
redis-server /etc/redis/redis-slave.conf --port 6380 --slaveof 127.0.0.1 6379
tips:修改配置文件需要修改的是从机的配置,主机配置不变。
接下来,通过 netstat -nlpt 观察两个 Redis 是否已正确启动。
断开连接
slaveof 命令不但可以建⽴复制,还可以在从节点执⾏ slaveof no one 来断开与主节点复制关系。例如在 6380 节点上执⾏ slaveof no one 来断开复制。
从节点与主节点断开复制连接后会自动晋升为主节点,并不会抛弃原有数据,只是无法再获取主节点上的数据变化。
通过 slaveof 命令还可以实现切换主节点操作,将当前从节点的数据源切换到另⼀个主节点。执⾏slaveof {newMasterIp} {newMasterPort} 命令即可。
切主操作主要流程:(1)断开与旧主节点复制关系。(2)与新主节点建⽴复制关系。(3)删除从节点当前所有数据。(4)从新主节点进⾏复制操作。
安全性
- 当关闭时,主节点产⽣的命令数据⽆论⼤⼩都会及时地发送给从节点,这样主从之间延迟会变小,但增加了⽹络带宽的消耗。适⽤于主从之间的⽹络环境良好的场景,如同机房部署。
- 当开启时,主节点会合并较⼩的 TCP 数据包从⽽节省带宽。默认发送时间间隔取决于 Linux 的内核,⼀般默认为 40 毫秒。这种配置节省了带宽但增⼤主从之间的延迟。适⽤于主从⽹络环境复杂的场景,如跨机房部署。
2.主从复制中的拓扑结构
一主多从结构
树形主从结构
3.主从复制原理
从节点与主节点建立连接到完成复制的过程大致可以分为六个阶段,分别是:
- 保存主节点信息
- 主从建立连接
- 发送ping命令
- 权限验证
- 同步数据集
- 命令持续复制
(1)保存主节点(master)的信息。开始配置主从同步关系之后,从节点只保存主节点的地址信息,此时建⽴复制流程还没有开始,在从节点 6380 执⾏ info replication 可以看到相关信息。其中主节点的 ip 和 port 被保存下来,但是主节点的连接状态(master_link_status)是下线状态。
Redis使用psync命令来完成主从数据同步,同步过程分为:部分复制和全量复制。
- 全量复制:⼀般⽤于初次复制场景,Redis 早期⽀持的复制功能只有全量复制,它会把主节点全部数据⼀次性发送给从节点,当数据量较⼤时,会对主从节点和⽹络造成很⼤的开销。
- 部分复制:⽤于处理在主从复制中因⽹络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发数据给从节点。因为补发的数据远小于全量数据,可以有效避免全量复制的过⾼开销。
PSYNC replicationid offset
如果 replicationid 设为 ? 并且 offset 设为 -1 此时就是在尝试进⾏全量复制。
如果 replicationid offset 设为了具体的数值, 则是尝试进⾏部分复制。
replicationid(replid/复制id)
replid + offset 共同标识了⼀个 "数据集".如果两个节点, 他们的 replid 和 offset 都相同, 则这两个节点上持有的数据, 就⼀定相同.
psync的运行流程图
- 如果回复 +FULLRESYNC replid offset,则从节点需要进⾏全量复制流程。
- 如果回复 +CONTINEU,从节点进⾏部分复制流程。
- 如果回复 -ERR,说明 Redis 主节点版本过低,不⽀持 psync 命令。从节点可以使⽤ sync 命令进⾏全量复制。
实时复制
4.主从复制总结
- 单个 redis 节点, 可⽤性不⾼.
- 单个 redis 节点, 性能有限.
- Redis 通过复制功能实现主节点的多个副本。
- 主节点⽤来写, 从节点⽤来读. 这样做可以降低主节点的访问压⼒。
- 复制⽀持多种拓扑结构,可以在适当的场景选择合适的拓扑结构。
- 复制分为全量复制, 部分复制和实时复制。
- 主从节点之间通过心跳机制保证主从节点通信正常和数据⼀致性。
- 主节点配置不需要改动。
- 从节点在配置⽂件中加⼊ slaveof 主节点ip 主节点端口的形式即可。
❤️😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍
🍔我是小皮侠,谢谢大家都能看到这里!!
🦚主页已更新Java基础内容,数据结构基础,数据库,算法
🚕未来会更新Java项目,SpringBoot,Redis以及各种Java路线会用到的技术。
🎃求点赞!求收藏!求评论!求关注!
🤷♀️谢谢大家!!!!!!!!