大家好,欢迎来到停止重构的频道。从本期开始,我们开始讨论对单个服务软件的性能调优。
本期,先讨论Redis的性能调优。
增加CPU核心数,是否会增加Redis的性能?
设置Redis时,应该注意哪些配置项?
我们按这样的顺序介绍
-
明确性能指标
-
服务器硬件选择
-
单个Redis服务性能调优
-
集群方案
明确性能指标
在调优之前需要先明确性能指标,根据往期的《性能指标》, 整体系统的性能指标是并发量、吞吐量、错误率、响应时间。
在调试单个服务时,根据往期《调优基本思路》的结论, 只需要明确单个服务的目标吞吐量即可。
如果整个系统的目标吞吐量为1000rps, 则Redis的读操作吞吐量最好为2000rps ,写操作的吞吐量最好为1000rps。
这里需要说明的是, 单台redis服务的吞吐量极限在十几万rps左右,如果需要更高的吞吐量 ,则需要额外设计数据分区等编程机制规避性能局限。
而错误率最好为0%,响应时间不需要特别关注,但如果出现一些响应时间特别长的数据操作还是要优化的。
最大并发量是设置的, 设置的值可以低于整体系统的最大并发值。
服务器硬件选择
Redis的硬件选择一般是重点选择内存大小,需要估算所需要的内存空间。
至于CPU核数,由于Redis基本上是单线程操作数据的,所以一般单核即可。
CPU核数增多,基本不会增加Redis的性能。当然,为了防止一些基础软件抢占Redis的资源,可以选用2核或4核的CPU。
单个Redis服务性能调优
接下来是对单个Redis服务调优,在这之前, 需要先调优服务器内核参数,调优方法可以参考往期《内核参数调优》。
其实Redis的性能基本上是不需要调优的,Redis的吞吐量大概在10万-20万rps左右,再怎么修改配置,这个吞吐量也不会有太大的变化。
所以Redis服务调优的目的,并不在于提高性能 ,而在于防止一些问题发生。
Redis服务调优需要关注以下几点:
首先是设置最大请求数,也就是Redis服务的最大并发值。
这里推荐的是使用Redis的服务个数X2即可,例如 只有后端服务使用Redis且有5个后端服务,则设置为10即可。
当然,为了以后扩展方便,也可以设置得稍大一些,如200。
值得一提的是这个值设置再大都不会提升性能, 因为Redis大体上是单线程操作数据的。另外,后端与Redis的链接池也不需要设置太大,设置为2即可。
然后是最大内存空间,一般设置为服务器内存空间的80%,当然,如果一台服务器运行多个Redis服务, 则需要做更精准的划分。
接下来是淘汰机制,淘汰机制是当存储满了后淘汰数据的机制。
淘汰机制是需要根据数据场景而定的,但尽量不要保持默认配置。
默认配置是超出最大存储空间会报错拒绝新请求,这会引起很多问题 ,如果是存储Session的话, 那么后端服务可能也会直接报错,导致接口总是报500的错误。
至于磁盘存储的话,一般关闭即可。
但是一些场景如统计数据等场景仍然是需要开启的,保存的策略尽量放宽一些。
其他一些优化的配置如图所示,如优化慢查询、开启多io线程等。
测试Redis性能可以使用其自带的Redis-benchmark, 一般Redis的吞吐量大概为10万rps以上 ,且增加CPU核数并无太大区别。
集群方案:主从模式
Redis有3种集群模式,第一种是主从模式, 从服务器会自动复制主服务器的数据。
从服务器是只读的,不接收写数据操作 主从模式的最大作用是备份数据以便容灾恢复等。
当然,主从模式也可作为读写分离的方案,不过主服务器和各从服务器有不同的IP。
所以最好再增加一个Redis, proxy程序(一类软件)作为负载均衡, 对外提供单一IP。
主从模式有一个误区 ,就是作为高可用方案, 以为加上了keepalived服务之后,当主服务器宕机后,虚拟IP会自动切换到从服务器。
实际上,请求确实能切换到从服务器 ,但是从服务器会依旧拒绝写数据请求 ,这是起不到高可用的目的的。
集群方案:哨兵模式
第二种是哨兵模式,哨兵模式是主从模式的升级版。主服务器宕机后,其中一个从服务器会自动升级为主服务器。
但相对应的,也要额外运行Redis的哨兵程序,请求也是先发送到哨兵程序再转发到Redis服务。
如果有高可用需求,或读写分离需求,哨兵模式是比较好的。
集群方案:cluster集群模式
第三种是cluster集群模式,这种模式是可以将数据分开存储在多个服务器的。
一般cluster模式是部署3主3从或以上,cluster模式也具备哨兵模式从机升级为主机的功能。
cluster模式的好处是数据容量的扩展是相对容易的,但也会让系统结构更为复杂,增加运维成本,建议等数据量起来后再考虑此模式。
总结
哨兵模式和cluster集群模式的读写分离可以使用一些基础框架实现,springboot的话可以使用lettue。
除了提到的点,还有一些提升Redis性能的方法:
过期时间加上一小段随机时间防止雪崩,因为大量相同时间过期的数据会造成很大的性能压力。
不同场景的数据独立存储在不同的Redis服务或集群中,因为一个Redis服务一般认为只有1个线程在工作。