建设外贸网站公司,青岛百度网站排名优化,免费行情网站推荐,百度知道首页目录 主从复制
1.配置主从复制
2.主从复制中的拓扑结构
3.主从复制原理
4.主从复制总结 主从复制 在分布式系统中为了解决单点问题#xff0c;通常会把数据复制多个副本部署到其他服务器#xff0c;满⾜故障恢复和负载均衡等需求。Redis 也是如此#xff0c;它为我们提…目录 主从复制
1.配置主从复制
2.主从复制中的拓扑结构
3.主从复制原理
4.主从复制总结 主从复制 在分布式系统中为了解决单点问题通常会把数据复制多个副本部署到其他服务器满⾜故障恢复和负载均衡等需求。Redis 也是如此它为我们提供了复制的功能实现了相同数据的多个 Redis 副本。复制功能是⾼可⽤ Redis 的基础哨兵和集群都是在复制的基础上构建的。本篇文章主要从以下三个方面介绍主从复制 介绍复制的使⽤⽅式如何建⽴或断开复制、安全性、只读等。 说明复制可⽀持的拓扑结构以及每个拓扑结构的适⽤场景。 分析复制的原理包括建⽴复制、全量复制、部分复制、⼼跳检测等。 1.配置主从复制
配置连接 参与复制的 Redis 实例划分为主节点master和从节点slave。每个从结点只能有⼀个主节点⽽⼀个主节点可以同时具有多个从结点。复制的数据流是单向的只能由主节点到从节点。配置复制的⽅式有以下三种 在配置⽂件中加⼊ slaveof {masterHost} {masterPort} 随 Redis 启动⽣效。 在 redis-server 启动命令时加⼊ --slaveof {masterHost} {masterPort} ⽣效。 直接使⽤ redis 命令slaveof {masterHost} {masterPort} ⽣效。
接下来我们将 redis.conf 配置⽂件复制⼀份 redis-slave.conf并且修改其 daemonize 为 yes。
接下来默认启动的 redis 作为主 Redis重新通过命令⾏启动⼀个 Redis 实例作为从 Redis
# ubuntu
redis-server /etc/redis/redis-slave.conf --port 6380 --slaveof 127.0.0.1 6379
tips修改配置文件需要修改的是从机的配置主机配置不变。
接下来通过 netstat -nlpt 观察两个 Redis 是否已正确启动。 通过 redis-cli 可以连接主 Redis 实例通过 redis-cli -p 6380 连接从 Redis。并且可以观察复制关系。info replication 命令查看复制相关状态。 断开连接 slaveof 命令不但可以建⽴复制还可以在从节点执⾏ slaveof no one 来断开与主节点复制关系。例如在 6380 节点上执⾏ slaveof no one 来断开复制。 从节点与主节点断开复制连接后会自动晋升为主节点并不会抛弃原有数据只是无法再获取主节点上的数据变化。 通过 slaveof 命令还可以实现切换主节点操作将当前从节点的数据源切换到另⼀个主节点。执⾏slaveof {newMasterIp} {newMasterPort} 命令即可。 切主操作主要流程1断开与旧主节点复制关系。2与新主节点建⽴复制关系。3删除从节点当前所有数据。4从新主节点进⾏复制操作。 安全性 对于数据⽐较重要的节点主节点会通过设置 requirepass 参数进⾏密码验证这时所有的客⼾端访问必须使⽤ auth 命令实⾏校验。从节点与主节点的复制连接是通过⼀个特殊标识的客⼾端来完成因此需要配置从节点的masterauth 参数与主节点密码保持⼀致这样从节点才可以正确地连接到主节点并发起复制流程。 配置只读 默认情况下从节点使⽤ slave-read-onlyyes 配置为只读模式。由于复制只能从主节点到从节点对于从节点的任何修改主节点都⽆法感知修改从节点会造成主从数据不⼀致。所以建议线上不要修改从节点的只读模式。 传输延迟 主从节点⼀般部署在不同机器上复制时的⽹络延迟就成为需要考虑的问题Redis 为我们提供了 repl-disable-tcp-nodelay 参数⽤于控制是否关闭 TCP_NODELAY默认为 no即开启 tcp-nodelay 功能说明如下 当关闭时主节点产⽣的命令数据⽆论⼤⼩都会及时地发送给从节点这样主从之间延迟会变小但增加了⽹络带宽的消耗。适⽤于主从之间的⽹络环境良好的场景如同机房部署。 当开启时主节点会合并较⼩的 TCP 数据包从⽽节省带宽。默认发送时间间隔取决于 Linux 的内核⼀般默认为 40 毫秒。这种配置节省了带宽但增⼤主从之间的延迟。适⽤于主从⽹络环境复杂的场景如跨机房部署。 2.主从复制中的拓扑结构 Redis 的复制拓扑结构可以⽀持单层或多层复制关系根据拓扑复杂性可以分为以下三种⼀主一从、⼀主多从、树状主从结构。 一主一从结构 ⼀主⼀从结构是最简单的复制拓扑结构⽤于主节点出现宕机时从节点提供故障转移⽀持如图所示。当应⽤写命令并发量较⾼且需要持久化时可以只在从节点上开启 AOF这样既可以保证数据安全性同时也避免了持久化对主节点的性能⼲扰。但需要注意的是当主节点关闭持久化功能时如果主节点宕机要避免⾃动重启操作。 一主多从结构 ⼀主多从结构星形结构使得应⽤端可以利⽤多个从节点实现读写分离如下图 所⽰。对于读⽐重较⼤的场景可以把读命令负载均衡到不同的从节点上来分担压⼒。同时⼀些耗时的读命令可以指定⼀台专⻔的从节点执⾏避免破坏整体的稳定性。对于写并发量较⾼的场景多个从节点会导致主节点写命令的多次发送从⽽加重主节点的负载。 树形主从结构 树形主从结构分层结构使得从节点不但可以复制主节点数据同时可以作为其他从节点的主节点继续向下层复制。通过引⼊复制中间层可以有效降低住系欸按负载和需要传送给从节点的数据量如下图所示。数据写⼊节点 A 之后会同步给 B 和 C 节点B 节点进⼀步把数据同步给 D 和 E 节点。当主节点需要挂载等多个从节点时为了避免对主节点的性能⼲扰可以采⽤这种拓扑结构。 3.主从复制原理
从节点与主节点建立连接到完成复制的过程大致可以分为六个阶段分别是
保存主节点信息主从建立连接发送ping命令权限验证同步数据集命令持续复制
1保存主节点master的信息。开始配置主从同步关系之后从节点只保存主节点的地址信息此时建⽴复制流程还没有开始在从节点 6380 执⾏ info replication 可以看到相关信息。其中主节点的 ip 和 port 被保存下来但是主节点的连接状态master_link_status是下线状态。 2从节点slave内部通过每秒运⾏的定时任务维护复制相关逻辑当定时任务发现存在新的主节点后会尝试与主节点建⽴基于 TCP 的⽹络连接。如果从节点⽆法建⽴连接定时任务会⽆限重试直到连接成功或者⽤⼾停⽌主从复制。 3发送 ping 命令。连接建⽴成功之后从节点通过 ping 命令确认主节点在应⽤层上是⼯作良好的。如果 ping 命令的结果 pong 回复超时从节点会断开 TCP 连接等待定时任务下次重新建立连接。 4权限验证。如果主节点设置了 requirepass 参数则需要密码验证从节点通过配置 masterauth参数来设置密码。如果验证失败则从节点的复制将会停止。 5同步数据集。对于⾸次建⽴复制的场景主节点会把当前持有的所有数据全部发送给从节点这步操作基本是耗时最⻓的所以⼜划分称两种情况全量同步和部分同步下⼀节重点介绍。 6命令持续复制。当从节点复制了主节点的所有数据之后针对之后的修改命令主节点会持续的把命令发送给从节点从节点执⾏修改命令保证主从数据的⼀致性。 Redis使用psync命令来完成主从数据同步同步过程分为部分复制和全量复制。
全量复制⼀般⽤于初次复制场景Redis 早期⽀持的复制功能只有全量复制它会把主节点全部数据⼀次性发送给从节点当数据量较⼤时会对主从节点和⽹络造成很⼤的开销。 部分复制⽤于处理在主从复制中因⽹络闪断等原因造成的数据丢失场景当从节点再次连上主节点后如果条件允许主节点会补发数据给从节点。因为补发的数据远小于全量数据可以有效避免全量复制的过⾼开销。
PSYNC replicationid offset 如果 replicationid 设为 ? 并且 offset 设为 -1 此时就是在尝试进⾏全量复制。 如果 replicationid offset 设为了具体的数值, 则是尝试进⾏部分复制。 replicationidreplid/复制id 主节点的复制 id. 主节点重新启动, 或者从节点晋级成主节点, 都会⽣成⼀个 replicationid. (同⼀个节点, 每次重启, ⽣成的 replicationid 也会变化).从节点在和主节点建⽴连接之后, 就会获取到主节点的 replicationid. 通过 info replication 即可看到 replicationid。 offset偏移量 参与复制的主从节点都会维护⾃⾝复制偏移量。主节点master在处理完写⼊命令后会把命令的字节⻓度做累加记录统计信息在 info replication 中的 master_repl_offset 指标中。从节点slave每秒钟上报⾃⾝的复制偏移量给主节点因此主节点也会保存从节点的复制偏移量 从节点在接受到主节点发送的命令后也会累加记录⾃⾝的偏移量。统计信息在 info replication中的slave_repl_offset 指标中。通过对⽐主从节点的复制偏移量可以判断主从节点数据是否⼀致。 replid offset 共同标识了⼀个 数据集.如果两个节点, 他们的 replid 和 offset 都相同, 则这两个节点上持有的数据, 就⼀定相同. psync的运行流程图 主节点根据 psync 参数和⾃⾝数据情况决定响应结果 如果回复 FULLRESYNC replid offset则从节点需要进⾏全量复制流程。 如果回复 CONTINEU从节点进⾏部分复制流程。 如果回复 -ERR说明 Redis 主节点版本过低不⽀持 psync 命令。从节点可以使⽤ sync 命令进⾏全量复制。
实时复制 主从节点在建⽴复制连接后主节点会把⾃⼰收到的 修改操作 , 通过 tcp ⻓连接的⽅式, 源源不断的传输给从节点. 从节点就会根据这些请求来同时修改⾃⾝的数据. 从⽽保持和主节点数据的⼀致性.这样的⻓连接, 需要通过⼼跳包的⽅式来维护连接状态. (这⾥的⼼跳是指应⽤层⾃⼰实现的⼼跳,⽽不是 TCP ⾃带的⼼跳). 1主从节点彼此都有⼼跳检测机制各⾃模拟成对⽅的客⼾端进⾏通信。 2主节点默认每隔 10 秒对从节点发送 ping 命令判断从节点的存活性和连接状态。 3从节点默认每隔 1 秒向主节点发送 replconf ack {offset} 命令给主节点上报⾃⾝当前的复制偏移量。 如果主节点发现从节点通信延迟超过 repl-timeout 配置的值默认 60 秒则判定从节点下线断开复制客⼾端连接。从节点恢复连接后⼼跳机制继续进⾏。 4.主从复制总结 主从复制解决的问题 单点问题即 单个 redis 节点, 可⽤性不⾼. 单个 redis 节点, 性能有限. 主从复制的特点 Redis 通过复制功能实现主节点的多个副本。 主节点⽤来写, 从节点⽤来读. 这样做可以降低主节点的访问压⼒。复制⽀持多种拓扑结构可以在适当的场景选择合适的拓扑结构。 复制分为全量复制, 部分复制和实时复制。 主从节点之间通过心跳机制保证主从节点通信正常和数据⼀致性。 主从复制配置的过程 主节点配置不需要改动。从节点在配置⽂件中加⼊ slaveof 主节点ip 主节点端口的形式即可。 ❤️ 我是小皮侠谢谢大家都能看到这里 主页已更新Java基础内容数据结构基础数据库算法 未来会更新Java项目SpringBootRedis以及各种Java路线会用到的技术。 求点赞求收藏求评论求关注 ♀️谢谢大家