• redis进阶-高可用:主从复制详解


    1. 主从复制

    (1) 主从复制概述:主从复制是指将一台redis服务器中的数据,复制到其它的redis服务器。前者称为主节点(master),后者称为从节点;数据的复制是单向的,只能是主节点到从节点

    (2) 主从复制的作用

    ① 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式

    ② 故障恢复

    ③ 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器负载;尤其是在写多读少的情况下,通过多个从节点分担读负载,可以大大提高redis服务器的并发量

    ④ 高可用基石

    (3) 主从库之间采用的是读写分离的方式

    ① 读操作:主库、从库都可以接收

    ② 写操作:首先到主库执行,然后,主库将写操作同步给从库

     

    (4) 主从复制原理

    ① 全量(同步)复制:比如第一次被同步时

    ② 增量(同步)复制:只会把从库网络断连期间主库收到的命令,同步给从库

    (5) 全量复制:但我们启动多个redis实例的时候,他们相互之间就可以通过replicaof命令形成主库和从库的关系,之后会按照三个阶段完成数据的第一次同步

    ① 确立主从关系

    1) 现在有实例1(ip:172.16 .19.3)和实例2(ip:172.16.19.5),在实例2上执行 命令,实例2就变成了实例1的从库,并从实例1上复制数据

    2) 命令:replicaof 172.16.19.3 6379

    ② 全量复制三个阶段图示

     

    ③ 全量复制三个阶段

    1) 主从库建立连接、协商同步的过程

    2) 主库将所有数据同步给从库:从库收到数据后在本地完成加载。整个过程依赖于内存快照生成的RDB文件

    3) 主库会把第二阶段执行过程中新受到的写命令,再发送给从库:

    (6) 增量复制

    ① 为什么会设计增量复制

    1) 如果主从库在命令传播时出现网络闪断,那么从库就会和主库重新进行一次全量复制,开销非常大。从redis2.8开始,网络断了之后,主从库会采用增量复制的方式继续同步

    ② 增量复制的流程图示

     

    ③ 如果在网络断开期间,repl_backlog_size环形缓冲区写满之后,从库是会丢失掉那部分被覆盖掉的数据,还是直接进行全量复制呢?(重点)

    1) 一个从库如果和主库断开时间过长,造成它在主库repl_backlog_bufferslave_repl_offset位置上的数据已经被覆盖掉了,此时将会进行全量复制。

    2) 每个从库会记录自己的slave_repl_offset,每个从库的复制进度也不一定相同。在和主库重新连接进行恢复时,从库会通过psync命令把自己记录的slave_repl_offset发给主库,主库会根据从库各自的复制进度,来决定这个从库可以进行增量复制,还是全量复制

    (7) 当主服务器不进行持久化时复制的安全性

    ① 为什么不持久化的主服务器自动重启非常危险呢?反例(后果:主服务器和从服务器中的数据库都被删除了)

    1) 设置节点A为主服务器,关闭持久化,节点B和节点C从节点A复制数据

    2) 出现奔溃,但是redis具有自动重启系统,重启了进程,因为关闭了持久化,节点重启后只有一个空的数据集

    3) 当在高可用系统中使用Redis Sentinel,关闭的主服务器的持久化,并且允许自动重启,这种情况是很危险的。比如主服务器在短时间内就完成了重启,以至于Sentinel都无法检测到这次失败,那么上面所说的这种情况就发生了

    4) 注意:如果数据比较重要,并且在使用主从复制时关闭了主服务器持久化功能的场景中,都应该禁止实例自动重启

    ② 为什么主从全量复制使用RDB而不适用AOF?

    1) RDB文件内容是经过压缩的二进制数据,文件小可以尽量降低对主库机器网络带宽的消耗,成本也比较低

    2) 假设要使用AOF做全量复制,就必须打开AOF功能,打开AOF就要选择文件刷盘的策略,选择不当会严重影响Redis性能。而RDB只有在需要定时备份和主从全量复制数据时才会触发生成一次快照。而在很多丢失数据不敏感的业务场景中,其实是不需要开启AOF

    (8) 读写分离及其中的问题

    ① 延迟与不一致问题

    ② 数据过期问题

    ③ 故障切换问题

    ④ 总结:在使用读写分离之前,可以考虑其他方法增加Redis的读负载能力:如尽量优化主节点(减少慢查询、减少持久化等其他问题带来的阻塞)提高负载能力;使用redis集群同时提高读负载能力和写负载能力等。如果使用读写分离,可以使用哨兵,使主从节点的故障切换尽可能自动化,并减少对应用程序的入侵

  • 相关阅读:
    KeBugCheckEx0xD1
    Ti DSP编程入门
    动态链接库
    Hello,world! x86版本
    用回调函数联系两个模块
    DataGrid模版列超级链接列传递参数问题总结(多个参数传递)
    后台代码里执行弹出脚本方法!(Response.Write)
    Oracle数据导入导出imp/exp
    安装sql2000: 出现 A previous program installation created pending file operations on the installation machine. You must restart the computer before running setup
    解决问题:  An unhandled exception of type 'System.Exception' occurred in system.data.oracleclient.dll
  • 原文地址:https://www.cnblogs.com/juddy/p/14817468.html
Copyright © 2020-2023  润新知