佳木斯市网站建设_网站建设公司_数据备份_seo优化
2025/12/18 2:38:13 网站建设 项目流程

文章目录

  • 一、前言
  • 二、Redis如何实现持久化
    • 1、AOF重写
    • 2、RDB和AOF混合使用
  • 三、Redis主从架构
  • 四、Redis哨兵架构
  • 五、Redis高可用集群Cluster模式
  • 六、Leader选举原理

一、前言

头发稀疏、两个头发之间能放下我的一个拳头,睡眼朦胧、眼睛看不出是睁是闭,眼镜风霜,两个眼镜片沾满了头屑。

这面试官得有七八十岁了吧,还能看清我的简历吗?

二、Redis如何实现持久化

面试官:你先说一下Redis如何实现持久化的

我:Redis主要有两种持久化方式,一种是RDB(快照)方式,另一种是AOF格式。

面试官:可以说一说两者的区别和如何配置使用吗

我们可以想象一下我现在要记录一个人的姿势是什么样子的,那么我只能通过拍照,或者描述来记录

RDB(快照)方式可以理解我想知道目前一个人的姿势是什么样子的,那么我就给他拍一张照片,那么照片上就是他这个人的姿势。

AOF可以理解为动作的描述,我通过对这个人每一个动作的描述来知道这个人的姿势是什么样子的,比如这个人左手六、右手七、左脚画圆、右脚踢,那么我通过这些动作就知道这个人目前的姿势。


所以RDB快照就相当于将Redis中的数据保存了下来,恢复的时候只需要将照片拿出来,人根据姿势恢复就行了。

而AOF相当于将Redis中的每一条执行命令记录了下来,恢复的时候需要根据命令一条一条的来,先左手六、再右手七、再左脚画圆、再右脚踢。。。(如果想不明白可以按照姿势试一下就明白了)

RDB在redis.conf目录中进行配置,命令格式为 save [时间] [次数]

那save 60 10000来举例,含义是如果在60秒内有至少10000条改动,那么就自动保存一次,也就是拍一张照片,那么中间如果改动到500条的时候Redis挂了,那么这500条改动就找不到了。

如果执行save命令会造成Redis正常读写收到影响,我们可以用bgsave(写时复制)命令来生成RDB快照,bgsave是用一个子线程来实现快照功能,主线程继续他的读写任务

使用AOF来保存数据就不会有RDB快照中Redis宕机所产生的风险了,因为AOF保存的是每一条命令,但是AOF也并不是只能每一条命令就保存一次,这样会耗费性能,我们可以设置为每1秒执行一次保存,这样就算丢失也只会丢失1秒的数据

可以通过配置文件中的appendonly设置为yes来开启AOF功能

AOF有三个保存策略
appendfsync always:每次有新命令就保存下来,性能最慢,但是最安全
appendsync everysec:每秒保存一次命令,足够快,故障时只会丢失1秒钟的数据
appendfsync no:从不保存,将数据交给操作系统来处理。更快,也更不安全
推荐使用每秒保存一次命令的方式

1、AOF重写

面试官:AOF中那么多命令恢复起来太麻烦,有没有什么优化的方式

AOF文件中有太多没用的指令,所以AOF会定期根据内存的最新数据生成AOF文件

例如我们记录一个人的动作,发现他先抬手,再放下手、然后再抬手,那我我们可以将动作合并为一个动作就是抬手,因为执行抬手,放手,抬手三个动作和只执行一个抬手的动作是一样的

我们可以配置AOF重写的频率,有两个配置项
auto-aof-rewrite-percentage 100 (aof文件自上一次重写后文件大小增长了100%则再次触发重写)
auto-aof-rewrite-min-size 64mb (aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就很快,重写的意义不大)

aof可以手动重写,命令为:bgrewriteaof,此时也会使用一个子进程来重写,不会对redis的正常命令有影响

2、RDB和AOF混合使用

面试官:RDB和AOF各有优缺点,我们该怎么选择

在redis启动的时候如果即配置RDB又配置AOF,则优先使用AOF,因为AOF更加安全,但是性能不太好,但是我们可以混合使用,达到更好的效果

将RDB和AOF混合使用,例如恢复的时候先根据照片恢复最后一次拍照记录的样子,然后再恢复拍照后记录的动作

配置开启混合使用:aof‐use‐rdb‐preamble yes

三、Redis主从架构

面试官:可以聊一聊redis的主从架构模式,以及怎样搭建吗

我:可以,redis的主从架构模式其实是用一个redis节点来做写操作(主节点),多个redis节点来做读操作(从节点),主节点会将写入的数据同步给从节点,以保证从从节点读取的数据是最新的数据

搭建方式:主节点不用修改任何配置,从节点修改redis.conf配置文件
配置主节点的ip端口:replicaof (代表从节点从哪个主节点同步数据)

配置好从节点后启动从节点,这个时候启动从节点,从节点会从主节点去初次获取数据

四、Redis哨兵架构

面试官:可以聊一聊redis的哨兵架构模式,以及怎样搭建吗

我:好的,哨兵架构是在主从架构上衍生出来的,因为主从架构中如果主节点挂了,那么我们就不能够写入数据了,只能从从节点中读取数据,这样是很不方便的。

那么我们弄一个哨兵集群来监视这些节点,当主节点挂了以后我们哨兵选举一个从节点成为主节点,并让写数据的命令得以继续执行(我们用比较有名的村庄来举例。。。)。

搭建:复制一份sentinel.conf文件进行修改,redis中默认有这个文件

修改端口号,以及sentinel命令,格式为:sentinel monitor <主节点名称> <端口>
quorum是一个数字类型,意思是有多少个sentinel认为这个主节点失效时才算真正的失效,比如我配置了三个sentinel,那么我这里2的含义就是有两个sentinel认为当前主节点失效就算失效了。

五、Redis高可用集群Cluster模式

面试官:能说一下高可用集群模式具体是怎么一个流程吗,为什么可以解决选举等待问题?

我:(能不说吗。。。)


通过图中可以看出我们客户端通过访问入口可以访问多个主节点,如果其中一个主节点挂了,那么其他的主节点还可以正常工作不受影响。

面试官:这么多主节点,我哪知道我set一个数据应该放入到哪个主从结构里面呢?

我:(你随机放一个不就行了吗。。。不对,随机放一个取的时候就不知道去哪个主从结构里去取了,总不能每一个主节点里面都去查找一遍吧)

我:他会根据要set进去的key进行一个hash计算,计算完后就知道要往哪个主节点里面存放值了,取得时候也根据key进行一个hash计算,就知道去哪个主节点里拿取了。

面试官:那这个时候来一个age计算hash是150要插入哪个主节点

我:肯定是第二个主节点啊,redis集群采用分片模式,将所有数据分片放入多个主节点中,方便与水平扩展。

面试官:如果主节点挂了,哨兵模式下哨兵集群会选举出一个主节点,那你这种高可用模式,如果一个主节点挂了,怎么选举呢?

我:(应该是按照大小个吧。。。)

面试官:你特么找打是吧,数据那特么有大小个。。。

六、Leader选举原理

我:这个时候就需要其他主节点来支持选举了,我来用一张图描述一下。

我:我们可以把这三个主从节点看做是三个国家,如果一个国家的头目挂掉了,那么他底下其中一股势力就会找其他的国家头目来支持自己成为头目。

我:当然其他国家的头目不会看你国家这两股势力哪个好哪个坏,而是哪个先找我我就支持你。

我:而且图中有三个国家,支持自己的票数必须超过总国家的一半以上,也就是最少要有两票支持,所以redis集群节点最少要三个主从结构,不然的话两个没办法选举,票数最多一票不够两个国家的半数以上。

面试官:那塔利班和正规军他们两个怎么确定谁先发出请求呢,肯定是谁先发出消息谁赢呗?

我:他们两个小势力并不是头目挂了就立马发出请求支持消息,而是有一定的延迟时间,这个延迟时间根据一个公式计算,公式中包含随机数,和根据SLAVE_RANK的大小来计算,SLAVE_RANK的大小表示从节点从主节点同步的数据总量的Rank。Rank越小代表一复制的数据越新,可以做主节点。

延迟公式:DELAY = 500ms +random(0 ~ 500ms) + SLAVE_RANK * 1000ms

面试官:假如现在网络抖动,从节点一瞬间连接不上主节点了,他就开始发送消息,网络好了以后不就有两个主节(俗称脑裂,主节点相当于一个主从结构的大脑,只能有一个)点了吗?

我:那我们可以配置连接不上的时间让他长一点,通过cluster-node-timeout来配置,假如配置5秒钟,那么5秒钟之内从节点连接不上主节点是不会发起请求支持的信息的。

面试官:万一5秒不够呢,万一我网络抖动的厉害呢?

我:你是食堂阿姨吗,手抖的这么厉害。。。

我:你说的这种情况属于一瞬间有两个主节点都在写入新的数据,那么等网络恢复以后只会将一个节点作为主节点,其他节点变为从节点过来同步,那么就会丢失一部分数据。

我:这里我们会发现age 20数据丢失了,那这个怎么办呢,我们可以通过一个配置min‐replicas‐to‐write [数量],这个配置是写的数据最少同步的从节点数量。

假如我这里配置的是1,那么就是我写入一个值最少有一个从节点同步到了这个值才算写入成功,不然就是写入失败。

这样的话就可以解决上述问题,当网络抖动主节点无法给从节点同步数据的时候就写入失败,不会造成丢失数据,但是这种配置非常影响性能,不建议使用。

面试官:如果redis集群中一个主从结构全部挂了,这个redis集群还可以使用吗?

我:我们可以配置cluster-require-full-coverage 为no,这样只是一个主从结构全部挂了不影响其他主从结构的使用,如果为yes,一个主从结构挂了整个redis集群就不能用了。

面试官:Redis集群为什么至少需要三个主节点,并且推荐节点数为奇数?

我:上面我们说过如果是两个主节点,那么其中一个主节点挂了,剩下活着的主节点只有一个了,没有达到总数的一半以上,投票也不好使啊,挂了的主节点那里还是选举不出来新的主节点。

另外假如是4台主节点,那么他跟三台主节点一样都是最多只能挂一个主节点,如果同时挂两个主节点,那么剩下活着的主节点也无法超过总数的一半,所以按照性价比来说,奇数主节点性价比更高,不过贵公司要是土豪,愿意弄几个主节点就弄几个吧。。。

面试官:小伙子真厉害啊,我这边没有什么要问的了,你还有什么问题要问(面试官两眼放光)

我:我冒昧的问一句,您老人家平时下班回家还有时间陪孙子玩吗?

“噗。。。面试官将假牙喷出两厘米,又用手塞了回去说:我特么今天才28”

能看到这里的给我也给自己一个点赞、收藏、转发吧,对我很重要啊,我谢谢各位帅哥美女了,文章持续更新,可以搜索【极客无欲】第一时间阅读,并且领取我为大家准备的资料

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询