记录一次redis故障导致平台雪崩的问题

记录一次redis故障导致平台雪崩的问题

背景

现网redis三台机器配置的是一主两从,读写分离模式。
由于公司服务器资源不足,所以决定在redis机器上部署别的应用服务,刚部署好服务后,应用平台变得非常不稳定,间歇性的无法访问,页面报redis无法连接的错误,最后通过查看日志发现是主从挂掉了,挂掉的根本原因是新增的服务占用了大量内存,导致redis服务不稳定,进而又导致了主从同步失败,读写全部落到了主服务器上,导致机器负载特别大,内存严重不足,而内存不足,又进一步就导致了主从无法正常恢复,无限循环导致了平台访问不稳定。

解决办法

1、查看日志
主服务器日志:
记录一次redis故障导致平台雪崩的问题_第1张图片
从服务器日志
记录一次redis故障导致平台雪崩的问题_第2张图片
2、通过查看日志发现是redis机器内存不足导致主从无法正常恢复。

3、解决方式
编辑文件 /etc/sysctl.conf 添加如下命令:

[yukw@redis2 ~]$ sudo vim /etc/sysctl.conf
vm.overcommit_memory=1

执行sysctl -p使其生效;

[yukw@redis2 ~]$ sudo -s
[root@redis2 yukw]# sysctl -p
参数详解
1、vm.overcommit_memory参数详解

内核参数overcommit_memory
它是 内存分配策略
可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

2、什么是Overcommit和OOM

Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做 Overcommit。当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。
当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该 函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且 oom_score_adj可以被设置(-1000最低,1000最高)

3、在Linux下有个CommitLimit 用于限制系统应用使用的内存资源:

在这里插入图片描述
其中:
CommitLimit是一个内存分配上限,
Committed_AS是已经分配的内存大小。

4、查看redis主从是否恢复正常

记录一次redis故障导致平台雪崩的问题_第3张图片

总结

1、redis本来就是一种基于内存的高速缓存数据库,很吃内存,应该单独部署,不应该再部署其他的服务占用内存;
2、redis内存不足导致无法进行数据同步,进一步导致所有的读写请求都集中在redis主服务器,单机负载无限增大;
3、调整 vm.overcommit_memory 参数彻底解决问题;
4、可适当给redis服务器加大内存;

好了,这就是解决redis主从无法恢复的方法了,如有问题可与博主一起交流讨论

你可能感兴趣的:(运维,redis)