2022-11-19 09:21:47
Master 最好不进行任何持久化操作,包括内存快照和 AOF 日志文件,尤其是不要使用内存快照进行持久化。
如果数据关键,某个 Slave 应启用 AOF 备份数据,策略为每秒同步一次。
为了主从复制的速度和连接的稳定性,Slave 和 Master 最好位于同一局域网内。
尽量避免在负载较高的 Master 上添加 Slave。
为了 Master 的稳定性,主从复制应使用单向链表结构而非图状结构,即主从关系应为:Master -> Slave1 -> Slave2 -> ...
连接 Redis 数据库时报错:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option).
原因分析强制关闭了 Redis 快照,导致无法持久化到硬盘。
解决方法将 stop-writes-on-bgsave-error 值设置为 no,有两种修改方法:
使用 vi 打开 redis-server 配置的 redis.conf 文件。
使用快捷匹配模式:/stop-writes-on-bgsave-error 定位到 stop-writes-on-bgsave-error 字符串所在位置。
将后面的 yes 改为 no。
Redis 集群中某个节点报错:Starting automatic rewriting of AOF on 307% growth Error opening /setting AOF rewrite IPC pipes: Numerical result out of range,表示 AOF 文件超出了存储的最大内容。
原因分析随着 AOF 文件越来越大,里面会有大部分重复命令或可合并的命令,且 Redis 似乎没有自动触发 BGREWRITEAOF 的稳妥方法。
解决方法Redis 突然挂掉后无法启动,查看 log 日志发现报错:Short read or OOM loading DB. Unrecoverable error, aborting now。
解决方法rm -f redis/dump.rdbrm -f redis.pidRedis 有时 background save db 不成功,通过 log 发现告警:# WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.
原因分析Overcommit:Linux 对大部分申请内存的请求都回复 "yes",以便能运行更多更大的程序,因为申请内存后并不会马上使用内存,这种技术称为 Overcommit。
OOM killer:当 Linux 发现内存不足时,会发生 OOM killer,它会选择杀死一些进程(用户态进程,不是内核线程)以便释放内存。选择进程的函数是 oom_badness 函数,该函数会计算每个进程的点数(0~1000),点数越高,这个进程越有可能被杀死,每个进程的点数跟 oom_score_adj 有关,而且 oom_score_adj 可以被设置(-1000 最低,1000 最高)。
将 vm.overcommit_memory 设为 1,有三种方式修改内核参数:
通过 top 发现 Redis 进程 CPU 使用率 100%。
原因分析通过 info 命令检查当前的执行命令情况,发现大量的 keys 命令导致 CPU 使用率过高。
解决方法检查慢查询 slowlog get,去掉相关服务中的 keys 命令后,服务恢复正常。