您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
redis是什么(redis原理详解)
节点,哨兵,内存redis是什么(redis原理详解)
发布时间:2020-12-06加入收藏来源:互联网点击:
⑥阻塞点
AOF 重写和 RDB 快照执行的过程中,Redis 都会 Fork 一个子进程来执行操作,子进程执行过程中是不是阻塞主线程的。
但是要注意 2 点:
Fork 子进程的过程中,Redis 主线程会拷贝一份内存页表(记录了虚拟内存和物理内存的映射关系)给子进程,这个过程是阻塞的,Redis 主线程内存越大,阻塞时间越长。子进程和 Redis 主线程共用一块儿物理内存,如果新的请求到来,必须使用 copy on write 的方式,拷贝要修改的数据页到新的内存空间进行修改。如下图:注意:如果开启了内存大页,每次拷贝都需要分配 2MB 的内存。
Redis 高可用
下图是一个“一主二从三哨兵”的架构图:
从图我们可以看到哨兵之间、哨兵和主从节点之间、哨兵和客户端之间都建立了连接。
如果主节点挂了,哨兵集群需要完成主从切换,如下图:
下面我们依次来聊一下这 4 个步骤。
①判断主节点下线
当一个哨兵监控到主节点下线时,就会给其他哨兵发送确认命令,其他命令会根据自己的判断回复"Y"或"N"。
如果有 n/2 1 以上数量的哨兵都认为主节点下线了,才会判定主节点下线。这里的n是哨兵集群的数量。
n/2 1 这个参数由 quorum 参数配置,比如有 5 个哨兵,这里一般配置成 3。也可以配置成其他值。
②选举新主节点
主节点被判定下线后,哨兵集群会重新选择新的主节点。
淘汰不稳定从节点:根据配置参数 down-after-milliseconds * 10 来淘汰。
down-after-milliseconds 表示主从节点断开时间,10 表示次数,如果从节点跟主节点断开时间超过 down-after-milliseconds 的次数达到了 10 次以上,从节点就被淘汰了。
slave-priority 参数:配置了从节点的优先级,选择从节点时哨兵会优先选择优先级高的从节点。
复制进度:Redis 有一个记录主从增量复制的缓存区叫 repl_backlog_buffer。
这是一个环形结构的缓冲区,如下图:
主节点有一个写偏移量 master_repl_offset,从节点也有一个偏移量 slave_repl_offset。
优先选择 slave_repl_offset 最接近 master_repl_offset 的从节点作为新的主节点。
所以,上图中偏移量为 114 的从节点优先被选为新的主节点。
ID 编号:优先级和参数都一样的情况下,ID 编号小的从节点优先被选为新主节点。
③选举哨兵 Leader
第一个判断主节点下线的哨兵节点收到其他节点的回复并确定主节点下线后,就会给其他哨兵发送命令申请成为哨兵 Leader。
成为 Leader 的条件如下:
收到赞成票必须大于等 quorum 值必须拿到半数以上的赞成票如果集群配置了 5 个哨兵,quorum 的值设置为 3,其中一个哨兵节点挂了,很有可能会判断到主节点下线,但是因为选举不出哨兵 Leader 而不能切换。
如果集群有 2 个哨兵,其中一个挂了,那必定选不出哨兵 Leader。
下面的图展示了哨兵一成功当选 Leader 的过程:
④主节点切换
选出新主节点和哨兵 Leader 后,哨兵 Leader 会执行主从切换的操作。
完成后会做一些事件通知:
通知其他哨兵新主节点地址通知所有从节点新的主节点地址,从节点收到后向新主节点请求主从同步通知客户端连接新主节点⑤主从切换过程中请求处理
如果客户端的读请求会发送到从节点,可以正常处理。在客户端收到新主节点地址通知前写请求会失败。客户端可以采取一些应急措施应对主节点下线,比如缓存写请求。
为了能够及时获取到新主节点信息,客户端可以订阅哨兵的主节点下线事件和新主节点变更事件。
Redis 为什么变慢了
Redis 变慢了的原因有很多,总结一下有 11 个,见下图:
从图中看出,Redis 变慢原因主要有两类:阻塞主线程和操作系统限制。
①主线程阻塞
AOF 重写和 RDB 快照:前面已经讲过了,Redis 在 AOF 重写时,主线程会 Fork 出一个 bgrewriteaof 子进程。Redis 进行 RDB 快照时主线程会 Fork 出一个 bgsave 子进程。
这两个操作表面上看不阻塞主线程,但 Fork 子进程的这个过程是在主线程完成的。
Fork 子进程时 Redis 需要拷贝内存页表,如果 Redis 实例很大,这个拷贝会耗费大量的 CPU 资源,阻塞主线程的时间也会变长。
上一篇:redmi note 7 pro怎么样 准备好入手了吗
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |