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 的。