单个 KeyDB 节点的吞吐量达到 7 节点 Redis 集群的水平
KeyDB 是 Redis 的一个高性能分支,无需分片即可在单个节点上达到 1,000,000 ops/sec 的吞吐量。本文不仅讨论其性能,还探讨了随之而来的优势。更强大的性能意味着用更少的活动部件来完成同样的工作,而这一说法的内在含义值得探讨。
KeyDB 完全兼容 Redis 协议、模块和 API,并可与 Redis 客户端协同工作。KeyDB 是一个开源项目,专注于简化性并添加了一些可能永远不会被纳入 Redis 的功能。
下图显示,即使在单台机器(实例)上,也可能需要一个集群才能获得最大吞吐量。在单台机器上超过 7 个分片后,性能不再有提升。
在单台机器上运行集群可以提升性能,但最终会达到处理能力的上限。显然,通过扩展和分片到不同的机器上,可以实现线性扩展而不会出现收益递减。
无论如何分片,KeyDB 都能通过多线程在单台机器上获得最大吞吐量。参考上图,在上述任何配置中,KeyDB 都能维持接近 100 万 ops/sec 的吞吐量(通过为每个分片启用或多或少的线程)。
如果为了获得更高吞吐量而在单台机器上运行集群,那么一个多线程节点可以简化部署。这可以大幅减少扩展时所需的分片数量,并带来许多我们将在本文后续部分讨论的好处。
下图展示了随着分配给 KeyDB 单个节点的线程增多,其多线程性能的表现。在我们测试的机器上,超过 7 个线程通常不会带来进一步的性能提升。我们曾在一个隔离环境中使用强大的机器将单个节点的基准测试推至 150 万 ops/sec,但下图中的数据在 EC2 实例上可以轻松复现。
#
如果您尚未运行集群…很简单,您可以提升性能,实现更高的吞吐量/处理量。有很多开发者/初创公司/小型企业没有设置分片,不打算分片,或者他们的用例需要一些因集群化而受限的功能。
需要明确的是,我们并非抨击分片的想法,也不鼓励用户放弃扩展计划。显然,如果您预计持续增长将超过这种性能提升,您应该尽早为此做准备。
对于那些目前受限于单个 Redis 节点的用户,他们可以通过轻松替换现有的 Redis 服务器为多线程的 KeyDB 来获得巨大好处。这可以为现有设置带来高达 5倍的性能提升。
尚未进行集群化的用户可能已经倾向于接受集群的限制,或者在计划扩展时需要考虑这些限制。如果要启用集群,您必须考虑并规划几个已知的限制。下面的列表概述了其中一些情况。如果解决这些问题需要太多重构工作,一个多线程节点可以提供额外的马力。
#
集群化的一些硬性限制:- 并非所有客户端都支持集群。目前大约有 150 个客户端支持 Redis (https://redis.ac.cn/clients),但令人惊讶的是,有很多客户端没有内置的集群支持。对于其中一些情况,查询路由和代理辅助分区可以提供帮助,但这会增加额外的延迟和设置复杂性。
- 不支持多个数据库。每个分片都假定使用 DB0。如果您引用其他数据库,将会收到错误。
- 涉及多个键的操作可能不受支持。例如,当键位于不同节点上时,无法对两个集合进行交集运算。
- 涉及路由到不同节点的多个键的事务无法使用。
- 包含非常大片段的数据集可能会受到限制。例如,一个巨大的单个有序集合或列表无法被分片。
#
对于进行分片的用户,使用更大的多线程实例也有好处:- 键均衡和应对生产高峰的复杂性大大降低。
- 每个服务器实例只需分片一次,而不是多次。您可以在一台服务器上运行一个 KeyDB 节点,就能获得运行一个 7 节点单线程集群的好处。
- 平衡热点键可以更容易。更大的节点大小和更高的性能减少了影响的严重性。不那么频繁地分片也减少了遇到这些问题的几率。
- 在更大的节点上,巨大的键(有序集合和列表)相对而言变得更小。
- 需要管理的 RDB 文件、AOF 文件和活动部件大大减少。人力和系统维护可以减少。故障点也更少。
- 接受更多线程的能力是另一种形式的扩展。如果您预先分片,这会减少需要传输的节点数量。
#
了解我们如果您想查看这个开源项目,KeyDB 在 Github 上。
#
保持更新KeyDB 有一些前沿的计划,我们将在未来几个月讨论其中一些功能。要了解 KeyDB 项目的最新进展,请订阅我们的邮件列表。我们坚决反对垃圾邮件,并努力使我们的邮件内容丰富,只介绍项目相关信息。
#
关于基准测试的说明…基准测试使用 RedisLabs 的 Memtier 进行。基准测试实例为 m5.8xlarge,必须分配所有 32 个核心才能产生足够的流量进行测试。
在对单个节点进行基准测试时,可以使用默认设置并附带 --threads=32
。如果对集群进行基准测试,由于每个客户端都会向每个分片写入,客户端数量会变得过高。因此,需要为 memtier 分配较少的客户端和线程以防止其崩溃(产生错误)。这意味着为了产生足够的流量,您必须同时运行多个 memtier 实例。我们发现同时运行 3 个 memtier 实例是足够的,每个实例使用 --threads=12
,并根据集群大小调整客户端数量以使每个实例达到最大负荷。
KeyDB 和 Redis 在 m5.4xlarge 上进行了测试。集群是手动设置的,请参阅此处的示例来设置集群。KeyDB 测试配置了以下选项:--server-thread-affinity true
和 --server-threads “x”
,其中“x”是给定测试的线程数。