能坚持别人不能坚持的, 才能拥有别人未曾拥有的.
关注左上角编程大道公众号, 让我们一同坚持心中所想, 一起成长!!
在这个系列里, 我会整理一些面试题与大家分享, 帮助年后和我一样想要在金三银四准备跳槽的同学.
我们一起巩固, 突击面试官常问的一些面试题, 加油!!
《[面试突击] - Redis 篇》--Redis 数据类型? 适用于哪些场景?
《[面试突击] - Redis 篇》--Redis 的线程模型了解吗? 为啥单线程效率还这么高?
面试官在问了上两次提到的问题之后, 可能就会开始更加猛烈的攻势, 一连串的 Redis 的知识点向你抛过来, 你顶的住吗?
下面就面试经常问到的问题, 以问答的方式分享给大家.
Redis 如何保证高并发, 高可用?
高并发: Redis 的单机吞吐量可以达到几万不是问题, 如果想提高 Redis 的读写能力, 可以用 Redis 的主从架构, Redis 天热支持一主多从的准备模式, 单主负责写请求多从负责读请求, 主从之间异步复制, 把主的数据同步到从.
高可用: 首先利用 Redis 的主从架构解决 Redis 的单点故障导致的不可用, 然后如果使用的是主从架构, 那么只需要增加哨兵机制即可, 就可以实现, Redis 主实例宕机, 自动会进行主备切换. 以此来达到 Redis 的高可用.
你刚才说主从复制, 那你能具体聊一下主从复制的原理吗?
在 Redis 主从架构中, master 负责接收写请求, 写操作成功后返回客户端 OK, 然后后将数据异步的方式发送给多个 slaver 进行数据同步, 不过从 Redis 2.8 开始, slave node 会周期性地确认自己每次复制的数据量.
当启动一个 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 做复制的时候, 是不会 block master node 的正常工作的, 也不会 block 对自己的查询操作, 它会用旧的数据集来提供服务; 但是复制完成的时候, 需要删除旧数据集, 加载新数据集, 这个时候就会暂停对外服务了. slave node 主要用来进行横向扩容, 做读写分离, 扩容的 slave node 可以提高读的吞吐量. slave 与高可用性有很大的关系.
主从复制的过程中如果因为网络原因停止复制了会怎么样?
如果出现网络故障断开连接了, 会自动重连的, 从 Redis 2.8 开始, 就支持主从复制的断点续传, 可以接着上次复制的地方, 继续复制下去, 而不是从头开始复制一份.
master 如果发现有多个 slave node 都来重新连接, 仅仅会启动一个 rdb save 操作, 用一份数据服务所有 slave node.
master node 会在内存中创建一个 backlog,master 和 slave 都会保存一个 replica offset, 还有一个 master id,offset 就是保存在 backlog 中的. 如果 master 和 slave 网络连接断掉了, slave 会让 master 从上次的 replica offset 开始继续复制.
但是如果没有找到对应的 offset, 那么就会执行一次 resynchronization 全量复制.
好的, 那你能说说什么是哨兵有什么作用吗?
哨兵是 Redis 集群架构中非常重要的一个组件, 主要功能如下
(1)集群监控, 负责监控 Redis master 和 slave 进程是否正常工作
(2)消息通知, 如果某个 Redis 实例有故障, 那么哨兵负责发送消息作为报警通知给管理员
(3)故障转移, 如果 master node 挂掉了, 会自动转移到 slave node 上
(4)配置中心, 如果故障转移发生了, 通知 client 客户端新的 master 地址
哨兵本身也是分布式的, 作为一个哨兵集群去运行, 互相协同工作
(1)故障转移时, 判断一个 master node 是宕机了, 需要大部分的哨兵都同意才行, 涉及到了分布式选举的问题
(2)即使部分哨兵节点挂掉了, 哨兵集群还是能正常工作的, 因为如果一个作为高可用机制重要组成部分的故障转移系统本身是单点的, 那就很坑爹了.
目前采用的是 sentinal 2 版本, sentinal 2 相对于 sentinal 1 来说, 重写了很多代码, 主要是让故障转移的机制和算法变得更加健壮和简单.
为什么 Redis 哨兵集群只有 2 个节点无法正常工作?
如果两个哨兵实例, 即两个 Redis 实例, 一主一从的模式.
则 Redis 的配置 quorum=1, 表示一个哨兵认为 master 宕机即可认为 master 已宕机.
但是如果是机器 1 宕机了, 那哨兵 1 和 master 都宕机了, 虽然哨兵 2 知道 master 宕机了, 但是这个时候, 需要 majority, 也就是大多数哨兵都是运行的, 2 个哨兵的 majority 就是 2(2 的 majority=2,3 的 majority=2,5 的 majority=3,4 的 majority=2),2 个哨兵都运行着, 就可以允许执行故障转移.
但此时哨兵 1 没了就只有 1 个哨兵了了, 此时就没有 majority 来允许执行故障转移, 所以故障转移不会执行.
主备切换的时候会有数据丢失的可能吗?
会有, 而且有两种可能, 一种是异步复制, 一种是脑裂导致的数据丢失.
简单描述一下这两种数据丢失的过程吧
好的, 第一种很好理解, 因为 master 到 slave 的复制是异步的, 所以可能有部分数据还没复制到 slave 的时候, master 就宕机了, 此时这些部分数据就丢失了. 虽然 master 会做持久化, 但是哨兵将 slave 提升为 master 后, 如果旧的 master 这时候好了, 会当做 slave 挂到新的 master 上, 从新的 master 同步数据, 原来的数据还是会丢失.
第二种, 也就是说, 某个 master 所在机器突然脱离了正常的网络, 跟其他 slave 机器不能连接, 但是实际上 master 还运行着, 即集群分区现象. 此时哨兵可能就会认为 master 宕机了, 然后开启选举, 将其他 slave 切换成了 master.
这个时候, 集群里就会有两个 master, 也就是所谓的脑裂.
此时虽然某个 slave 被切换成了 master, 但是可能 client 还没来得及切换到新的 master, 还继续向旧 master 写数据, 这部分数据可能就丢失了. 因此旧 master 再次恢复的加入到主从结构中时, 会被作为一个 slave 挂到新的 master 上去, 自己的数据会清空, 重新从新的 master 复制数据, 原来的写到旧 master 的数据就丢失了.
那有什么办法解决这个数据丢失的问题吗?
数据丢失的问题是不可避免的, 但是我们可以尽量减少.
在 Redis 的配置文件里设置参数
- min-slaves-to-write 1
- min-slaves-max-lag 10
min-slaves-to-write 默认情况下是 0,min-slaves-max-lag 默认情况下是 10.
上面的配置的意思是要求至少有 1 个 slave, 数据复制和同步的延迟不能超过 10 秒. 如果说一旦所有的 slave, 数据复制和同步的延迟都超过了 10 秒钟, 那么这个时候, master 就不会再接收任何请求了.
上面两个配置可以减少异步复制和脑裂导致的数据丢失.
设置了这俩参数具体是怎么减少数据丢失的呢?
以上面配置为例, 这两个参数表示至少有 1 个 salve 的与 master 的同步复制延迟不能超过 10s, 一旦所有的 slave 复制和同步的延迟达到了 10s, 那么此时 master 就不会接受任何请求.
我们可以减小 min-slaves-max-lag 参数的值, 这样就可以避免在发生故障时大量的数据丢失, 一旦发现延迟超过了该值就不会往 master 中写入数据.
那么对于 client, 我们可以采取降级措施, 将数据暂时写入本地缓存和磁盘中, 在一段时间后重新写入 master 来保证数据不丢失; 也可以将数据写入 kafka 消息队列, 隔一段时间去消费 kafka 中的数据.
通过上面两个参数的设置我们尽可能的减少数据的丢失, 具体的值还需要在特定的环境下进行测试设置.
好的, 今天回答的还不错, 下一轮面试继续努力哦~
面试官显然对你今天的回答比较满意, 已经邀请你下一轮面试了~~~
手机阅读的用户可移至公众号哦, 更方便
本系列文章在于面试突击, 不是教程, 要是细挖, 能讲好多, 而面试你只需要把这个原理说出来就行了, 如果边讲边画图那就更好了.
该系列文章在于快速突击, 快速拾遗, 温习.
来源: https://www.cnblogs.com/ibigboy/p/12204300.html