看那种片哪个网站好用,泉州哪个公司网站做的好,电子商务公司名称起名,好2345浏览器主页很多企业都没有使用到 Redis 的集群#xff0c;但是至少都做了主从。有了主从#xff0c;当 master 挂掉的时候#xff0c;运维让从库过来接管#xff0c;服务就可以继续#xff0c;否则 master 需要经过数据恢复和重启的过程#xff0c;这就可能会拖很长的时间#xff… 很多企业都没有使用到 Redis 的集群但是至少都做了主从。有了主从当 master 挂掉的时候运维让从库过来接管服务就可以继续否则 master 需要经过数据恢复和重启的过程这就可能会拖很长的时间影响线上业务的持续服务。 在了解 Redis 的主从复制之前让我们先来理解一下现代分布式系统的理论基石——CAP 原理。 CAP 原理 CAP 原理就好比分布式领域的牛顿定律它是分布式存储的理论基石。自打 CAP 的论文发表之后分布式存储中间件犹如雨后春笋般一个一个涌现出来。理解这个原理其实很简单本节我们首先对这个原理进行一些简单的讲解。 C - Consistent 一致性 A - Availability 可用性 P - Partition tolerance 分区容忍性 分布式系统的节点往往都是分布在不同的机器上进行网络隔离开的这意味着必然会有网络断开的风险这个网络断开的场景的专业词汇叫着「网络分区」。 在网络分区发生时两个分布式节点之间无法进行通信我们对一个节点进行的修改操作将无法同步到另外一个节点所以数据的「一致性」将无法满足因为两个分布式节点的数据不再保持一致。除非我们牺牲「可用性」也就是暂停分布式节点服务在网络分区发生时不再提供修改数据的功能直到网络状况完全恢复正常再继续对外提供服务。 img 一句话概括 CAP 原理就是——网络分区发生时一致性和可用性两难全。 最终一致 Redis 的主从数据是异步同步的所以分布式的 Redis 系统并不满足「一致性」要求。当客户端在 Redis 的主节点修改了数据后立即返回即使在主从网络断开的情况下主节点依旧可以正常对外提供修改服务所以 Redis 满足「可用性」。 Redis 保证「最终一致性」从节点会努力追赶主节点最终从节点的状态会和主节点的状态将保持一致。如果网络断开了主从节点的数据将会出现大量不一致一旦网络恢复从节点会采用多种策略努力追赶上落后的数据继续尽力保持和主节点一致。 主从同步 Redis 同步支持主从同步和从从同步从从同步功能是 Redis 后续版本增加的功能为了减轻主库的同步负担。后面为了描述上的方便统一理解为主从同步。 img 增量同步 Redis 同步的是指令流主节点会将那些对自己的状态产生修改性影响的指令记录在本地的内存 buffer 中然后异步将 buffer 中的指令同步到从节点从节点一边执行同步的指令流来达到和主节点一样的状态一边向主节点反馈自己同步到哪里了 (偏移量)。 因为内存的 buffer 是有限的所以 Redis 主库不能将所有的指令都记录在内存 buffer 中。Redis 的复制内存 buffer 是一个定长的环形数组如果数组内容满了就会从头开始覆盖前面的内容。 如果因为网络状况不好从节点在短时间内无法和主节点进行同步那么当网络状况恢复时Redis 的主节点中那些没有同步的指令在 buffer 中有可能已经被后续的指令覆盖掉了从节点将无法直接通过指令流来进行同步这个时候就需要用到更加复杂的同步机制 —— 快照同步。 快照同步 快照同步是一个非常耗费资源的操作它首先需要在主库上进行一次 bgsave 将当前内存的数据全部快照到磁盘文件中然后再将快照文件的内容全部传送到从节点。从节点将快照文件接受完毕后立即执行一次全量加载加载之前先要将当前内存的数据清空。加载完毕后通知主节点继续进行增量同步。 在整个快照同步进行的过程中主节点的复制 buffer 还在不停的往前移动如果快照同步的时间过长或者复制 buffer 太小都会导致同步期间的增量指令在复制 buffer 中被覆盖这样就会导致快照同步完成后无法进行增量复制然后会再次发起快照同步如此极有可能会陷入快照同步的死循环。 img 所以务必配置一个合适的复制 buffer 大小参数避免快照复制的死循环。 增加从节点 当从节点刚刚加入到集群时它必须先要进行一次快照同步同步完成后再继续进行增量同步。 无盘复制 主节点在进行快照同步时会进行很重的文件 IO 操作特别是对于非 SSD 磁盘存储时快照会对系统的负载产生较大影响。特别是当系统正在进行 AOF 的 fsync 操作时如果发生快照fsync 将会被推迟执行这就会严重影响主节点的服务效率。 所以从 Redis 2.8.18 版开始支持无盘复制。所谓无盘复制是指主服务器直接通过套接字将快照内容发送到从节点生成快照是一个遍历的过程主节点会一边遍历内存一边将序列化的内容发送到从节点从节点还是跟之前一样先将接收到的内容存储到磁盘文件中再进行一次性加载。 Wait 指令 Redis 的复制是异步进行的wait 指令可以让异步复制变身同步复制确保系统的强一致性 (不严格)。wait 指令是 Redis3.0 版本以后才出现的。 shell复制代码 set key valueOK wait 1 0(integer) 1 wait 提供两个参数第一个参数是从库的数量 N第二个参数是时间 t以毫秒为单位。它表示等待 wait 指令之前的所有写操作同步到 N 个从库 (也就是确保 N 个从库的同步没有滞后)最多等待时间 t。如果时间 t0表示无限等待直到 N 个从库同步完成达成一致。 假设此时出现了网络分区wait 指令第二个参数时间 t0主从同步无法继续进行wait 指令会永远阻塞Redis 服务器将丧失可用性。 小结 主从复制是 Redis 分布式的基础Redis 的高可用离开了主从复制将无从进行。后面的章节我们会开始讲解 Redis 的集群模式这几种集群模式都依赖于本节所讲的主从复制。 不过复制功能也不是必须的如果你将 Redis 只用来做缓存跟 memcache 一样来对待也就无需要从库做备份挂掉了重新启动一下就行。但是只要你使用了 Redis 的持久化功能就必须认真对待主从复制它是系统数据安全的基础保障。 本文由 mdnice 多平台发布