redis线上问题及解决方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis线上问题及解决方法相关的知识,希望对你有一定的参考价值。
Redis内存配置大小要求
配置redis时,内存不宜超过机器总内存的50%,否则写RDB文件时会导致机器总内存不足,从而进行IO等待,使redis访问速度骤降
maxmemory 12gb
设置redis总内存为机器总内存的50%,且当redis进程占用内存超过机器内存的40%时进行报警,此时需要迁移数据
Redis数据较大时,主从同步失败
当redis数据较大时,RDB文件有好几个G,第一次主从同步时会传输整个RDB文件并加载到内存中,数据较大时会导致slave还没同步完,已经超时。此时主从之间会再次进行同步,循环失败。需修改相关参数
repl-ping-slave-period 10
repl-timeout 600
client-output-buffer-limit slave 768mb 512mb 600
Redis内存较大时,bgsave失败后整个Redis不可写
配置中有选项,gbsave失败时不让写,该配置应该设置为no
stop-writes-on-bgsave-error no
slave-serve-stale-data yes
Redis中启动了bgsave进程,且杀不死
设置no-appendfsync-on-rewrite 为yes,再杀死
通过redis-cli进入,然后 config set no-appendfsync-on-rewrite yes
如果是有slave进行同步,则要先关闭slave,然后再杀进程
Redis最好运行在内网中(可信任环境)
bind 127.0.0.1
Redis持久化流程相关内容
Rdb备份
主redis禁用rdb备份,启用aof,且aof重写时间设置长点(也可以自己禁用aof,当主出问题时自动切换从)
迁移中若proxy无响应
网络不好时,迁移slot时可能导致proxy无响应,此时需重启没有响应的proxy,否则可能导致proxy还去以前的slot找key,找不到
Redis进程占用内存已经超过总内存的70%
此 时如果有salve与master进行第一次全同步,可能导致master机器内存不足,从swap读取数据,IO等待导致master处理量骤降,此时 需要启动一台新机器,然后将master中的数据迁移到新机器上,直至迁完,然后将该机器down掉重启,按照ReID是内存配置要求重新配置启动,再加 入到组中,把其他机器的数据迁移过去。
Redis进程占用内存不减少
Redis占用内存没有超过配置中的最大内存数,如果不DEL key,其内存不会减少,即使HDEL 或者 迁移,内存仍然不会变
Codis进行迁移时slot迁移完成却更新slot状态到zk失败
Codis 进行迁移时,如果发生情况:迁移某个slot时,key已经迁移完成,但是更新slot状态到zk时失败,会导致访问proxy时落到这个slot的数据 都找不到。原因是proxy不知道该slot已经迁移完成,当外部访问时,还会要求从源redis中迁移key到现在的redis中,此时如果源 redis给proxy返回错误,则proxy直接退出该次请求。
Redis进行主从全同步时,禁止写磁盘
Redis进行主从同步时,默认会写rdb文件到本地,如果此时内存不足,会使redis IO等待导致处理速度骤降。可以通过禁用写磁盘操作,环境IO等待,配置如下
repl-diskless-sync yes
以上是关于redis线上问题及解决方法的主要内容,如果未能解决你的问题,请参考以下文章