首页 > 编程知识 正文

redis集群如何指定主从,阿里虚拟主机 redis

时间:2023-05-03 18:35:47 阅读:147474 作者:2661

除了Redis复制外,Redis群集、Redis Sentinel除外。 主从复制的使用和配置非常简单,可以从【Redis服务器】(以下简称slave )到【主Redis服务器】(以下简称master )准确复制内容。

每次slave与master之间的连接断开时,slave都会自动重新连接到master,无论在此期间master发生了什么,slave都会尝试使自己成为master的准确副本。

那到底是怎么做的呢?

1从属机构

该系统的运行取决于以下关键机制:

1.1slave更新

对于master和slave 连接正常,master发送一系列命令流以维护slave更新,并将数据集更改(如客户端写入、密钥过期或驱逐)发送到slave

1.2部分重新同步

master和slave断开连接后,由于网络问题或主从设备意识到连接超时,slave将重新连接到master,并尝试部分重新同步,仅检索断开连接期间丢失的指令流

1.3总量再同步

如果无法进行部分重新同步,slave将要求进行全部重新同步。 这更复杂,例如,master需要创建所有数据的快照,将其发送到slave,然后在数据集发生更改时继续发送命令并使其流向slave。

Redis使用默认的异步复制,低延迟、高性能,适用于大多数Redis场景。 但是,slave会异步确认从主周期接收的数据量。

客户端可以使用WAIT命令请求特定数据的同步复制。 但是,WAIT必须确保其他Redis实例有指定数量的已确认副本。 在故障转移过程中,根据各种原因的故障转移和实际的Redis持久性配置,在故障转移过程中确认的写入可能会丢失。

2 Redis复制的特点

Redis使用异步复制

确认slave和master之间异步处理的数据量

主控器可以有多个slave

slave可以接受其他slave的连接

不仅多个slave可以连接到同一个master,而且可以在slave之间分层连接其他slave。 从Redis 4.0开始,所有sub-slave都从master接收完全相同的复制流

Redis复制在主端是非数据块的

当一个或多个slave首次或部分重新同步时,master可以继续处理查询请求

副本在slave端也几乎都是非阻塞的

执行第一次同步时,可以使用旧数据集处理查询请求,假设slave已在Redis.conf中配置为执行redis。 否则,可以将Redis slave配置为在复制流断开时向客户端返回错误。 但是,在第一次同步之后,必须删除旧数据集并加载新数据集。 如果数据集很大,则slave在此短时间内会持续很长时间。 在此时间段内,连接请求将被阻止。 从Redis 4.0开始,可以将Redis配置为在另一个线程上执行删除旧数据集的操作,但加载新数据集的操作仍然必须在主线程上执行,并且会阻止slave

由于复制可用于可伸缩性,因此只读查询可以在多个slave上运行。 例如,可以将o(n )复杂度较低的操作拖放到slave上。 或者,只能用于数据的安全和可用性

使用复制,可以避免主机将所有数据集写入磁盘造成的开销。 一种常见技术是配置master redis.conf并定期保存它,或连接slave以启用AOF,以避免磁盘永久化。 但是,由于重新启动的master从空数据集开始,因此必须小心处理此设置。 如果slave尝试同步,则此slave也将为空

3独立“危机”

容量瓶颈

机器故障

QPS瓶颈

一主多从

3.1主从复制作用

数据复制

提高领导性能

3.2总结

主控器可以有多个slave

一个slave只有一个master

数据流是单向的,master=slave

4实现复制操作

4.1命令: slaveof

异步执行,需要时间

不需要重新启动,但配置不容易管理。

4.2配置

可以批量配置“仅存储端口从属读取”,但需要重新启动。

5全量复印

主节点运行bgsave,并在本地创建RDB快照client-output-buffer-limit slave 256 MB 64m b 60

master将RDB快照发送到salve,用于RDB复制

时间超过60秒(repl-timeout),那么slave就会认为复制失败,可适当调大该参数(对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s)

master在生成RDB时,会将所有新的写命令缓存在内存中,在salve保存了rdb之后,再将新的写命令复制给salve

若在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败

slave node接收到RDB之后,清空自己的旧数据,然后重新加载RDB到自己的内存中,同时基于旧的数据版本对外提供服务

如果slave开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF

RDB生成、RDB通过网络拷贝、slave旧数据的清理、slave aof rewrite,很耗费时间

如果复制的数据量在4G~6G之间,那么很可能全量复制时间消耗到1分半到2分钟

5.1 全量复制开销

bgsave时间

RDB文件网络传输时间

从节点清空数据时间

从节点加载RDB的时间

可能的AOF重写时间

5.2 全量同步细节

master 开启一个后台save进程,以便生成一个 RDB 文件。同时它开始缓冲所有从客户端接收到的新的写入命令。当后台save完成RDB文件时, master 将该RDB数据集文件发给 slave, slave会先将其写入磁盘,然后再从磁盘加载到内存。再然后 master 会发送所有缓存的写命令发给 slave。这个过程以指令流的形式完成并且和 Redis 协议本身的格式相同。

当主从之间的连接因为一些原因崩溃之后, slave 能够自动重连。如果 master 收到了多个 slave 要求同步的请求,它会执行一个单独的后台保存,以便于为多个 slave 服务。

6 增量复制

如果全量复制过程中,master-slave网络连接中断,那么salve重连master时,会触发增量复制

master直接从自己的backlog中获取部分丢失的数据,发送给slave node

msater就是根据slave发送的psync中的offset来从backlog中获取数据的

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。