精华内容
下载资源
问答
  • redis主从复制
    2022-02-12 20:46:14

    主从复制启用

    从节点开启主从复制,有3种方式:

    1. 配置文件: 在从服务器的配置文件中加入:slaveof <masterip> <masterport>

    2. 启动命令: redis-server启动命令后加入 --slaveof <masterip> <masterport>

    3. 客户端命令: Redis服务器启动后,直接通过客户端执行命令:slaveof <masterip>
    <masterport>,则该Redis实例成为从节点。

    通过 info replication 命令可以看到复制的一些信息

    redis主从复制的步骤:

    主从复制过程大体可以分为3个阶段:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段。

    更多相关内容
  • 为了解决Redis主从Copy的问题,有如下两个解决方案: 主动复制所谓主动复制,就是业务层双写多个Redis,避开Redis自带的主从复制。但是自己干同步,就会产生一致性问题,为了保证主从一致,需要加入一系列的验证机制...
  • 主要介绍了使用Docker搭建Redis主从复制的集群,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • 本文主要针对redis主从复制的原理进行了讲解,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 1.复制过程 2.数据间的同步 3.全量复制 4.部分复制 5.心跳 6.异步复制 1.复制过程 从节点执行 ...
  • Redis主从复制以及主从复制技术原理.docx
  • Redis主从复制和集群配置说明
  • 1、生成恶意.so文件,下载RedisModules-ExecuteCommand使用make编译即可生成 1、监听本地1234端口 2、将Redis服务器设置
  • windows下redis主从复制。一个master,两个slave。附带博客介绍https://blog.csdn.net/xixiyuguang/article/details/105121660
  • redis主从复制(csdn)————程序
  • Redis主从复制

    2022-02-12 14:03:55
    博客主页:看看是李XX还是李歘歘 每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点,以及职场小菜鸡的生活。...⛽️今天的内容是 Redis主从复制 ⛽️ 什么是Redis主从复制? ...

    博客主页:🏆看看是李XX还是李歘歘 🏆

    🌺每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点,以及职场小菜鸡的生活。🌺

    💗点关注不迷路,总有一些📖知识点📖是你想要的💗

    本文转载:

    作者:原来是咔咔
    链接:https://juejin.cn/post/6844904178519654414
    来源:稀土掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

    ⛽️今天的内容是    Redis主从复制     ⛽️💻💻💻

    什么是Redis主从复制?

    主从复制就是将主节点(master)redis的数据同步到其他从节点(slave)redis数据库上。

    • 数据的复制是单向的,只能由主节点到从节点。
    • Master以写为主,Slave以读为主。
    • 默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

    为什么需要Redis主从复制?

    单机状态有两个问题:

    1. 服务器宕机,直接导致数据丢失。
    2. 内存问题,一台服务器的内存肯定会到达峰值,不可能对一台服务器进行无限升级的。

    主从复制可以将数据保存在多个服务器上,并且保证每个服务器的数据是同步的。即使有一个服务器宕机了,也不会影响用户的使用。redis可以继续实现高可用、同时实现数据的冗余备份。

    Redis主从复制的作用

    1. 数据冗余:实现了数据的热备份,是持久化之外的另一种方式。
    2. 故障恢复:当主节点(master)出现问题时,可以由从节点(slave)来提供服务,实现了快速恢复故障,也就是服务冗余。
    3. 读写分离:master服务器主要是写,slave主要用来读数据,可以提高服务器的负载能力。同时可以根据需求的变化,添加从节点的数量。
    4. 负载均衡:配合读写分离,有主节点提供写服务,从节点提供读服务,分担服务器负载,尤其在写少读多的情况下,通过多个从节点分担读负载,可以大大提高redis服务器的并发量和负载。
    5. 高可用的基石:主从复制是哨兵和集群能够实施的基础,因此我们可以说主从复制是高可用的基石。

    主从复制工作原理

    1. 主从复制的三个阶段

    主从复制完整的工作流程分为以下三个阶段。每一段都有自己的内部工作流程,那么我们会对这三个过程进行谈论。

    • 建立连接过程:这个过程就是slave跟master连接的过程
    • 数据同步过程:是master给slave同步数据的过程
    • 命令传播过程:是反复同步数据

    2. 第一阶段:建立连接过程

    上图是一个完整主从复制建立连接工作流程。然后使用简短的话语来描述上边的工作流程。

    1. 设置master的地址和端口,保存master的信息
    2. 建立socket连接(这个连接做的事情下文会说)
    3. 持续发送ping命令
    4. 身份验证
    5. 发送slave端口信息

    在建立连接的过程中,从节点会保存master的地址和端口、主节点保存slave的端口。

    3. 第二阶段:数据同步阶段过程

    这张图是详细描述第一次从节点连接主节点时的数据同步过程。

    当从节点第一次连接主节点时,先会执行一次全量复制这次的全量复制是无法避免的。

    全量复制执行完成后,主节点就会发送复制积压缓冲区的数据,然后从节点就会执行bgrewriteaof恢复数据,这也就是部分复制。

    在这个阶段提到了三个新点,全量复制、部分复制、复制缓冲积压区。会在下文的常见问题里详细说明这几个点。

    4. 第三阶段:命令传播阶段

    当master数据库被修改后,主从服务器的数据不一致后,此时就会让主从数据同步到一致,这个过程称之为命令传播。

    master会将接收到的数据变更命令发送给slave,slave接收命令后执行命令,让主从数据达到一致。

    命令传播阶段的部分复制

    • 在命令传播阶段出现断网的情况,或者网络抖动时会导致连接断开(connection lost)

    • 这个时候主节点master还是会继续往replbackbuffer(复制缓冲积压区)写数据

    • 从节点会继续尝试连接主机(connect to master)

    • 当从节点把自己的runid和复制偏移量发送给主节点,并且执行pysnc命令同步

    • 如果master判断偏移量是在复制缓冲区范围内,就会返回continue命令。并且发送复制缓冲区的数据给从节点。

    • 从节点接收数据执行bgrewriteaof,恢复数据

    详细介绍主从复制原理(全量复制+部分复制)

    这个过程就是主从复制最齐全的流程讲解。那么下来我们对每一步进程简单的介绍

    1. 从节点发送指令psync ? 1 psync runid offset 找对应的runid索取数据。但是这里可以考虑一下,当从节点第一次连接的时候根本就不知道主节点的runid 和 offset 。所以第一次发送的指令是psync ? 1意思就是主节点的数据我全要。
    2. 主节点开始执行bgsave生成RDB文件,记录当前的复制偏移量offset
    3. 主节点这个时候会把自己的runid 和 offset 通过 +FULLRESYNC runid offset 指令 通过socket发送RDB文件给从节点。
    4. 从节点接收到+FULLRESYNC 保存主节点的runid和offset 然后清空当前所有数据,通过socket接收RDB文件,开始恢复RDB数据。
    5. 在全量复制后,从节点已经获取到了主节点的runid和offset,开始发送指令 psync runid offset
    6. 主节点接收指令,判断runid是否匹配,判断offset是否在复制缓冲区中。
    7. 主节点判断runid和offset有一个不满足,就会在返回到步骤2继续执行全量复制。这里的runid不匹配只有的可能是从节点重启了这个问题后边会解决,offset(偏移量)不匹配就是复制积压缓冲区溢出了。 如果runid或offset校验通过,从节点的offset和主节点的offset相同时则忽略。 如果runid或offset检验通过,从节点的offset与offset不相同,则会发送 +CONTINUE offset(这个offset为主节点的),通过socket发送复制缓冲区中从节点offset到主节点offset的数据。
    8. 从节点收到+CONTINUE 保存master的offset 通过socket接收到信息后,执行bgrewriteaof,恢复数据。

    1-4是全量复制 5-8是部分复制

    在主节点的第3步下面 主节点在主从复制的期间是一直在接收客户端的数据,主节点的offset是一直变化的。只有有变化就会给每个slave进行发送,这个发送的过程称之为心跳机制

    心跳机制

    在命令传播阶段,主节点与从节点之间一直都需要进行信息互换,使用心跳机制进行维护,实现主节点和从节点连接保持在线。

    • master心跳

      • 指令:ping
      • 默认10秒进行一次,是由参数repl-ping-slave-period决定的
      • 主要做的事情就是判断从节点是否在线
      • 可以使用info replication 来查看从节点租后一次连接时间的间隔,lag为0或者为1就是正常状态。
    • slave心跳任务

      • 指令:replconf ack {offset}
      • 每秒执行一次
      • 主要做的事情是给主节点发送自己的复制偏移量,从主节点获取到最新的数据变更命令,还做一件事情就是判断主节点是否在线。

    心跳阶段的注意事项 主节点为保障数据稳定性,当从节点挂掉的数量或者延迟过高时。将会拒绝所有信息同步。

    这里有俩个参数可以进行配置调整:

    min-slaves-to-write 2

    min-slaves-max-lag 8

    这俩个参数表示从节点的数量就剩余2个,或者从节点的延迟大于8秒时,主节点就会强制关闭maste功能,停止数据同步。

    那么主节点是如何知道从节点挂掉的数量和延迟时间呢! 在心跳机制里边slave 会每隔一秒发送perlconf ack 这个指令,这个指令可携带偏移量,也可以携带从节点的延迟时间和从节点的数量。

    部分复制的三个核心要素

    1. 服务器的运行id (run id)

    我们先看一下这个run id是什么,info命令即可看到。在文中我们查看启动日志信息也可以看到。 

    redis在启动时会自动生成一个随机的id(这里需要注意的是每次启动的id都会不一样),是由40个随机的十六进制字符串组成,用来唯一识别一个redis节点。 在主从复制初次启动时,master会把自己的runid发送给slave,slave会保存master的这个id,我们可以使用info命令查看 

    当断线重连时,slave把这个id发送给master,如果slave保存的runid与master现在的runid相同,master会尝试使用部分复制(这块能否复制成功还有一个因素就是偏移量)。如果slave保存的runid与master现在的runid不同,则会直接进行全量复制。

    2. 复制积压缓冲区

    复制缓冲积压区是一个先进先出的队列,用户存储master收集数据的命令记录。复制缓冲区的默认存储空间是1M。 可以在配置文件修改repl-backlog-size 1mb来控制缓冲区大小,这个比例可以根据自己的服务器内存来修改。

    复制缓冲区到底存储的是什么?

    当执行一个命令为set name kaka时,我们可以查看持久化文件查看

    那么复制积压缓冲区就是存储的aof持久化的数据,并且以字节分开,并且每个字节都有自己的偏移量。这个偏移量也就是复制偏移量(offset)

    那为什么会说复制缓冲积压区有可能会导致全量复制呢 在命令传播阶段,主节点会把收集的数据存储到复制缓冲区中,然后在发送给从节点。就是这里出现了问题,当主节点数据量在一瞬间特别大的时候,超出了复制缓冲区的内存,就会有一部分数据会被挤出去,从而导致主节点和从节点的数据不一致。从而进行全量复制。如果这个缓冲区大小设置不合理那么很大可能会造成死循环,从节点就会一直全量复制,清空数据,全量复制。

    3. 复制偏移量(offset)

    主节点复制偏移量是给从节点发送一次记录一次,从节点是接收一次记录一次。 用于同步信息,对比主节点和从节点的差异,当slave断联时恢复数据使用。 这个值也就是来自己于复制缓冲积压区里边的那个偏移量。

    主从复制常见的问题

    1. 主节点重启问题(内部优化)

    当主节点重启后,runid的值将发生变化,会导致所有的从节点进行全量复制。

    这个问题我们无需考虑,知道系统是怎么优化的即可。

    在建立完主从复制后主节点会创建master-replid变量,这个生成的策略跟runid一样,长度是41位,runid长度是40位,然后发送给从节点。

    在主节点执行shutdown save命令时,进行了一次RDB持久化会把runid 和 offset保存到RDB文件中。可以使用命令redis-check-rdb查看该信息。

    主节点重启后加载RDB文件,将文件中的repl-id 和repl-offset加载到内存中。纵使让所有从节点认为还是之前的主节点。

    2. 从节点网络中断偏移量越界导致全量复制

    由于网络环境不佳,从节点网络中断。复制积压缓冲区内存过小导致数据溢出,伴随着从节点偏移量越界,导致全量复制。有可能会导致反复的全量复制。

    解决方案:修改复制积压缓冲区的大小:repl-backlog-size

    设置建议:测试主节点连接从节点的时间,获取主节点每秒平均产生的命令总量write_size_per_second

    复制缓冲区空间设置 = 2 * 主从连接时间 * 主节点每秒产生的数据总量

    3. 频繁的网路中断

    由于主节点的cpu占用过高,或者从节点频繁连接。出现这种情况造成的结果就是主节点各种资源被严重占用,其中包括但不限于缓冲区,宽带,连接等。

    为什么会出现主节点资源被严重占用?

    在心跳机制中,从节点每秒会发送一个指令replconf ack指令到主节点。 从节点执行了慢查询,占用大量的cpu 主节点每秒调用复制定时函数replicationCron,然后从节点长时间没有相应。

    解决方案:

    设置从节点超时释放

    设置参数:repl-timeout

    这个参数默认为60秒。超过60秒,释放slave。

    4. 数据不一致问题

    由于网络因素,多个从节点的数据会不一致。这个因素是没有办法避免的。

    关于这个问题给出俩个解决方案:

    第一个数据需要高度一致配置一台redis服务器,读写都用一台服务器,这种方式仅限于少量数据,并且数据需高度一直。

    第二个监控主从节点的偏移量,如果从节点的延迟过大,暂时屏蔽客户端对该从节点的访问。设置参数为slave-serve-stale-data yes|no。 这个参数一但设置就只能响应info slaveof等少数命令。

    5. 从节点故障

    这个问题直接在客户端维护一个可用节点列表,当从节点故障时,切换到其他节点进行工作,这个问题在后边集群会说到。


    作者:原来是咔咔
    链接:https://juejin.cn/post/6844904178519654414
    来源:稀土掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 

    展开全文
  • Redis 主从复制

    千次阅读 2022-03-12 19:24:45
    又来图解 Redis 啦。 我在前两篇已经给大家图解了 AOF 和 RDB,这两个持久化技术保证了即使在服务器重启的情况下也不会丢失数据(或少量损失)。 不过,由于数据都是存储在一台服务器上,如果出事就完犊子了,比如:...

    大家好,我是小林哥。

    又来图解 Redis 啦。

    我在前两篇已经给大家图解了 AOF 和 RDB,这两个持久化技术保证了即使在服务器重启的情况下也不会丢失数据(或少量损失)。

    不过,由于数据都是存储在一台服务器上,如果出事就完犊子了,比如:

    • 如果服务器发生了宕机,由于数据恢复是需要点时间,那么这个期间是无法服务新的请求的;
    • 如果这台服务器的硬盘出现了故障,可能数据就都丢失了。

    要避免这种单点故障,最好的办法是将数据备份到其他服务器上,让这些服务器也可以对外提供服务,这样即使有一台服务器出现了故障,其他服务器依然可以继续提供服务。

    图片

    多台服务器要保存同一份数据,这里问题就来了。

    这些服务器之间的数据如何保持一致性呢?数据的读写操作是否每台服务器都可以处理?

    Redis 提供了主从复制模式,来避免上述的问题。

    这个模式可以保证多台服务器的数据一致性,且主从服务器之间采用的是「读写分离」的方式。

    主服务器可以进行读写操作,当发生写操作时自动将写操作同步给从服务器,而从服务器一般是只读,并接受主服务器同步过来写操作命令,然后执行这条命令。

    图片

    也就是说,所有的数据修改只在主服务器上进行,然后将最新的数据同步给从服务器,这样就使得主从服务器的数据是一致的。

    同步这两个字说的简单,但是这个同步过程并没有想象中那么简单,要考虑的事情不是一两个。

    我们先来看看,主从服务器间的第一次同步是如何工作的?

    第一次同步

    多台服务器之间要通过什么方式来确定谁是主服务器,或者谁是从服务器呢?

    我们可以使用 replicaof(Redis 5.0 之前使用 slaveof)命令形成主服务器和从服务器的关系。

    比如,现在有服务器 A 和 服务器 B,我们在服务器 B 上执行下面这条命令:

    # 服务器 B 执行这条命令
    replicaof <服务器 A 的 IP 地址> <服务器 A 的 Redis 端口号>
    

    接着,服务器 B 就会变成服务器 A 的「从服务器」,然后与主服务器进行第一次同步。

    主从服务器间的第一次同步的过程可分为三个阶段:

    • 第一阶段是建立链接、协商同步;
    • 第二阶段是主服务器同步数据给从服务器;
    • 第三阶段是主服务器发送新写操作命令给从服务器。

    为了让你更清楚了解这三个阶段,我画了一张图。

    图片

    接下来,我在具体介绍每一个阶段都做了什么。

    第一阶段:建立链接、协商同步

    执行了 replicaof 命令后,从服务器就会给主服务器发送 psync 命令,表示要进行数据同步。

    psync 命令包含两个参数,分别是主服务器的 runID复制进度 offset

    • runID,每个 Redis 服务器在启动时都会自动生产一个随机的 ID 来唯一标识自己。当从服务器和主服务器第一次同步时,因为不知道主服务器的 run ID,所以将其设置为 “?”。
    • offset,表示复制的进度,第一次同步时,其值为 -1。

    主服务器收到 psync 命令后,会用 FULLRESYNC 作为响应命令返回给对方。

    并且这个响应命令会带上两个参数:主服务器的 runID 和主服务器目前的复制进度 offset。从服务器收到响应后,会记录这两个值。

    FULLRESYNC 响应命令的意图是采用全量复制的方式,也就是主服务器会把所有的数据都同步给从服务器。

    所以,第一阶段的工作时为了全量复制做准备。

    那具体怎么全量同步呀呢?我们可以往下看第二阶段。

    第二阶段:主服务器同步数据给从服务器

    接着,主服务器会执行 bgsave 命令来生成 RDB 文件,然后把文件发送给从服务器。

    从服务器收到 RDB 文件后,会先清空当前的数据,然后载入 RDB 文件。

    这里有一点要注意,主服务器生成 RDB 这个过程是不会阻塞主线程的,也就是说 Redis 依然可以正常处理命令。

    但是这期间的写操作命令并没有记录到刚刚生成的 RDB 文件中,这时主从服务器间的数据就不一致了。

    那么为了保证主从服务器的数据一致性,主服务器会将在 RDB 文件生成后收到的写操作命令,写入到 replication buffer 缓冲区里。

    第三阶段:主服务器发送新写操作命令给从服务器

    在主服务器生成的 RDB 文件发送后,然后将 replication buffer 缓冲区里所记录的写操作命令发送给从服务器,然后从服务器重新执行这些操作。

    至此,主从服务器的第一次同步的工作就完成了。

    命令传播

    主从服务器在完成第一次同步后,双方之间就会维护一个 TCP 连接。

    图片

    后续主服务器可以通过这个连接继续将写操作命令传播给从服务器,然后从服务器执行该命令,使得与主服务器的数据库状态相同。

    而且这个连接是长连接的,目的是避免频繁的 TCP 连接和断开带来的性能开销。

    上面的这个过程被称为基于长连接的命令传播,通过这种方式来保证第一次同步后的主从服务器的数据一致性。

    分摊主服务器的压力

    在前面的分析中,我们可以知道主从服务器在第一次数据同步的过程中,主服务器会做两件耗时的操作:生成 RDB 文件和传输 RDB 文件。

    主服务器是可以有多个从服务器的,如果从服务器数量非常多,而且都与主服务器进行全量同步的话,就会带来两个问题:

    • 由于是通过 bgsave 命令来生成 RDB 文件的,那么主服务器就会忙于使用 fork() 创建子进程,如果主服务器的内存数据非大,在执行 fork() 函数时是会阻塞主线程的,从而使得 Redis 无法正常处理请求;
    • 传输 RDB 文件会占用主服务器的网络带宽,会对主服务器响应命令请求产生影响。

    这种情况就好像,刚创业的公司,由于人不多,所以员工都归老板一个人管,但是随着公司的发展,人员的扩充,老板慢慢就无法承担全部员工的管理工作了。

    要解决这个问题,老板就需要设立经理职位,由经理管理多名普通员工,然后老板只需要管理经理就好。

    Redis 也是一样的,从服务器可以有自己的从服务器,我们可以把拥有从服务器的从服务器当作经理角色,它不仅可以接收主服务器的同步数据,自己也可以同时作为主服务器的形式将数据同步给从服务器,组织形式如下图:

    图片

    通过这种方式,主服务器生成 RDB 和传输 RDB 的压力可以分摊到充当经理角色的从服务器

    那具体怎么做到的呢?

    其实很简单,我们在「从服务器」上执行下面这条命令,使其作为目标服务器的从服务器:

    replicaof <目标服务器的IP> 6379
    

    此时如果目标服务器本身也是「从服务器」,那么该目标服务器就会成为「经理」的角色,不仅可以接受主服务器同步的数据,也会把数据同步给自己旗下的从服务器,从而减轻主服务器的负担。

    增量复制

    主从服务器在完成第一次同步后,就会基于长连接进行命令传播。

    可是,网络总是不按套路出牌的嘛,说延迟就延迟,说断开就断开。

    如果主从服务器间的网络连接断开了,那么就无法进行命令传播了,这时从服务器的数据就没办法和主服务器保持一致了,客户端就可能从「从服务器」读到旧的数据。

    图片

    那么问题来了,如果此时断开的网络,又恢复正常了,要怎么继续保证主从服务器的数据一致性呢?

    在 Redis 2.8 之前,如果主从服务器在命令同步时出现了网络断开又恢复的情况,从服务器就会和主服务器重新进行一次全量复制,很明显这样的开销太大了,必须要改进一波。

    所以,从 Redis 2.8 开始,网络断开又恢复后,从主从服务器会采用增量复制的方式继续同步,也就是只会把网络断开期间主服务器接收到的写操作命令,同步给从服务器。

    网络恢复后的增量复制过程如下图:

    图片

    主要有三个步骤:

    • 从服务器在恢复网络后,会发送 psync 命令给主服务器,此时的 psync 命令里的 offset 参数不是 -1;
    • 主服务器收到该命令后,然后用 CONTINUE 响应命令告诉从服务器接下来采用增量复制的方式同步数据;
    • 然后主服务将主从服务器断线期间,所执行的写命令发送给从服务器,然后从服务器执行这些命令。

    那么关键的问题来了,主服务器怎么知道要将哪些增量数据发送给从服务器呢?

    答案藏在这两个东西里:

    • repl_backlog_buffer,是一个「环形」缓冲区,用于主从服务器断连后,从中找到差异的数据;
    • replication offset,标记上面那个缓冲区的同步进度,主从服务器都有各自的偏移量,主服务器使用 master_repl_offset 来记录自己「」到的位置,从服务器使用 slave_repl_offset 来记录自己「」到的位置。

    那repl_backlog_buffer 缓冲区是什么时候写入的呢?

    在主服务器进行命令传播时,不仅会将写命令发送给从服务器,还会将写命令写入到 repl_backlog_buffer 缓冲区里,因此 这个缓冲区里会保存着最近传播的写命令。

    网络断开后,当从服务器重新连上主服务器时,从服务器会通过 psync 命令将自己的复制偏移量 slave_repl_offset 发送给主服务器,主服务器根据自己的 master_repl_offset 和 slave_repl_offset 之间的差距,然后来决定对从服务器执行哪种同步操作:

    • 如果判断出从服务器要读取的数据还在 repl_backlog_buffer 缓冲区里,那么主服务器将采用增量同步的方式;
    • 相反,如果判断出从服务器要读取的数据已经不存在
      repl_backlog_buffer 缓冲区里,那么主服务器将采用全量同步的方式。

    当主服务器在 repl_backlog_buffer 中找到主从服务器差异(增量)的数据后,就会将增量的数据写入到 replication buffer 缓冲区,这个缓冲区我们前面也提到过,它是缓存将要传播给从服务器的命令。

    图片

    repl_backlog_buffer 缓行缓冲区的默认大小是 1M,并且由于它是一个环形缓冲区,所以当缓冲区写满后,主服务器继续写入的话,就会覆盖之前的数据。

    因此,当主服务器的写入速度远超于从服务器的读取速度,缓冲区的数据一下就会被覆盖。

    那么在网络恢复时,如果从服务器想读的数据已经被覆盖了,主服务器就会采用全量同步,这个方式比增量同步的性能损耗要大很多。

    因此,为了避免在网络恢复时,主服务器频繁地使用全量同步的方式,我们应该调整下 repl_backlog_buffer 缓冲区大小,尽可能的大一些,减少出现从服务器要读取的数据被覆盖的概率,从而使得主服务器采用增量同步的方式。

    那 repl_backlog_buffer 缓冲区具体要调整到多大呢?

    repl_backlog_buffer 最小的大小可以根据这面这个公式估算。

    图片

    我来解释下这个公式的意思:

    • second 为从服务器断线后重新连接上主服务器所需的平均 时间(以秒计算)。
    • write_size_per_second 则是主服务器平均每秒产生的写命令数据量大小。

    举个例子,如果主服务器平均每秒产生 1 MB 的写命令,而从服务器断线之后平均要 5 秒才能重新连接主服务器。

    那么 repl_backlog_buffer 大小就不能低于 5 MB,否则新写地命令就会覆盖旧数据了。

    当然,为了应对一些突发的情况,可以将 repl_backlog_buffer 的大小设置为此基础上的 2 倍,也就是 10 MB。

    关于 repl_backlog_buffer 大小修改的方法,只需要修改配置文件里下面这个参数项的值就可以。

    repl-backlog-size 1mb
    

    总结

    主从复制共有三种模式:全量复制、基于长连接的命令传播、增量复制

    主从服务器第一次同步的时候,就是采用全量复制,此时主服务器会两个耗时的地方,分别是生成 RDB 文件和传输 RDB 文件。为了避免过多的从服务器和主服务器进行全量复制,可以把一部分从服务器升级为「经理角色」,让它也有自己的从服务器,通过这样可以分摊主服务器的压力。

    第一次同步完成后,主从服务器都会维护着一个长连接,主服务器在接收到写操作命令后,就会通过这个连接将写命令传播给从服务器,来保证主从服务器的数据一致性。

    如果遇到网络断开,增量复制就可以上场了,不过这个还跟 repl_backlog_size 这个大小有关系。

    如果它配置的过小,主从服务器网络恢复时,可能发生「从服务器」想读的数据已经被覆盖了,那么这时就会导致主服务器采用全量复制的方式。所以为了避免这种情况的频繁发生,要调大这个参数的值,以降低主从服务器断开后全量同步的概率。

    展开全文
  • (一)Redis集群的主从复制 概念 主从备份,防止主机宕机 读写分离,分担master的任务 任务分离,如从服务节点分担备份与计算工作 主从复制特点 1:master 可以拥有多个 slave 2:多个 slave 可以连接同一个 master ...
  • Redis主从复制原理总结

    千次阅读 2022-02-14 11:58:38
    Redis主从复制原理Redis主从复制原理全量同步增量同步Redis主从同步策略注意点主从复制的一些特点:Redis主从同步是怎么实现的?主从同步中需要注意几个问题当主服务器不进行持久化时复制的安全性Redis主从复制是...

    Redis主从复制原理

    和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构。
    在这里插入图片描述

    全量同步

    Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:

    • 从服务器连接主服务器,发送SYNC命令;
    • 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
    • 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
    • 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
    • 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
    • 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
      在这里插入图片描述
      完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。

    增量同步

    Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
    增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

    Redis主从同步策略

    主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

    注意点

    如果多个Slave断线了,需要重启的时候,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会导致Master IO剧增宕机。

    Redis主从复制的配置十分简单,它可以使从服务器是主服务器的完全拷贝。需要清除Redis主从复制的几点重要内容:

    1. Redis使用异步复制。但从Redis 2.8开始,从服务器会周期性的应答从复制流中处理的数据量。
    2. 一个主服务器可以有多个从服务器。
    3. 从服务器也可以接受其他从服务器的连接。除了多个从服务器连接到一个主服务器之外,多个从服务器也可以连接到一个从服务器上,形成一个图状结构。
    4. Redis主从复制不阻塞主服务器端。也就是说当若干个从服务器在进行初始同步时,主服务器仍然可以处理请求。
    5. 主从复制也不阻塞从服务器端。当从服务器进行初始同步时,它使用旧版本的数据来应对查询请求,假设你在redis.conf配置文件是这么配置的。否则的话,你可以配置当复制流关闭时让从服务器给客户端返回一个错误。但是,当初始同步完成后,需要删除旧的数据集和加载新的数据集,在这个短暂的时间内,从服务器会阻塞连接进来的请求。
    6. 主从复制可以用来增强扩展性,使用多个从服务器来处理只读的请求(比如,繁重的排序操作可以放到从服务器去做),也可以简单的用来做数据冗余。
    7. 使用主从复制可以为主服务器免除把数据写入磁盘的消耗:在主服务器的redis.conf文件中配置“避免保存”(注释掉所有“保存“命令),然后连接一个配置为“进行保存”的从服务器即可。但是这个配置要确保主服务器不会自动重启

    主从复制的一些特点:

    1. 采用异步复制;
    2. 一个主redis可以含有多个从redis;
    3. 每个从redis可以接收来自其他从redis服务器的连接;
    4. 主从复制对于主redis服务器来说是非阻塞的,这意味着当从服务器在进行主从复制同步过程中,主redis仍然可以处理外界的访问请求;
    5. 主从复制对于从redis服务器来说也是非阻塞的,这意味着,即使从redis在进行主从复制过程中也可以接受外界的查询请求,只不过这时候从redis返回的是以前老的数据,如果你不想这样,那么在启动redis时,可以在配置文件中进行设置,那么从redis在复制同步过程中来自外界的查询请求都会返回错误给客户端;(虽然说主从复制过程中对于从redis是非阻塞的,但是当从redis从主redis同步过来最新的数据后还需要将新数据加载到内存中,在加载到内存的过程中是阻塞的,在这段时间内的请求将会被阻,但是即使对于大数据集,加载到内存的时间也是比较多的);
    6. 主从复制提高了redis服务的扩展性,避免单个redis服务器的读写访问压力过大的问题,同时也可以给为数据备份及冗余提供一种解决方案;
    7. 为了编码主redis服务器写磁盘压力带来的开销,可以配置让主redis不在将数据持久化到磁盘,而是通过连接让一个配置的从redis服务器及时的将相关数据持久化到磁盘,不过这样会存在一个问题,就是主redis服务器一旦重启,因为主redis服务器数据为空,这时候通过主从同步可能导致从redis服务器上的数据也被清空;

    Redis主从同步是怎么实现的?

    全量同步:
    master服务器会开启一个后台进程用于将redis中的数据生成一个rdb文件,与此同时,服务器会缓存所有接收到的来自客户端的写命令(包含增、删、改),当后台保存进程处理完毕后,会将该rdb文件传递给slave服务器,而slave服务器会将rdb文件保存在磁盘并通过读取该文件将数据加载到内存,在此之后master服务器会将在此期间缓存的命令通过redis传输协议发送给slave服务器,然后slave服务器将这些命令依次作用于自己本地的数据集上最终达到数据的一致性。

    部分同步:
    从redis 2.8版本以前,并不支持部分同步,当主从服务器之间的连接断掉之后,master服务器和slave服务器之间都是进行全量数据同步,但是从redis 2.8开始,即使主从连接中途断掉,也不需要进行全量同步,因为从这个版本开始融入了部分同步的概念。部分同步的实现依赖于在master服务器内存中给每个slave服务器维护了一份同步日志和同步标识,每个slave服务器在跟master服务器进行同步时都会携带自己的同步标识和上次同步的最后位置。当主从连接断掉之后,slave服务器隔断时间(默认1s)主动尝试和master服务器进行连接,如果从服务器携带的偏移量标识还在master服务器上的同步备份日志中,那么就从slave发送的偏移量开始继续上次的同步
    操作,如果slave发送的偏移量已经不再master的同步备份日志中(可能由于主从之间断掉的时间比较长或者在断掉的短暂时间内master服务器接收到大量的写操作),则必须进行一次全量更新。在部分同步过程中,master会将本地记录的同步备份日志中记录的指令依次发送给slave服务器从而达到数据一致。

    主从同步中需要注意几个问题

    1. 在上面的全量同步过程中,master会将数据保存在rdb文件中然后发送给slave服务器,但是如果master上的磁盘空间有效怎么办呢?那么此时全部同步对于master来说将是一份十分有压力的操作了。此时可以通过无盘复制来达到目的,由master直接开启一个socket将rdb文件发送给slave服务器。(无盘复制一般应用在磁盘空间有限但是网络状态良好的情况下)
    2. 主从复制结构,一般slave服务器不能进行写操作,但是这不是死的,之所以这样是为了更容易的保证主和各个从之间数据的一致性,如果slave服务器上数据进行了修改,那么要保证所有主从服务器都能一致,可能在结构上和处理逻辑上更为负责。不过你也可以通过配置文件让从服务器支持写操作。(不过所带来的影响还得自己承担哦。。。)
    3. 主从服务器之间会定期进行通话,但是如果master上设置了密码,那么如果不给slave设置密码就会导致slave不能跟master进行任何操作,所以如果你的master服务器上有密码,那么也给slave相应的设置一下密码吧(通过设置配置文件中的masterauth);
    4. 关于slave服务器上过期键的处理,由master服务器负责键的过期删除处理,然后将相关删除命令已数据同步的方式同步给slave服务器,slave服务器根据删除命令删除本地的key。

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

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

    • 为什么不持久化的主服务器自动重启非常危险呢?
      为了更好的理解这个问题,看下面这个失败的例子,其中主服务器和从服务器中数据库都被删除了。
    1. 设置节点A为主服务器,关闭持久化,节点B和C从节点A复制数据。
    2. 这时出现了一个崩溃,但Redis具有自动重启系统,重启了进程,因为关闭了持久化,节点重启后只有一个空的数据集。
    3. 节点B和C从节点A进行复制,现在节点A是空的,所以节点B和C上的复制数据也会被删除。
    4. 当在高可用系统中使用Redis Sentinel,关闭了主服务器的持久化,并且允许自动重启,这种情况是很危险的。
    5. 比如主服务器可能在很短的时间就完成了重启,以至于Sentinel都无法检测到这次失败,那么上面说的这种失败的情况就发生了。
    6. 如果数据比较重要,并且在使用主从复制时关闭了主服务器持久化功能的场景中,都应该禁止实例自动重启。

    Redis主从复制是如何工作的

    • 如果设置了一个从服务器,在连接时它发送了一个SYNC命令,不管它是第一次连接还是再次连接都没有关系。
    • 然后主服务器开始后台存储,并且开始缓存新连接进来的修改数据的命令。当后台存储完成后,主服务器把数据文件发送到从服务器,
      从服务器将其保存在磁盘上,然后加载到内存中。然后主服务器把刚才缓存的命令发送到从服务器。这是作为命令流来完成的,并且
      和Redis协议本身格式相同。
    • 你可以通过telnet自己尝试一下。在Redis服务器工作时连接到Redis端口,发送SYNC命令,会看到一个批量的传输,并且主服务器接收
      的每一个命令都会通过telnet会话重新发送一遍。
    • 当主从服务器之间的连接由于某些原因断开时,从服务器可以自动进行重连接。当有多个从服务器同时请求同步时,主服务器只进行一个后台存储。
    • 当连接断开又重新连上之后,一般都会进行一个完整的重新同步,但是从Redis2.8开始,只重新同步一部分也可以。

    部分重新同步

    从Redis 2.8开始,如果遭遇连接断开,重新连接之后可以从中断处继续进行复制,而不必重新同步。
    它的工作原理是这样:
    主服务器端为复制流维护一个内存缓冲区(in-memory backlog)。主从服务器都维护一个复制偏移量(replication offset)和master run id ,当连接断开时,从服务器会重新连接上主服务器,然后请求继续复制,假如主从服务器的两个master run id相同,并且指定的偏移量在内存缓冲区中还有效,复制就会从上次中断的点开始继续。如果其中一个条件不满足,就会进行完全重新同步(在2.8版本之前就是直接进行完全重新同步)。因为主运行id不保存在磁盘中,如果从服务器重启了的话就只能进行完全同步了。
    部分重新同步这个新特性内部使用PSYNC命令,旧的实现中使用SYNC命令。Redis2.8版本可以检测出它所连接的服务器是否支持PSYNC命令,不支持的话使用SYNC命令。

    无磁盘复制

    • 通常来讲,一个完全重新同步需要在磁盘上创建一个RDB文件,然后加载这个文件以便为从服务器发送数据。
    • 如果使用比较低速的磁盘,这种操作会给主服务器带来较大的压力。Redis从2.8.18版本开始尝试支持无磁盘的复制。
    • 使用这种设置时,子进程直接将RDB通过网络发送给从服务器,不使用磁盘作为中间存储。

    配置

    • 主从复制的配置十分简单:把下面这行加入到从服务器的配置文件中即可。
    • slaveof 192.168.1.1 6379
    • 当然你需要把其中的192.168.1.1 6379替换为你自己的主服务器IP(或者主机名hostname)和端口。另外你可以调用SLAVEOF命令,
      主服务器就会开始与从服务器同步。
    • 关于部分重新同步,还有一些针对复制内存缓冲区的优化参数。查看Redis介质中的Redis.conf示例获得更多信息。
    • 使用repl-diskless-sync配置参数来启动无磁盘复制。使用repl-diskless-sync-delay 参数来配置传输开始的延迟时间,以便等待
      更多的从服务器连接上来。查看Redis介质中的Redis.conf示例获得更多信息。

    只读从服务器

    从Redis 2.6开始,从服务器支持只读模式,并且是默认模式。这个行为是由Redis.conf文件中的slave-read-only 参数控制的,
    可以在运行中通过CONFIG SET来启用或者禁用。

    只读的从服务器会拒绝所有写命令,所以对从服务器不会有误写操作。但这不表示可以把从服务器实例暴露在危险的网络环境下,
    因为像DEBUG或者CONFIG这样的管理命令还是可以运行的。不过你可以通过使用rename-command命令来为这些命令改名来增加安全性。

    你可能想知道为什么只读限制还可以被还原,使得从服务器还可以进行写操作。虽然当主从服务器进行重新同步或者从服务器重启后,
    这些写操作都会失效,还是有一些使用场景会想从服务器中写入临时数据的,但将来这个特性可能会被去掉。

    限制有N个以上从服务器才允许写入

    从Redis 2.8版本开始,可以配置主服务器连接N个以上从服务器才允许对主服务器进行写操作。但是,因为Redis使用的是异步主从复制,
    没办法确保从服务器确实收到了要写入的数据,所以还是有一定的数据丢失的可能性。

    这一特性的工作原理如下:

    1. 从服务器每秒钟ping一次主服务器,确认处理的复制流数量。
    2. 主服务器记住每个从服务器最近一次ping的时间。
    3. 用户可以配置最少要有N个服务器有小于M秒的确认延迟。
    4. 如果有N个以上从服务器,并且确认延迟小于M秒,主服务器接受写操作。
      还可以把这看做是CAP原则(一致性,可用性,分区容错性)不严格的一致性实现,虽然不能百分百确保一致性,但至少保证了丢失的数据不会超过M秒内的数据量。
      如果条件不满足,主服务器会拒绝写操作并返回一个错误。
    5. min-slaves-to-write(最小从服务器数)
    6. min-slaves-max-lag(从服务器最大确认延迟)

    通过redis实现服务器崩溃等数据恢复

    由于redis存储在内存中且提供一般编程语言常用的数据结构存储类型,所以经常被用于做服务器崩溃宕机的数据恢复处理。服务器可以在某些指定过程中将需要保存的数据以json对象等方式存储到redis中,也就是我们常说的快照,当服务器运行时读取redis来判断是否有待需要恢复数据继续处理的业务。当一次业务处理结束后再删除redis的数据即可。redis提供两种将内存数据导出到硬盘实现数据备份的方法:
    1) RDB方式(默认)
    RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上。进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间和改动的键的个数。当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。RDB是redis默认采用的持久化方式,在配置文件中已经预置了3个条件:
    save 900 1 #900秒内有至少1个键被更改则进行快照
    save 300 10 #300秒内有至少10个键被更改则进行快照
    save 60 10000 #60秒内有至少10000个键被更改则进行快照

    可以存在多个条件,条件之间是"或"的关系,只要满足其中一个条件,就会进行快照。 如果想要禁用自动快照,只需要将所有的save参数删除即可。
    Redis默认会将快照文件存储在当前目录(可CONFIG GET dir来查看)的dump.rdb文件中,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。
    Redis实现快照的过程

    • Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);
    • 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件;
    • 当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成。
    • 在执行fork的时候操作系统(类Unix操作系统)会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时(如执行一个写命令 ),操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork一刻的内存数据。

    Redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。这使得我们可以通过定时备份RDB文件来实 现Redis数据库备份。RDB文件是经过压缩(可以配置rdbcompression参数以禁用压缩节省CPU占用)的二进制格式,所以占用的空间会小于内存中的数据大小,更加利于传输。

    除了自动快照,还可以手动发送SAVE或BGSAVE命令让Redis执行快照,两个命令的区别在于,前者是由主进程进行快照操作,会阻塞住其他请求,后者会通过fork子进程进行快照操作。 Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将一个记录一千万个字符串类型键、大小为1GB的快照文件载入到内 存中需要花费20~30秒钟。 通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。
    2)AOF方式
    默认情况下Redis没有开启AOF(append only file)方式的持久化,可以在redis.conf中通过appendonly参数开启:
    appendonly yes
    在启动时Redis会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存中,载入的速度相较RDB会慢一些

    开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:
    appendfilename appendonly.aof
    配置redis自动重写AOF文件的条件

    auto-aof-rewrite-percentage 100 # 当目前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据

    auto-aof-rewrite-min-size 64mb # 允许重写的最小AOF文件大小
    配置写入AOF文件后,要求系统刷新硬盘缓存的机制

    appendfsync always # 每次执行写入都会执行同步,最安全也最慢
    appendfsync everysec # 每秒执行一次同步操作

    appendfsync no # 不主动进行同步操作,而是完全交由操作系统来做(即每30秒一次),最快也最不安全

    Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。此时重新启动Redis后Redis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少。

    展开全文
  • redis服务配置,配置redis主从复制,多个哨兵监控redis主服务,自动切换服务
  • Redis主从复制的搭建

    2022-08-09 14:40:22
    Redis是一个高性能的缓存中间件,一个Redis...为了分担读写的压力和减轻服务器的负担,可以搭建Redis主从架构。主服务器可以进行读写,从服务器只对外提供读的功能。从服务器的数据是由主服务器同步过来。 .........
  • Redis主从复制与Redis集群前言一、主从复制1.是什么?2 能干嘛3 怎么玩:主从复制4 新建redis*.conf配置文件5.主从集群常用3种1 主从模式一:一主二从2 主从模式二:薪火相传3 主从模式三:反客为主6 复制原理7 哨兵...
  • Redis主从复制详解

    2021-01-19 22:44:38
    Redis主从复制的作用 提供数据副本 扩展读性能 配置方法 通过命令 通过配置文件 演示 为方便演示,在一台服务器上搭建redis主从(生产上不会这样做),根据端口区分。 主库 6379 从库 6380 编辑配置文件  vi redis...
  • 文章目录Redis主从复制主从复制的作用:主从复制流程:搭建Redis主从复制Redis哨兵模式搭建Redis哨兵模式 Redis主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要...
  • Redis主从复制原理

    万次阅读 2021-01-10 23:26:24
    一、为什么需要主从复制: 1、单台Redis节点的局限性: (1)单节点的Redis能够支撑QPS大概在5万左右,如果上千万的用户访问,Redis就承载不了,成为了高并发的瓶颈。 (2)内存上,单个Redis的内存不宜过大,...
  • 一篇文章学会Redis主从复制的搭建
  • Redis——Redis主从复制(工作流程详解)

    万次阅读 多人点赞 2021-04-18 20:53:12
    Redis主从复制主从复制简介主从复制的概念主从复制的作用主从复制工作流程阶段一:建立连接阶段主从连接(slave连接master)第一种方式第二种方式第三种方式授权访问阶段二:数据同步阶段工作流程数据同步阶段master...
  • redis主从复制活动图

    2016-01-07 16:08:55
    描述redis主从复制的过程中的各种细节,包括各个阶段所使用的事件处理函数
  • Redis主从复制和哨兵模式

    千次阅读 2022-04-05 23:04:57
    Redis主从复制和哨兵模式一、Redis主从复制1. 为什么要搭建主从模式:2. 主从搭建步骤:第一步:第二步:第三步:第四步:第五步:启动从机第六步:启动6380的客户端二、 Redis哨兵模式1. 哨兵模式是什么:2. 哨兵的...
  • Redis主从复制及其实现原理

    千次阅读 2021-09-24 11:36:45
    Redis主从复制及其实现原理 首先,简单介绍一下什么是Redis主从复制。 假如我们服务中用到了Redis,并且只有一台Redis服务器。如果某个时刻该Redis服务挂了,那么会导致整个服务的Redis不可用,在此期间,大量的请求...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,421
精华内容 32,568
关键字:

redis主从复制