共计 4311 个字符,预计需要花费 11 分钟才能阅读完成。
自动写代码机器人,免费开通
这篇文章主要介绍了 Redis 中高可用和高并发机制是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。
一、高并发机制
我们知道 redis 是基于单线程的,在单机模式下能承载的也就几万左右吧,所以怎么提高其在大数据下几十万的高并发请求,通过 redis 的主从架构和读写分离。
1. 主从复制
redis 主从复制的配置就不强调,主要看主从复制的原理及过程:在进行 redis 的主从复制的过程中,需要一台 master 主机作为管理员,去搭建多台 slave 从机。当 slave 从机试图启动时会向 master 主机发送一个命令 PSYNC, 如果这个时候 slave 从机是重新连接的,那么会从 master 主机上把 slave 从机没有的数据复制过去,如果是第一次连接那么会触发 full resynchronization。触发以后 master 主机会在后台开启一个进程去生成一个 RDB 快照文件,同时将这个时间段的写操作存入缓存,当这个 RDB 文件生成完毕之后会向 slave 从机发送 RDB 文件,从机拿到文件之后将其先写入磁盘然后加载进入内存最后 master 主机会将缓存在内存里面的数据也同时发送给从机。如果在发生主从的网络故障的情况下,有多个 slave 从机重新连接那么 master 只会重启一份 RDB 去服务全部 slave。
断点续传:在 master 和 slave 里面都有一个 replica offset 里面还有一个 master id,其中 offset 就是保持在 backlog,当主从机发生网络故障重连时,会去找到对应的上次 replica offset 的地方进行复制,如果没有找到对应的 offset 那么触发 full resynchronization。
①复制的完整流程
(1)slave node 启动,仅仅保存 master node 的信息,包括 master node 的 host 和 ip,但是复制流程没开始
master host 和 ip 是从哪儿来的,redis.conf 里面的 slaveof 配置的
(2)slave node 内部有个定时任务,每秒检查是否有新的 master node 要连接和复制,如果发现,就跟 master node 建立 socket 网络连接
(3)slave node 发送 ping 命令给 master node
(4)口令认证,如果 master 设置了 requirepass,那么 salve node 必须发送 masterauth 的口令过去进行认证
(5)master node 第一次执行全量复制,将所有数据发给 slave node
(6)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 触发增量复制
③全量复制
(1)master 执行 bgsave,在本地生成一份 rdb 快照文件
(2)master node 将 rdb 快照文件发送给 salve node,如果 rdb 复制时间超过 60 秒(repl-timeout),那么 slave node 就会认为复制失败,可以适当调节大这个参数
(3)对于千兆网卡的机器,一般每秒传输 100MB,6G 文件,很可能超过 60s
(4)master node 在生成 rdb 时,会将所有新的写命令缓存在内存中,在 salve node 保存了 rdb 之后,再将新的写命令复制给 salve node
(5)client-output-buffer-limit slave 256MB 64MB 60,如果在复制期间,内存缓冲区持续消耗超过 64MB,或者一次性超过 256MB,那么停止复制,复制失败
(6)slave node 接收到 rdb 之后,清空自己的旧数据,然后重新加载 rdb 到自己的内存中,同时基于旧的数据版本对外提供服务
(7)如果 slave node 开启了 AOF,那么会立即执行 BGREWRITEAOF,重写 AOF
rdb 生成、rdb 通过网络拷贝、slave 旧数据的清理、slave aof rewrite,很耗费时间
如果复制的数据量在 4G~6G 之间,那么很可能全量复制时间消耗到 1 分半到 2 分钟
④增量复制
(1)如果全量复制过程中,master-slave 网络连接断掉,那么 salve 重新连接 master 时,会触发增量复制
(2)master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node,默认 backlog 就是 1MB
(3)msater 就是根据 slave 发送的 psync 中的 offset 来从 backlog 中获取数据的
⑤heartbeat
主从节点互相都会发送 heartbeat 信息
master 默认每隔 10 秒发送一次 heartbeat,salve node 每隔 1 秒发送一个 heartbeat
⑥异步复制
master 每次接收到写命令之后,现在内部写入数据,然后异步发送给 slave node
2. 读写分离:master 负责写入操作,slave 负责帮 master 减轻访问查询量
二、高可用机制
在高并发的情况下,配备多集群一主多备,虽然可以解决高并发问题,但是主机只有一个,master 宕机那么整个无法进行写操作,从机无法同步数据整个系统会处于瘫痪状态,整就一个不可用。redis 的高可用机制哨兵机制,哨兵是 redis 集群里面的重要的组件,他负责集群监控,信息通知,故障转移,配置中心。
(1)集群监控,负责监控 redis master 和 slave 进程是否正常工作
(2)消息通知,如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员
(3)故障转移,如果 master node 挂掉了,会自动转移到 slave node 上
(4)配置中心,如果故障转移发生了,通知 client 客户端新的 master 地址
哨兵本身是分布式的,是作为一个集群去工作的,需要互相协同工作。
当发现 master node 宕机,会需要大部分的哨兵同意才可以,这个涉及到分布式的选举。
哨兵机制需要保证最少 3 个节点才能保证其健壮性,如果我们在测试时只给出两个节点,一个 master node 一个为 slave node 那么这两个节点里面都有一个哨兵负责监控,当其中的 master 主机发生宕机,那么需要哨兵来进行选举,那么 master node 里面那个 s1 的哨兵已经没办法工作,只能由 slave node 里面的 s2 哨兵进行选举,那么进行选举之后要进行故障转移需要一个哨兵进行工作,其 majority 参数规定了需要哨兵的个数进行故障转移,这时只有一个 S2 哨兵没有 majority 可以进行故障转移。所以最少需要 3 个节点来保证其健壮。
三、高可用与高并发出现的数据丢失问题
(1)异步复制导致的数据丢失
因为 master – slave 的复制是异步的,所以可能有部分数据还没复制到 slave,master 就宕机了,此时这些部分数据就丢失了。
(2)脑裂导致的数据丢失
脑裂,也就是说,某个 master 所在机器突然脱离了正常的网络,跟其他 slave 机器不能连接,但是实际上 master 还运行着,
此时哨兵可能就会认为 master 宕机了,然后开启选举,将其他 slave 切换成了 master,
这个时候,集群里就会有两个 master,也就是所谓的脑裂,
此时虽然某个 slave 被切换成了 master,但是可能 client 还没来得及切换到新的 master,还继续写向旧 master 的数据可能也丢失了,
因此旧 master 再次恢复的时候,会被作为一个 slave 挂到新的 master 上去,自己的数据会清空,重新从新的 master 复制数据。
解决异步复制和脑裂导致的数据丢失
min-slaves-to-write 1
min-slaves-max-lag 10
要求至少有 1 个 slave,数据复制和同步的延迟不能超过 10 秒
如果说一旦所有的 slave,数据复制和同步的延迟都超过了 10 秒钟,那么这个时候,master 就不会再接收任何请求了
上面两个配置可以减少异步复制和脑裂导致的数据丢失
(1)减少异步复制的数据丢失
有了 min-slaves-max-lag 这个配置,就可以确保说,一旦 slave 复制数据和 ack 延时太长,就认为可能 master 宕机后损失的数据太多了,那么就拒绝写请求,这样可以把 master 宕机时由于部分数据未同步到 slave 导致的数据丢失降低的可控范围内
(2)减少脑裂的数据丢失
如果一个 master 出现了脑裂,跟其他 slave 丢了连接,那么上面两个配置可以确保说,如果不能继续给指定数量的 slave 发送数据,而且 slave 超过 10 秒没有给自己 ack 消息,那么就直接拒绝客户端的写请求
这样脑裂后的旧 master 就不会接受 client 的新数据,也就避免了数据丢失
上面的配置就确保了,如果跟任何一个 slave 丢了连接,在 10 秒后发现没有 slave 给自己 ack,那么就拒绝新的写请求
感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“Redis 中高可用和高并发机制是什么意思”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!
向 AI 问一下细节