如何保证Redis的高并发

48次阅读
没有评论

共计 3652 个字符,预计需要花费 10 分钟才能阅读完成。

自动写代码机器人,免费开通

丸趣 TV 小编给大家分享一下如何保证 Redis 的高并发,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

如何保证 Redis 的高并发

单机的 redis 几乎不太可能说 QPS 超过 10 万 +,一般在几万。

除非一些特殊情况,比如你的机器性能特别好,配置特别高,物理机,维护做的特别好,而且你的整体的操作不是太复杂。

如何保证 Redis 的高并发

Redis 通过主从架构,实现读写分离,主节点负责写,并将数据同步给其他从节点,从节点负责读,从而实现高并发。

Redis 高并发的同时,还需要容纳大量的数据:一主多从,每个实例都容纳了完整的数据,比如 redis 主就 10G 的内存量,其实你就最对只能容纳 10g 的数据量。如果你的缓存要容纳的数据量很大,达到了几十 g,甚至几百 g,或者是几 t,那你就需要 redis 集群,而且用 redis 集群之后,可以提供可能每秒几十万的读写并发。

replication 的核心机制

redis 采用异步方式复制数据到 slave 节点,不过 redis 2.8 开始,slave node 会周期性地确认自己每次复制的数据量
一个 master node 是可以配置多个 slave node 的
slave node 也可以连接其他的 slave node
slave node 做复制的时候,是不会 block master node 的正常工作的
slave node 在做复制的时候,也不会 block 对自己的查询操作,它会用旧的数据集来提供服务; 但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了
slave node 主要用来进行横向扩容,做读写分离,扩容的 slave node 可以提高读的吞吐量

master 持久化对于主从架构的安全保障的意义

如果采用了主从架构,那么建议必须开启 master node 的持久化!

不建议用 slave node 作为 master node 的数据热备,因为那样的话,如果你关掉 master 的持久化,可能在 master 宕机重启的时候数据是空的,然后可能一经过复制,salve node 数据也丢了

第二个,master 的各种备份方案,要不要做,万一说本地的所有文件丢失了; 从备份中挑选一份 rdb 去恢复 master; 这样才能确保 master 启动的时候,是有数据的

如何保证 Redis 的高并发

master 同步数据给 slave 的过程

当启动一个 slave node 的时候,它会发送一个 PSYNC 命令给 master node

如果这是 slave node 重新连接 master node,那么 master node 仅仅会复制给 slave 部分缺少的数据; 否则如果是 slave node 第一次连接 master node,那么会触发一次 full resynchronization

开始 full resynchronization 的时候,master 会启动一个后台线程,开始生成一份 RDB 快照文件,同时还会将从客户端收到的所有写命令缓存在内存中。

RDB 文件生成完毕之后,master 会将这个 RDB 发送给 slave,slave 会先写入本地磁盘,然后再从本地磁盘加载到内存中。然后 master 会将内存中缓存的写命令发送给 slave,slave 也会同步这些数据。

slave node 如果跟 master node 有网络故障,断开了连接,会自动重连。master 如果发现有多个 slave node 都来重新连接,仅仅会启动一个 rdb save 操作,用一份数据服务所有 slave node。

主从复制的断点续传

从 redis 2.8 开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份

master node 会在内存中常见一个 backlog,master 和 slave 都会保存一个 replica offset 还有一个 master id,offset 就是保存在 backlog 中的。

如果 master 和 slave 网络连接断掉了,slave 会让 master 从上次的 replica offset 开始继续复制

但是如果没有找到对应的 offset,那么就会执行一次 resynchronization

无磁盘化复制

master 在内存中直接创建 rdb,然后发送给 slave,不会在自己本地落地磁盘了

repl-diskless-sync
repl-diskless-sync-delay,等待一定时长再开始复制,因为要等更多 slave 重新连接过来

过期 key 处理

slave 不会过期 key,只会等待 master 过期 key。

如果 master 过期了一个 key,或者通过 LRU 淘汰了一个 key,那么会模拟一条 del 命令发送给 slave。

复制的完整流程

slave node 启动,仅仅保存 master node 的信息,包括 master node 的 host 和 ip(redis.conf 里面的 slaveof 配置的),但是复制流程没开始

slave node 内部有个定时任务,每秒检查是否有新的 master node 要连接和复制,如果发现,就跟 master node 建立 socket 网络连接
slave node 发送 ping 命令给 master node
口令认证,如果 master 设置了 requirepass,那么 salve node 必须发送 masterauth 的口令过去进行认证
master node 第一次执行全量复制,将所有数据发给 slave node
master node 后续持续将写命令,异步复制给 slave node

数据同步相关的核心机制

指的就是第一次 slave 连接 msater 的时候,执行的全量复制,那个过程里面你的一些细节的机制

(1)master 和 slave 都会维护一个 offset

master 会在自身不断累加 offset,slave 也会在自身不断累加 offset
slave 每秒都会上报自己的 offset 给 master,同时 master 也会保存每个 slave 的 offset

这个倒不是说特定就用在全量复制的,主要是 master 和 slave 都要知道各自的数据的 offset,才能知道互相之间的数据不一致的情况

(2)backlog

master node 有一个 backlog,默认是 1MB 大小
master node 给 slave node 复制数据时,也会将数据在 backlog 中同步写一份
backlog 主要是用来做全量复制中断候的增量复制的

(3)master run id

info server,可以看到 master run id
如果根据 host+ip 定位 master node,是不靠谱的,如果 master node 重启或者数据出现了变化,那么 slave node 应该根据不同的 run id 区分,run id 不同就做全量复制
如果需要不更改 run id 重启 redis,可以使用 redis-cli debug reload 命令

(4)psync

从节点使用 psync 从 master node 进行复制,psync runid offset
master node 会根据自身的情况返回响应信息,可能是 FULLRESYNC runid offset 触发全量复制,可能是 CONTINUE 触发增量复制

全量复制

master 执行 bgsave,在本地生成一份 rdb 快照文件
master node 将 rdb 快照文件发送给 salve node,如果 rdb 复制时间超过 60 秒(repl-timeout),那么 slave node 就会认为复制失败,可以适当调节大这个参数
对于千兆网卡的机器,一般每秒传输 100MB,6G 文件,很可能超过 60s
master node 在生成 rdb 时,会将所有新的写命令缓存在内存中,在 salve node 保存了 rdb 之后,再将新的写命令复制给 salve node
client-output-buffer-limit slave 256MB 64MB 60,如果在复制期间,内存缓冲区持续消耗超过 64MB,或者一次性超过 256MB,那么停止复制,复制失败
slave node 接收到 rdb 之后,清空自己的旧数据,然后重新加载 rdb 到自己的内存中,同时基于旧的数据版本对外提供服务
如果 slave node 开启了 AOF,那么会立即执行 BGREWRITEAOF,重写 AOF

增量复制

如果全量复制过程中,master-slave 网络连接断掉,那么 salve 重新连接 master 时,会触发增量复制
master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node,默认 backlog 就是 1MB
msater 就是根据 slave 发送的 psync 中的 offset 来从 backlog 中获取数据的

heartbeat

主从节点互相都会发送 heartbeat 信息

master 默认每隔 10 秒发送一次 heartbeat,salve node 每隔 1 秒发送一个 heartbeat

异步复制

master 每次接收到写命令之后,现在内部写入数据,然后异步发送给 slave node

看完了这篇文章,相信你对如何保证 Redis 的高并发有了一定的了解,想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

向 AI 问一下细节

丸趣 TV 网 – 提供最优质的资源集合!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-18发表,共计3652字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)