❤️ 之前写过一个redis进阶,好像很受欢迎,今天继续搞起来❤️
❤️ redis集群(一):主从复制全部内容(包括主从复制简介、建立过程、同步数据、命令传播服务区运行id、复制积压缓冲区、复制偏移量、心跳机制、常见问题分析等详细内容)❤️
❤️ 每天进步一点点,加油!!!❤️
又是一个美好的周末,今天更新一下redis集群相关理论基础。对于一个不爱学理论的我来说,感觉好像很难得。好了开整。在互联网中有互联网三大架构:高性能、高并发、高可用(一年时间中服务器宕机的百分比,业界追求目标99.999%,也就是一年中宕机时间低于315秒)。而对于redis如何做到三高呢?
之前写道的redis一直以单机的形式出现,但是单机的redis会存在许多的问题,例如:硬盘司死机、系统崩溃,造成数据丢失等等,或者是内存不足,不停升级(穷,资源跟不上)等等问题。那应该怎么做呢?
为了避免单点redis服务器的故障造成的各种灾难性打击,准备多台服务器,相互连通,将数据赋值到多个副本保存在不同的服务器上,连接在一起,然后保证数据同步,那么哪怕1/2台服务器宕机了,依然可以继续提供服务,实现redis的高可用,同时实现数据的冗余备份。这就出现了redis的主从复制。
主从复制:以数据同步为核心问题出发,将主服务的数据及时、有效的复制到从服务器上。
主:
名称:主服务器、主节点、主库、主客户端
职责:写数据、执行写数据的同时将数据同步到从服务器上,读数据(可忽略)
从:
名称:从服务器、从节点、从库、从客户端
职责:禁止写数据、只做读数据
作用:
读写分离: 主服务器负责读、从而提高服务器的读写负载的能力
负载均衡:基于主从结构、配合读写分离,由于从服务器分担主服务器的负载,并且根据需求变化、改变从服务器的数量,通过多个节点分担数据读取负载,大大提高redis服务器得并发量与数据吞吐量。
故障恢复:主服务器出现问题时候从服务器提供服务,从而实现快速得故障恢复
数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式。
高可用的基石:基于主从复制,构建哨兵模式与集群,实现redis的高可用方案。
1.主要步骤:
图解说明:
从服务器发送指令:slaveof ip port 。主服务器接收命令后做出相应,然后从服务器保存主服务器的ip与端口号。
此时的从服务器知道主服务器存在,但以后要怎么才能和它进行数据交互呢?于是从服务器开启socket,用于以后与master进行RDB文件与相关的数据的传输。之后从服务器开始进行周期性的Ping。主服务器以PANG进行回应。如果设置有密码的的话还需要进行auth password发送,然后主服务器进行权限验证。最后从服务器发送replconflistening-port给主服务器。主服务器保存slave的端口号。
具体案例:
方式一:启动后建立连接:slaveof 127.0.0.1 6384
方式二:启动时建立连接:redis-server 6384.conf --slaveof 127.0.0.1 8384
方式三:配置文件:slaveof 127.0.0.1 6379
断开连接命令: 从服务器发送 slaveof no one
命令启动:
( 看不清图片自己放大看,或者下载下来)
直接启动:
这时候我们需要注意部分复制的核心三要素:
接下来我们详细说说这几个东西:
服务器运行id
复制缓冲区
图解说明:当master接收到一个指令后如标号1(set name test)它会将这个指令拆解开,拆解为标号2格式(类似AOF文件格式)
然后将其每个字节压入复制缓冲区,每个字节值对应一个偏移量。这时候即使发送过程中断电断网只需要记录其偏移量offset,然后进行恢复。
PS:
复制偏移量:
概念:用于描述复制缓冲区的指令的字节位置
分类:master复制偏移量与slave复制偏移量
数据同步+命令传播阶段的工作流程:
图解:当slave第一次与master建立连接的时候由于不知道offset偏移量的位置,所以就发送psync2 ? -1给master,master接收到信息后执行bgsave然后生成RDB文件,并记录offset,随后发送 +FULLRESYNC runid offset。通过socket发送RDB文件给slave,slave收到 +FULLRESYNC 然后保存master的runid和offset,通过RDB恢复数据,现在全局复制结束,此时已经有offset了,然后他就发送命令psync2 runid offset给master,master收命令。判断runid是否匹配,判断offset是否在复制缓冲区中。接着这时候master判断runid或者offset有一个不匹配的话开始执行bgsave然后进行全局复制,如果他们都相同则校验通过,如果offset不同,则发送 +FULLRESYNC offset。通过socket发送缓冲区中的offset数据,然后slave收到 +CONTINUE 后 保存master的offset接收信息,执行bgrewriteaof恢复数据。
前面传播阶段不是要一致依靠着一个反复运行的机制来维护者,这个反复的机制就是心跳机制
什么是心跳机制呢?进入命令传播阶段,master与slave间进行信息交换,使用心跳机制进行维护,实现双方连接保持在线。
安全性:
当slave掉线过多,或者延迟较高,但是为了保证master的数据稳定性,我们可以通过设置参数:
min-slave-to-weite 3
min-slave-max-lag 10
当slave数量少于2个。或者所有的slave的延迟都大于10秒时,强制关闭master的写功能。停止数据同步
(slave数量与延迟都是由slave发送的**REPLCONF ACK **命令做确认)
1、频繁的全量复制:
问题一:随着master的数量越来越大,一旦master重启,ranid将会变化,从而引起全部slave的全量复制操作
内部优化方案:
问题二:网络环境不好没出现网络中断,slave不提供服务。使得复制缓冲区国小,断网后slave的offset月结,从而使slave反复进行全量复制
优化方案:修改缓冲区大小:repl-backlog-size(测算master到slave的重连平均时长或者在系统中master平均每秒产生写命令的总量write_size_per_second,最有缓冲区空间=2 x second x write_size_per_second)
2、频繁的网络中断:
问题一:slave每秒发送的RELCONF ACK命令到master 或者slave进行慢查询(keys *,hgetall等)或者是master每秒调用复制定时函数replicationCron(),然后发现slave长时间没有相应。从而造成master各种资源(输出缓冲区、带宽等)被严重占用,造成master的CPU使用过高或者slave频繁断开连接
优化方案:通过设置合理的超时时间,确认是否释放slave。
repl-timeout 默认大小60秒。超时则释放slave。
问题二:master发送ping指令频度较低或者设定超时间较短,以及ping指令在网络中丢包,造成slave与master连接断开
解决方案:提高ping指令发送的频度。设置:**repl-ping-slave-period **(超时时间repl-timeout的时间至少是ping指令频度的5-10倍。否则slave容易超时)
3、数据不一致:
问题:由于网络信息不同步,数据发送有延迟,从而造成多个slave获取相同数据时出现不同步
解决方案:
❤️往期redis内容:可在博客中直接查看❤️
Redis进阶(事务、锁、删除策略、逐出算法)
Redis搭建与基础知识
redis持久化(RDB与AOF)的方式比较
随便聊聊Redis五种数据格式
Redis进阶:集群–小白的进阶教程(二)(理论+图解+实践:一文了解集群)
❤️ 如有错误欢迎指出❤️
❤️ 点击访问更多个人博客 www.wslhome.top❤️