井冈山保育院网站建设,国外手机网站欣赏,网站建设调查表,建设工程协会网站Redis Replication
1、前言
在单节点搞事情, 存在的问题包括存量问题和增量问题两类, 解决方案就是1个不行上N个, 做到单机维度宕机但服务维度是可用的。
1.1 存量问题
如果目前的单节点QPS满足(也就是综合瓶颈还没达到), 那么只有宕机能影响到。如果业务量不大, 又是出于成…Redis Replication
1、前言
在单节点搞事情, 存在的问题包括存量问题和增量问题两类, 解决方案就是1个不行上N个, 做到单机维度宕机但服务维度是可用的。
1.1 存量问题
如果目前的单节点QPS满足(也就是综合瓶颈还没达到), 那么只有宕机能影响到。如果业务量不大, 又是出于成本考虑, 做好宕机自动重启, 就是可用性差点其他没毛病。
1.2 增量问题
内存资源瓶颈, 单节点的Redis宕机时会导致缓存不可用。比如原来4G, 后来有钱要升级到16G, 因为不能停没法升级;CPU资源瓶颈, CPU的利用率上单台Redis实例只能利用单个核心。综合瓶颈(CPU内存网络带宽), 单节点的Redis能够支撑QPS大概在5W左右超过之后就成为高并发的瓶颈, 然而在单节点上这些都无法升级;
2 复制的作用
2.1 数据冗余
主从复制实现了数据的热备份是持久化之外的一种数据冗余方式。
2.2 故障恢复
当主节点出现了问题可以由从节点提供服务实现快速的故障恢复, 算是一种服务级别的冗余。
2.3 负载均衡
在主从复制的基础上, 配合读写分离, 分担数据读取负载。尤其是在写少读多的情况下通过多个从节点分担读负载可以大大提高redis服务器的并发量。
2.4 高可用基础
除了上述作用以外主从复制还是哨兵和集群能够实施的基础因此说主从复制是Redis高可用的基础。
3. 复制的实现
Redis的复制包括两个阶段, 全量同步和增量同步;
3.1 角色说明
复制包含两个角色, master和slave, 其中slave复制master中的数据;一个master实例可以有多个slave实例;一个slave实例则只能有一个master实例;一个slave实例可以从任何角色的实例上复制数据, 这意味着replication支持级联;
3.2 全量同步
使用场景
slave节点首次同步master数据, 同步内容包含RDB快照, 以及在RDB快照同步期间缓存的数据更新命令(存储在ReplicationBuffer中)。
具体流程 #mermaid-svg-8IWmiyJn78C3s7Ae {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8IWmiyJn78C3s7Ae .error-icon{fill:#552222;}#mermaid-svg-8IWmiyJn78C3s7Ae .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8IWmiyJn78C3s7Ae .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-8IWmiyJn78C3s7Ae .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8IWmiyJn78C3s7Ae .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8IWmiyJn78C3s7Ae .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8IWmiyJn78C3s7Ae .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8IWmiyJn78C3s7Ae .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8IWmiyJn78C3s7Ae .marker.cross{stroke:#333333;}#mermaid-svg-8IWmiyJn78C3s7Ae svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8IWmiyJn78C3s7Ae .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-8IWmiyJn78C3s7Ae text.actortspan{fill:black;stroke:none;}#mermaid-svg-8IWmiyJn78C3s7Ae .actor-line{stroke:grey;}#mermaid-svg-8IWmiyJn78C3s7Ae .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-8IWmiyJn78C3s7Ae .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-8IWmiyJn78C3s7Ae #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-8IWmiyJn78C3s7Ae .sequenceNumber{fill:white;}#mermaid-svg-8IWmiyJn78C3s7Ae #sequencenumber{fill:#333;}#mermaid-svg-8IWmiyJn78C3s7Ae #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-8IWmiyJn78C3s7Ae .messageText{fill:#333;stroke:#333;}#mermaid-svg-8IWmiyJn78C3s7Ae .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-8IWmiyJn78C3s7Ae .labelText,#mermaid-svg-8IWmiyJn78C3s7Ae .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-8IWmiyJn78C3s7Ae .loopText,#mermaid-svg-8IWmiyJn78C3s7Ae .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-8IWmiyJn78C3s7Ae .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-8IWmiyJn78C3s7Ae .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-8IWmiyJn78C3s7Ae .noteText,#mermaid-svg-8IWmiyJn78C3s7Ae .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-8IWmiyJn78C3s7Ae .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-8IWmiyJn78C3s7Ae .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-8IWmiyJn78C3s7Ae .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-8IWmiyJn78C3s7Ae .actorPopupMenu{position:absolute;}#mermaid-svg-8IWmiyJn78C3s7Ae .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-8IWmiyJn78C3s7Ae .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-8IWmiyJn78C3s7Ae .actor-man circle,#mermaid-svg-8IWmiyJn78C3s7Ae line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-8IWmiyJn78C3s7Ae :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} slave master Connect Connected PING PONG 1. PSYNC ? -1 (全量复制) 2. FLULLRSYNC {runset} {offset} (设置当前快照位置) 3.1 save server info 3.2 bgsave RDB (创建快照), 并将之后的命令写入ReplicationBuffer 4. send RDB (发送快照) 5. 对当前DB flushall后基于接收的RDB恢复 6. 发送快照到现在ReplicationBuffer中的命令 7. 回放ReplicationBuffer中的命令 slave master 3.3 增量同步
使用场景
slave节点临时与master节点断开, 后续又建立连接。此时slave节点的offset依然可以在master的ReplicationBacklogBuffer中找到。
具体流程 #mermaid-svg-Nz7c4QwWGNxdSp8U {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Nz7c4QwWGNxdSp8U .error-icon{fill:#552222;}#mermaid-svg-Nz7c4QwWGNxdSp8U .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Nz7c4QwWGNxdSp8U .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Nz7c4QwWGNxdSp8U .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Nz7c4QwWGNxdSp8U .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Nz7c4QwWGNxdSp8U .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Nz7c4QwWGNxdSp8U .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Nz7c4QwWGNxdSp8U .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Nz7c4QwWGNxdSp8U .marker.cross{stroke:#333333;}#mermaid-svg-Nz7c4QwWGNxdSp8U svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Nz7c4QwWGNxdSp8U .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Nz7c4QwWGNxdSp8U text.actortspan{fill:black;stroke:none;}#mermaid-svg-Nz7c4QwWGNxdSp8U .actor-line{stroke:grey;}#mermaid-svg-Nz7c4QwWGNxdSp8U .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Nz7c4QwWGNxdSp8U .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Nz7c4QwWGNxdSp8U #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Nz7c4QwWGNxdSp8U .sequenceNumber{fill:white;}#mermaid-svg-Nz7c4QwWGNxdSp8U #sequencenumber{fill:#333;}#mermaid-svg-Nz7c4QwWGNxdSp8U #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Nz7c4QwWGNxdSp8U .messageText{fill:#333;stroke:#333;}#mermaid-svg-Nz7c4QwWGNxdSp8U .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Nz7c4QwWGNxdSp8U .labelText,#mermaid-svg-Nz7c4QwWGNxdSp8U .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-Nz7c4QwWGNxdSp8U .loopText,#mermaid-svg-Nz7c4QwWGNxdSp8U .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-Nz7c4QwWGNxdSp8U .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Nz7c4QwWGNxdSp8U .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Nz7c4QwWGNxdSp8U .noteText,#mermaid-svg-Nz7c4QwWGNxdSp8U .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-Nz7c4QwWGNxdSp8U .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Nz7c4QwWGNxdSp8U .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Nz7c4QwWGNxdSp8U .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Nz7c4QwWGNxdSp8U .actorPopupMenu{position:absolute;}#mermaid-svg-Nz7c4QwWGNxdSp8U .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-Nz7c4QwWGNxdSp8U .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Nz7c4QwWGNxdSp8U .actor-man circle,#mermaid-svg-Nz7c4QwWGNxdSp8U line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Nz7c4QwWGNxdSp8U :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} slave master Connect Connected 1. PSYNC {runset} {offset} (增量复制) 2. CONTINUE 3. send partical data slave master 4. 配置参数
参数说明replica-ignore-maxmemory在slave节点对带有TTL key的删除依赖于master节点生成的del命令, 因此可能会使用更多的内存。在完全一致的配置参数下可能会有问题, 因此在slave节点建议设置为yesreplica-read-onlyslave节点是否只读replica-lazy-flushslave节点进行全量同步时flush本地DB的过程是同步还是异步repl-ping-replica-periodslave节点与master节点之间的心跳间隔, 保持master和slave的链接有效性replica-serve-stale-data在slave节点与master节点做全量同步过程中, 是否响应client请求repl-backlog-size复制积压缓冲区大小, 每秒产生的命令 *master执行rdb bgsave的时间 (master发送rdb到slave的时间) (slave load rdb文件的时间) 来估算积压缓冲区的大小repl-backlog-size 值不小于这两者的乘积。 例如如果主服务器平均每秒产生1 MB的写数据而从服务器断线之后平均要5秒才能重新连接上主服务器那么复制积压缓冲区的大小就不能低于5MB。为了安全起见可以将复制积压缓冲区的大小设为2*510M这样可以保证绝大部分断线情况都能用增量从而避免全量同步数据。repl-backlog-ttl复制积压缓冲区中命令保持的最长时间repl-timeout全量复制的超时时间, 如果RDB文件比较大, 可能需要调大该数值client-output-buffer-limit不同客户端使用的buffer限制(hard/soft/time),影响全量同步过程中可 normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60。参数值设置太小就会导致replication_buffer不够用新增的数据也就无法存入该缓冲区。在Redis 7.0下, master会提示由于overcoming of output buffer limits而停止数据发送, slave则持续在全量同步阶段等待。 待超时之后, slave重新发起同步, 最终slave永远都无法全量同步成功, 从而影响到整个服务的性能和质量。
5. 极限测试
5.1 slave复制自己
配置操作可以成功;日志显示开启成功连接并响应PING, 然后开始尝试部分复制, 但是没有什么数据可以复制, client断开链接;
Master is currently unable to PSYNC but should be in the future: -NOMASTERLINK Cant SYNC while not connected with my master循环1,2直到timeout, slave认为master无法复制停止;
6. 总结
本文介绍了Redis Replication的作用以及相关的阶段和具体实现希望能帮助你更好地理解Redis Replication的实现感谢您的阅读。