redis5.0读写分离,故障切换,主从复制
redis原理
在Redis复制的基础上(不包括由Redis Cluster或Redis Sentinel作为附加层提供的高可用性功能),有一个非常简单的使用和配置领导者跟随者(主从)复制:它允许从属Redis实例准确主实例的副本。每次链接断开时,从站将自动重新连接到主站,并且无论主站发生什么情况,它都会尝试成为它的精确副本。
该系统使用三种主要机制
- 当主实例和从属实例连接良好时,主设备通过向从设备发送命令流来保持从设备更新,以便复制对主设备端发生的数据集的影响,原因是:客户端写入,**已过期或驱逐,更改主数据集的任何其他操作。
- 当主设备和从设备之间的链路中断时,对于网络问题或者由于主设备或从设备中检测到超时,从设备重新连接并尝试继续部分重新同步:这意味着它将尝试仅获取部件它在断开连接时错过的命令流。
- 当无法进行部分重新同步时,从站将要求完全重新同步。这将涉及一个更复杂的过程,其中主机需要创建其所有数据的快照,将其发送到从机,然后在数据集更改时继续发送命令流。
Redis默认使用异步复制,即低延迟和高性能,是绝大多数Redis用例的自然复制模式。但是,Redis从站异步确认它们与主站定期收到的数据量。因此主设备不会每次等待从设备处理命令,但是如果需要,它知道哪个从设备已经处理了什么命令。这允许具有可选的同步复制。
客户端可以使用WAIT命令请求某些数据的同步复制。但是,WAIT只能确保在其他Redis实例中存在指定数量的已确认副本,但它不会将一组Redis实例转换为具有强一致性的CP系统:在故障转移期间,确认的写入仍然可能丢失,具体取决于关于Redis持久性的确切配置。然而,对于WAIT,在故障事件之后丢失写入的概率大大降低到某些难以触发的故障模式。
您可以查看Sentinel或Redis群集文档,以获取有关高可用性和故障转移的更多信息。本文档的其余部分主要描述了Redis基本复制的基本特征。
以下是有关Redis复制的一些非常重要的事实:
- Redis使用异步复制,异步从站到主站确认处理的数据量。
- 主设备可以有多个从设备。
- 奴隶能够接受来自其他奴隶的连接。除了将多个从设备连接到同一主设备之外,从设备还可以以类似级联的结构连接到其他从设备。
- 从Redis 4.0开始,所有子从站将从主站接收完全相同的复制流。
- Redis复制在主端是非阻塞的。这意味着当一个或多个从服务器执行初始同步或部分重新同步时,主服务器将继续处理查询。
- 复制在从属端也很大程度上是非阻塞的。当slave正在执行初始同步时,它可以使用旧版本的数据集处理查询,假设您在redis.conf中配置了Redis。否则,您可以将Redis从属配置为在复制流关闭时向客户端返回错误。但是,在初始同步之后,必须删除旧数据集并且必须加载新数据集。从站将在此简短窗口期间阻止传入连接(对于非常大的数据集,可能长达数秒)。从Redis
4.0开始,可以配置Redis,以便删除旧数据集在不同的线程中发生,但是加载新的初始数据集仍然会在主线程中发生并阻塞从属。 - 复制可用于可伸缩性,以便为只读查询提供多个从站(例如,可以将慢速O(N)操作卸载到从站),或者仅用于提高数据安全性和高可用性。
- 可以使用复制来避免让主服务器将完整数据集写入磁盘的成本:典型的技术是配置主服务器redis.conf以避免持久存储到磁盘,然后连接配置为不时保存的从服务器,或者已启用AOF。但是,必须小心处理此设置,因为重新启动的主服务器将以空数据集开始:如果从服务器尝试与其同步,则从服务器也将被清空。
Redis复制的工作原理
每个Redis主服务器都有一个复制ID:它是一个大的伪随机字符串,用于标记数据集的给定故事。每个主服务器还会为生成的每个复制流字节递增一个偏移量,以便将其发送到从属服务器,以便使用修改数据集的新更改来更新从属服务器的状态。即使没有实际连接的slave,复制偏移也会增加,所以基本上每个给定的对:
Replication ID, offset
标识主数据集的确切版本。
当从站连接到主站时,它们使用该PSYNC命令发送它们的旧主复制ID以及它们到目前为止处理的偏移量。这样主人只能发送所需的增量部分。但是,如果主缓冲区中没有足够的积压,或者从属设备指的是不再知道的历史记录(复制ID),则发生完全重新同步:在这种情况下,从属设备将获得数据集的完整副本, 从头开始。
这是完全同步在更多细节中的工作方式:
主服务器启动后台保存过程以生成RDB文件。同时它开始缓冲从客户端收到的所有新写命令。后台保存完成后,主服务器将数据库文件传输到从服务器,从服务器将其保存在磁盘上,然后将其加载到内存中。然后,主设备将所有缓冲的命令发送到从设备。这是作为命令流完成的,并且与Redis协议本身的格式相同。
您可以通过telnet自己尝试。在服务器执行某些工作时连接到Redis端口并发出SYNC命令。您将看到批量传输,然后主服务器接收的每个命令都将在telnet会话中重新发出。实际上,SYNC是较新的Redis实例不再使用的旧协议,但仍然存在向后兼容性:它不允许部分重新同步,因此现在PSYNC使用它。
如前所述,当主 - 从链路由于某种原因而关闭时,从设备能够自动重新连接。如果主设备接收到多个并发从属同步请求,它将执行单个后台保存以便为所有这些请求提供服务.
实验环境
系统 | 地址 |
---|---|
centtos7主 | 172.20.131.99 |
centos7从 | 172.20.131.97 |
centos7从 | 172.20.141.178 |
安装步骤可以参考上一篇博客地址:安装使用redis5.0
两台从分别设置:
slaveof 172.20.131.99 6379 #设置主连接地址
masterauth 123456 #主机对从机验证密码
requirepass 123456 #redis登录密码
logfile "/var/log/redis.log" #日志文件自定义
主机设置
bind 0.0.0.0 #连接范围地址
requirepass 123456 #redis登录密码
logfile "/var/log/redis.log" #日志文件自定义
现在就实现了主从复制和读写分离,现在进行测试步骤
主进行写入
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> set xiaomage helloworld
OK
127.0.0.1:6379> get xiaomage
"helloworld"
127.0.0.1:6379>
从进行查看同步内容
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> get xiaomage
"helloworld"
127.0.0.1:6379>
Sentinel配置实现主备自动切换
从服务器上分别修改配置文件:sentinel.conf
sentinel monitor mymaster 172.20.131.99 6379 2 #2代表需要有两台以上服务进行检测
sentinel auth-pass mymaster 123456 #主从密码
daemonize yes #no代表前台运行 yes 代表后台
logfile "/var/log/sentinel.log" #日志文件自定义
验证方法
1.查看日志内容
2.查看sentinel.conf文件
3.设置写入数据,可以进行验证,如变量我这里就不演示,
结束
--马国宾 qq 2461375381