98.Redis 常见的性能问题都有哪些?如何解决?

1、Master 最好不要做任何持久化工作,如 RDB 内存快照和 AOF 日志文件

经过和朋友讨论,主节点开启 AOF 日志功能,尽量避免 AOF 重写。

  • Master 写内存快照,save 命令调度 rdbSave 函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以 Master 最好不要写内存快照。

  • Master AOF 持久化,如果不重写 AOF 文件,这个持久化方式对性能的影响是最小的,但是 AOF 文件会不断增大,AOF 文件过大会影响 Master 重启的恢复速度。

  • 所以,Master 最好不要做任何持久化工作,包括内存快照和 AOF 日志文件,特别是不要启用内存快照做持久化。如果数据比较关键,某个 Slave 开启AOF备份数据,策略为每秒同步一次。

  • 2、Master 调用 BGREWRITEAOF 重写 AOF 文件,AOF 在重写的时候会占大量的 CPU 和内存资源,导致服务 load 过高,出现短暂服务暂停现象。

    • 一般来说,出现这个问题,很多时候是因为 Master 的内存过大,一次 AOF 重写需要占用的 CPU 和内存的资源较多,此时可以考虑 Redis Cluster 方案。
  • 3、尽量避免在压力很大的主库上增加过多的从库。

    • 可以考虑在从上挂载其它的从。
  • 4、主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...

    • 这样的结构,也方便解决单点故障问题,实现 Slave 对 Master 的替换。如果 Master挂了,可以立刻启用 Slave1 做 Master ,其他不变。

      从节点在切换主节点作为复制源的时候,会重新发起全量复制。所以此处通过 Slave1 挂在 Slave 下,可以规避这个问题。同时,也减少了 Master 的复制压力。当然,坏处就是 Slave1 的延迟可能会高一些些,所以还是需要取舍。

  • 5、Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave 和 Master 最好在同一个局域网内。


和飞哥沟通过后,他们主节点开启 AOF ,从节点开启 AOF + RDB 。

和晓峰沟通后,他们主节点开启 AOF ,从节点开启 RDB 居多,也有开启 AOF + RDB 的。