我们新发布的 Redis Enterprise 5.0 引入了对开源 (OSS) 集群 API 的支持,该 API 允许 Redis Enterprise 集群通过仅添加分片和节点来实现无限、线性地扩展。OSS 集群 API 依靠客户端的智能来决定将请求发送到哪个分片/节点,这取决于键值项的键部分以及客户端和集群之间共享的哈希函数。本文解释了 Redis Enterprise 如何使用 OSS 集群 API,并验证了其无限的线性性能可扩展性。
对于不熟悉 Redis Enterprise 架构的用户,我们先简要介绍一下背景知识
在 Redis Enterprise 中,集群是一组云实例、虚拟机/容器节点或裸金属服务器,允许您在共享的内存池中创建任意数量的 Redis 数据库(在 Redis Enterprise 术语中,数据库是管理跨多个 Redis 分片/实例的整个数据集的实体。不要将其与每个 Redis 实例中可以使用 Redis SELECT 命令进行键空间分段的数据库混淆)。该集群采用对称的共享无状态架构,数据路径与控制 & 管理路径完全分离,主要包含以下组件:
Redis Enterprise 集群中的数据库可以按以下任何一种配置创建:
凭借其强大的多租户技术,Redis Enterprise 集群可以在同一集群资源上以完全隔离的方式管理多种不同类型的数据库。
要利用新的 OSS 集群 API,在使用 Redis Enterprise API 创建数据库时应使用以下属性:
这将创建一个具有与下图所示相似属性的集群数据库
正如您所见
考虑到这一点,我们决定在 AWS 上构建一个测试环境,以验证 Redis Enterprise 是否真的可以无限地、线性地扩展。由于我们计划进行一些严肃的负载测试,我们决定使用 EC2 m4.16xlarge 实例(64 核,256GB 内存)作为集群节点,并使用 c4.8xlarge 实例(36 核,60GB 内存)运行 memtier_benchmark,这是一个开源的多线程负载生成工具。
使用 memtier_benchmark 的多个实例是必需的,因为在许多情况下,单个 Redis Enterprise 节点可以处理的流量比单个 memtier_benchmark 实例能生成的流量大。这种方法还使我们能够避免单个 NIC 的网络带宽和每秒数据包限制,并且可以轻松地逐步(逐个实例地)增加流量负载。
这是我们最终设置的样子
我们使用 Redis Enterprise API 创建了一个包含 192 个分片的集群 Redis 数据库,使用以下参数:
{
"name": "api-benchmark",
"replication": false,
"port" : 12345,
"sharding": true,
"shards_count" : 192,
"version": "4.0",
"memory_size": 100000000000,
"type": "redis",
"oss_cluster":true,
"proxy_policy": "all-master-shards",>
"shards_placement": "sparse",
"shard_key_regex": [{"regex": ".*{(?.*)}.*"}, {"regex": "(?.*)"}]
}
> curl -k -X POST -u ":" -H "Content-Type: application/json" -d @create_db.json https://localhost:9443/v1/bdbs
我们通过将代理线程数设置为 24 来调优每个节点上的代理,以应对预期的负载
> rladmin tune proxy all max_threads 24
> rladmin tune proxy all threads 24
我们使用了支持 OSS 集群 API 的新版本 memtier_benchmark,首先向数据库填充了大约 1000 万个项目,然后运行了测试。
以下是我们填充和基准测试阶段使用的 memtier_benchmark 参数:
以下是一个 memtier_benchmark 命令行示例
> memtier_benchmark -s $DB_SERVER -p $DB_PORT
--pipeline=$PIPELINE_SIZE -c $NUM_CLIENTS -t $NUM_THREADS
-d $DATA_SIZE --key-minimum=$KEY_MIN
--key-maximum=$MAX_KEYS_PER_SLOT --key-pattern=R:R
--ratio=$WR_RATIO --run-count=1 --requests=$NUM_REQ
--out-file=$OUT_FILE --oss-cluster
我们的最终设置在 Redis Enterprise 集群上运行了一个由 6 个节点组成的 192 分片数据库,并展示了出色的结果:以略高于 1 毫秒的延迟达到了每秒超过 1000 万次操作!以下是 Redis Enterprise UI 的截图
我们进行这项实验是为了验证 Redis Enterprise 的共享无状态架构能够凭借 Redis Enterprise 5.0 中引入的新 OSS 集群 API 实现线性扩展。我们的实验包括:
我们发现在从 1 节点集群扩展到 6 节点集群时实现了线性性能可扩展性,如下图所示
对这些结果的深入分析表明,在从单节点集群扩展到双节点集群,然后扩展到 6 节点集群时,每个节点的吞吐量变化不超过 10%。我们认为,测试之间性能的这些变化可能与每次测试迭代中不同的资源条件(网络、虚拟机等)有关。
随着 OSS 集群 API 的引入,Redis Enterprise 5.0 可以通过简单地向数据库添加分片和向集群添加节点来实现轻松的线性扩展,这一点已通过本次基准测试得到验证。我们计划继续打破数据库领域的性能记录,但我们希望在 re:invent 2017 上分享这一点,所以我们暂时止步于此。请持续关注!