为什么我的 redis 集群上的热点不好?

Why are hotspots on my redis cluster bad?

我有一个 Redis 集群,我正计划添加密钥,我知道这些密钥的 read/update 频率会比其他密钥高得多。我认为这可能会导致我的集群出现热点。为什么这很糟糕,我该如何避免?

键上的热点是可以的,如果这些键可以分片到不同的 redis 节点。但是如果某个redisnodes/machines上有hotspot,那就不好了,因为这些机器的memory/cpu负载会很重,而其他节点没有得到有效利用。

如果你确切知道这些密钥是什么,你可以先自己计算它们的槽,密钥的CRC16对16384取模

然后可以将这些slots分布到不同的redis节点上。

项目是否会在一个或多个特定节点上引起热点取决于一系列因素。如前所述,如果整个集群流量仍然相对均匀并且密钥所在的节点未被征税,则单个密钥上的热点不一定是问题。如果您的每个集群节点都在处理 1000 commands/sec,并且在其中一个节点上,所有命令都与一个键相关,那么这并不重要,因为所有命令都是在单个线程上串行处理的,都一样

但是,如果您有 5 个节点,所有节点都在处理 1000 个 commands/sec,但是您向一个节点添加了一个新密钥,这使得该单个节点又产生了 3000 个 commands/sec,其中之一您的 5 个节点现在处理 50% 的处理。这意味着该节点处理所有正常的 1000 commands/sec 需要更长的时间,并且现在有 1/5 的流量任意慢得多。

distributing/sharding 数据库的部分总体思想不仅要增加存储容量,还要平衡工作。不平衡这项工作最终会导致不平衡或搞砸您的应用程序性能。由于访问陷入困境的节点,它会导致 1/N 的请求负载任意变慢,或者如果您的请求可能访问多个节点,它会全面增加处理时间。均匀分布负载为应用程序提供更好的能力来处理更高的负载,而不会对性能产生不利影响。


但也有实际考虑,即对新密钥的访问是否与您的持续流量成比例。如果您的集群正在处理 1000+ commands/sec/node 并且单个键将向单个特定节点添加 10 req/sec,那么无论哪种方式,您都可能没问题。