zoukankan      html  css  js  c++  java
  • 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集群同时提高读负载能力和写负载能力等。如果使用读写分离,可以使用哨兵,使主从节点的故障切换尽可能自动化,并减少对应用程序的入侵

  • 相关阅读:
    1442. Count Triplets That Can Form Two Arrays of Equal XOR
    1441. Build an Array With Stack Operations
    312. Burst Balloons
    367. Valid Perfect Square
    307. Range Sum Query
    1232. Check If It Is a Straight Line
    993. Cousins in Binary Tree
    1436. Destination City
    476. Number Complement
    383. Ransom Note
  • 原文地址:https://www.cnblogs.com/juddy/p/14817468.html
Copyright © 2011-2022 走看看