一、Redis复制:
1.为了解决分布式中单点故障问题,通常会把数据复制多个副本部署到其他机器上来解决故障恢复和负载均衡等需求。
2.建立复制
参与复制的redis实例划分为主节点(master)和从节点(slave),每个从节点只能有一个主节点而主节点可以同时具有多个从节点并且复制的数据流是单向的,只能由主节点复制到从节点。配置复制的方式有:
在配置文件中加入slaveof masterhost masterport随redis启动生效
在redis-server启动命令后加入 --slaveof{masterhost} {masterport}生效
直接使用命令slaveof{masterhost}{mastserport}生效
综上述,slaveof在使用时,可以运行期动态配置也可以提前写到配置文件中
slaveof配置都是在从节点发起
slaveof是异步命令,执行slaveof命令时节点只保存主节点信息后
3.断开复制
slaveof命令不但可以建立复制,还可以在从节点执行slaveof no one来断开与主节点的复制关系,例在6380节点上执行slaveof no one来断开复制。
断开复制的主要流程:
断开与主节点复制关系
从节点晋升为主节点
从节点断开复制后并不会抛弃原有的数据,只是无法再获取主节点上的数据变化
另外,还可以通过slaveof 命令实现切主操作,切主操作是指当前从节点对主节点的复制切换到另一个主节点,即执行slaveof {newmasterIp}
切主流程:
断开与旧主节点的复制关系
与新主节点建立复制关系
删除从节点当前所有的数据
对新主节点进行复制操作
切主后从节点会清空之前所有的数据
4.安全性:主节点会通过设置requirepass参数进行密码验证,即所有的客户端访问必须使用auth命令实行校验,因此需要在从节点的masterauth参数与主节点密码保持一致才可以使主节点正确的连接到主节点并发起复制流程
5.只读:默认情况下,从节点使用slave-read-only=yes配置为只读模式,因为从节点的任何修改主节点都无法感知,所以一般不在线上修改从节点的只读模式。
6.传输延迟:当tcp-delay参数设置为关闭时,主节点产生的命令数据无论大小都会及时的发送给从节点,这样主从延迟会变小但是会增加网络的带宽消耗,但这种方式仅适用于主从之间网络环境良好的场景,一般为同机房部署。
当该参数设置为开启时,主节点会合并较小的tcp数据包从而节省带宽,默认发送时间间隔仅取决于linux内核,这种配置适用于主从网络环境复杂或带宽紧张,一般时跨机房部部署。
二、redis拓扑
1.redis的拓扑结构分为:一主一从、一主多从、树状主从
2.一主一从结构:
用于主节点出现宕机时从节点提供故障转移支持,当应用写命令并发量较高且需要持久化时可以仅在从节点上开启AOF,这样可以保证数据安全性的同时也避免了持久化对主节点的性能干扰,一般是在从节点上执行slaveof no one断开与主节点的复制关系再重启主节点避免从节点继续复制主节点导致从节点的数据被清空。
3. 一主多从结构:
又称为星型拓扑结构,应用端可以利用多个从节点实现读写分离,一般对于读命令占较大的场景时,可以把读命令发送到从节点来分担主节点的压力或者执行一些耗时较长的读命令时可以将其分给其中一台从节点上进而防止慢查询造成阻塞影响线上服务。
但是对于一般写命令比较多的场景,多个从节点会导致写命令多次发送过度消耗网络带宽从而加重主节点的负载影响服务器的稳定。
4.树状主从结构:
这种结构,从节点不但可以复制主节点的数据同时还可以作为其他从节点的住系欸但继续向下复制,通过引入复制中间层可以有效降低主节点负载和需要传送给从节点的数据量。
三、复制原理
1.复制过程分为6个过程:
Ⅰ.保存主节点信息,执行slaveof后只保存主节点的地址信息直接返回,建立的复制流程还没有开始,在从节点执行info replication
即主节点的ip和port被保存下来,但是主节点的连接状态时下线状态
Ⅱ.从节点(slave)内部通过每秒运行的定时任务维护复制相关的逻辑,当定时任务发现存在新的主节点后会尝试与该节点建立网络连接
从节点连接成功后会打印相关日志,无法建立连接时定时任务会无限重试直到连接成功或者执行slaveof no one取消复制
Ⅲ.发送ping命令,如果建立成功后从节点发送ping请求进行首次通信,其目的是检测主从之间的网络套接字是否可用以及检测主节点当前是否可接受处理命令。
如果没有接收到主节点的pong回复或者超时时,从节点会断开复制连接
Ⅳ.权限验证,如果主节点上设置了requirepass参数,则需要密码验证,从节点必须配置masterauth参数保证与主节点相同的密码才能通过验证
Ⅴ.同步数据集,主从复制连接正常通信后,对于首次建立复制的场景,主节点会把持有所有数据全部发送给从节点
Ⅵ.命令持续复制,当主节点把当前的数据同步给从节点后,即完成复制的建立流程,接下来主节点会持续把命令发送给从节点,保证主从的一致性
2.数据同步:
全量复制:一般用于初次复制的场景,将主节点的全部数据一次性发送给从节点,当数据量较大时,会对主节点和网络在成很大的开销
部分复制:主从复制中因网络闪断等原因造成数据丢失,当从节点再次连接上主节点后,主节点会补发丢失的数据给从节点
复制偏移量:参与复制的主从节点都会维护自身的复制偏移量,主节点在处理完写入命令后会把命令的字节长度做累加记录,可以通过info relication
从节点每秒钟上报自身的复制偏移量给主节点,因此主节点也会保存从节点的复制偏移量,进而可以通过对比主从节点的复制偏移量来判断主从节点数据是否一致
3.主节点运行ID:运行ID的主要作用是用来唯一识别redis节点,因为只是使用IP+PORT的方式识别主节点会出现当主节点重启之后会变更整体的数据集,从节点再基于偏移量复制数据不安全因此当运行ID变化后从节点将做全量复制
4.psync命令:从节点发送该命令给主节点,参数runid是当前从节点保存的主节点运行id,如果没有默认值参数offset是当前从节点保存的复制偏移量
主节点根据psync参数和自身数据情况决定响应结果,如果回复fullresync,从节点将触发全量复制,如果回复continue,从节点将触发部分复制,如果回复err将无法识别psync命令
5.异步复制:主节点不仅负责数据读写还负责把写命令同步给从节点,即主节点自身处理完写命令后直接返回给客户端不等待从节点复制完成。