zoukankan      html  css  js  c++  java
  • Redis 主从复制

    redis主从复制,是基于集群环境下,有redis 从服务器(slave) 和redis 服务器 (master)  。

    基本的机制:

    当一个 master 实例和一个 slave 实例连接正常时, master 会发送一连串的命令流来保持对 slave 的更新,以便于将自身数据集的改变复制给 slave :包括客户端的写入、key 的过期或被逐出等等。

    当 master 和 slave 之间的连接断开之后,因为网络问题、或者是主从意识到连接超时, slave 重新连接上 master 并会尝试进行部分重同步:这意味着它会尝试只获取在断开连接期间内丢失的命令流。

    当无法进行部分重同步时, slave 会请求进行全量重同步。这会涉及到一个更复杂的过程,例如 master 需要创建所有数据的快照,将之发送给 slave ,之后在数据集更改时持续发送命令流到 slave 。

    也就是主从复在什么条件下进行增量同步,在什么条件下进行全量同步。默认是异步复制的,当然客户端可以使用WAIT 命令来请求同步复制某些特定的数据。

    原理:

    每一个 Redis master 都有一个 replication ID :这是一个较大的伪随机字符串,标记了一个给定的数据集。每个 master 也持有一个偏移量,master 将自己产生的复制流发送给 slave 时,发送多少个字节的数据,自身的偏移量就会增加多少,目的是当有新的操作修改自己的数据集时,它可以以此更新 slave 的状态。复制偏移量即使在没有一个 slave 连接到 master 时,也会自增,所以基本上每一对给定的 Replication ID, offset,都会标识一个 master 数据集的确切版本。

    当 slave 连接到 master 时,它们使用 PSYNC 命令来发送它们记录的旧的 master replication ID 和它们至今为止处理的偏移量。通过这种方式, master 能够仅发送 slave 所需的增量部分。

    但是如果 master 的缓冲区中没有足够的命令积压缓冲记录,或者如果 slave 引用了不再知道的历史记录(replication ID),则会转而进行一个全量重同步:在这种情况下, slave 会得到一个完整的数据集副本,从头开始。

    主从复制过程:

    当配置好 slave 后, slave master 建立连接,然后发送 sync 命令。无论是第一次连接还是 重新连接, master 都会启动一个后台进程,将数据库快照保存到文件中,同时 master 主进
    程会开始收集新的写命令并缓存。后台进程完成写文件后, master 就发送文件给 slave, slave
    将文件保存到硬盘上,再加载到内存中,接着 master 就会把缓存的命令转发给 slave,后续
    master 将收到的写命令发送给 slave。如果 master 同时收到多个 slave 发来的同步连接命令,
    master 只会启动一个进程来写数据库镜像,然后发送给所有的 slave 。


    无需磁盘参与的复制

    正常情况下,一个全量重同步要求在磁盘上创建一个 RDB 文件,然后将它从磁盘加载进内存,然后 slave以此进行数据同步。

    如果磁盘性能很低的话,这对 master 是一个压力很大的操作。Redis 2.8.18 是第一个支持无磁盘复制的版本。在此设置中,子进程直接发送 RDB 文件给 slave,无需使用磁盘作为中间储存介质。

     

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


    在进行主从复制设置时,强烈建议在主服务器上开启持久化,当不能这么做时,比如考虑到延迟的问题,应该将实例配置为避免自动重启。

    为什么不持久化的主服务器自动重启非常危险呢?为了更好的理解这个问题,看下面这个失败的例子,其中主服务器和从服务器中数据库都被删除了。

    1. 我们设置节点A为主服务器,关闭持久化,节点BC从节点A复制数据。
    2. 这时出现了一个崩溃,但Redis具有自动重启系统,重启了进程,因为关闭了持久化,节点重启后只有一个空的数据集。
    3. 节点BC从节点A进行复制,现在节点A是空的,所以节点BC上的复制数据也会被删除。

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

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

    (校对注: 关闭持久化并允许自动重启的主服务器,在做主从同步时,可能导致所有服务器的数据都被清空)

  • 相关阅读:
    Python 常用内置函数
    Java Graphics 2D绘制图片 在Liunx上乱码
    LInux Centos7 重装yum
    Spring Boot 异步调用
    Linux 清除N天前的 日期文件夹(yyyy-MM-dd)
    Python 2.75升级3.6.3
    Linux 移除python Error: Trying to remove “yum”, which is protected
    Java Future 使用场景
    CF446D DZY Loves Games
    三 lambda表达式有什么用
  • 原文地址:https://www.cnblogs.com/junbaba/p/12916984.html
Copyright © 2011-2022 走看看