文章目录
- 定义
- 拓扑
- 拓扑定义
- 单从拓扑
- 多从拓扑
- 树型拓扑
- 使用
- 原理
- 建立流程
- 持续复制
定义
Redis主从复制技术的主要满足的需求是①数据恢复②负载均衡
①数据恢复的理解:将数据同步到多个Redis服务器中,其中一个节点数据损毁,可通过复制其他节点数据恢复。
②负载均衡的理解:启动多个Redis服务器,它们数据相同,每个节点平均分配client-Redis发起的请求。
拓扑
(解释拓扑也说明在说明主从复制的必要性/作用)
拓扑定义
在计算机网络和系统架构中,拓扑(Topology)是指网络或系统组件之间的物理或逻辑连接方式。它描述了节点(如计算机、服务器、存储设备等)和链接(如电缆、无线连接等)之间的结构关系。拓扑结构对于数据如何在网络中流动、如何被路由以及系统的整体性能都有重要影响。
单从拓扑
⼀主⼀从结构是最简单的复制拓扑结构,⽤于主节点出现宕机时从节点提供故障转移⽀持,如图所⽰。当应⽤写命令并发量较⾼且需要持久化时,可以只在从节点上开启 AOF,这样既可以保证数据安全性同时也避免了持久化对主节点的性能⼲扰。但需要注意的是,当主节点关闭持久化功能时,如果主节点宕机要避免⾃动重启操作(如果主节点在关闭持久化功能后宕机,但在宕机前未能将所有数据同步到从节点,那么在主节点重启后,这部分未同步的数据可能会丢失)。
多从拓扑
对于读⽐重较⼤的场景,可以把读命令负载均衡到不同的从节点上来分担压⼒。同时⼀些耗时的读命令可以指定⼀台专⻔的从节点执⾏,避免破坏整体的稳定性。对于写并发量较⾼的场景,(缺点/注意)多个从节点会导致主节点写命令的多次发送从⽽加重主节点的负载
树型拓扑
树形主从结构(分层结构)使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。通过引⼊复制中间层,可以有效降低住系欸按负载和需要传送给从节点的数据量.
例如下图:数据写⼊节点 A 之后会同步给 B 和 C 节点,C节点进⼀步把数据同步给 D 和 E 节点。当主节点需要挂载等多个从节点时为了避免对主节点的性能⼲扰,可以采⽤这种拓扑结构。
使用
配置原则:
① 每个从结点只能有⼀个主节点,而一个主节点可以同时具有多个从结点
②复制的数据流是单向的,只能由主节点到从节点
1. 建立主从复制具体方法:
①在redis.conf配置文件中,设置
# redis.conf 配置文件
slaveof <masterip> <masterport>
# masterip 主节点IP
# masterport 主节点端口
② 在 redis-server 启动命令时加输入以下指令
在 redis-server 启动命令时加⼊ --slaveof {masterHost} {masterPort}
③ 接使⽤ redis 命令:
slaveof {masterHost} {masterPort}
2. 断开主从复制具体方法:
在从节点执⾏ slaveof no one 来断开与主节点复制关系。
slaveof no one
3. 切换主从复制具体方法:
将当前从节点的数据源切换到另⼀个主节点。执⾏slaveof {newMasterIp} {newMasterPort} 命令即可。
slaveof {newMasterIp} {newMasterPort}
4. 设置主从复制密码的具体方法:
主从复制必然有安全验证手段,否则会被盗取信息。Redis主从复制手段安全保障手段是通过设置连接密码来实现的。
主节点配置(redis.conf文件):
#设置密码验证
requirepass your_password
从节点配置(redis.conf文件):
# 设置主节点的IP和端口
replicaof <masterip> <masterport>
# 设置主节点的密码
masterauth your_password
5. 设置从节点为只读的具体方法:
在实际的生产应用环境中,读数据的频率往往比写(增删改)数据的频率要高,因此有读模式的需求。将从节点设置为只读模式后,从节点的任何修改主节点都⽆法感知,修改从节点会造成主从数据不⼀致。所以将从节点设置为只读模式后,不建议”写“从节点内容。
# 在redis.conf配置文件中
slave-read-only yes
原理
建立流程
(这部份建立流程指的是执行slaveof指令后第一次同步的具体流程)
①保存信息:从节点保存主节点信息(例如主节点的端口、IP信息)
②建立连接:从节点内部通过每秒运⾏的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与主节点建⽴基于 TCP 的⽹络连接。如果从节点⽆法建⽴连接,定时任务会⽆限重试直到连接成功或者⽤⼾停⽌主从复制。
③验证连接:连接建⽴成功之后,从节点通过 ping 命令确认主节点在应⽤层上是⼯作良好的。如果 ping 命令的结果 pong 回复超时,从节点会断开 TCP 连接,等待定时任务下次重新建⽴连接。
④权限验证:如果主节点设置了 requirepass 参数,则需要密码验证,从节点通过配置 masterauth参数来设置密码。如果验证失败,则从节点的复制将会停⽌。
⑤首次复制:对于⾸次建⽴复制的场景,主节点会把当前持有的所有数据全部发送给从节点,这步操作基本是耗时最⻓的,所以⼜划分称两种情况:全量同步和部分同步(全量复制与复制后面会作解释)。
⑥持续复制:当从节点复制了主节点的所有数据之后,针对之后的修改命令,主节点会持续的把命令发送给从节点,从节点执⾏修改命令,保证主从数据的⼀致性。(持续复制的具体说明见下一部分)
持续复制
SLAVEOF 和 PSYNC指令
Redis 使⽤ psync 命令完成主从数据同步,注意:SLAVEOF指令用于建立主从关系,即将一个Redis实例设置为另一个Redis实例的从节点,从而进行完整的数据复制。PSYNC指令则是在从节点与主节点失去连接并重新连接时,用于请求数据同步或部分数据同步,以便在部分数据丢失或断线重连的情况下保持数据的一致性。
# PSYNC指令的具体使用
redis-cli -h <slave_host> -p <slave_port>
PSYNC <replicationid> <offset>
#如果 replicationid 设为 ? 并且
#offset 设为 -1 此时就是在尝试进⾏全量复制.
#如果 replicationid offset
#设为了具体的数值, 则是尝试进⾏部分复制
复制策略分类:
全量复制:⼀般⽤于初次复制场景,Redis 早期⽀持的复制功能只有全量复制,它会把主节点全部数据⼀次性发送给从节点,当数据量较⼤时,会对主从节点和⽹络造成很⼤的开销。
部分复制:⽤于处理在主从复制中因⽹络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发数据给从节点。因为补发的数据远⼩于全量数据,可以有效避免全量复制的过⾼开销。