我们新发布的 Redis Enterprise 5.0 引入了对开源 (OSS) 集群 API 的支持,该 API 允许一个 Redis Enterprise 集群 通过仅仅添加分片和节点,实现无限并且线性地扩展。OSS 集群 API 依赖于客户端的智能,基于 key/value 项目的 key 部分和客户端和集群之间共享的一个哈希函数,决定将请求发送至哪个分片/节点。本文解释了 Redis Enterprise 如何使用 OSS 集群 API 并验证无限的线性性能可扩展性。
对于那些不熟悉 Redis Enterprise 架构的人,让我们从一些简短的背景开始
在 Redis Enterprise 术语中,一个集群是一组云实例、虚拟机/容器节点或裸机服务器,它允许您在跨多个 Redis 分片/实例的内存池中创建任意数量的 Redis 数据库(在 Redis Enterprise 术语中,一个数据库是管理整个数据集的实体。不要将它与每个 Redis 实例中的数据库混淆,您可以利用这些数据库使用 Redis SELECT 命令在密钥空间中进行一些分段)。集群有一个对称共享无架构,数据路径和控制及管理路径完全分离,并且包括以下主要组件
Redis Enterprise 群集中的数据库可以在下面任何一个配置中创建
基于其强大的多租户技术,一个 Redis Enterprise 群集可以以完全隔离的方式,在相同的群集资源上管理不同类型的多个数据库。
为了利用新的 OSS 群集 API,当使用 Redis Enterprise API 创建数据库时,您应该使用以下属性
这将创建一个类似以下显示的属性的集群数据库
你看
考虑到这些,我们决定在 AWS 上构建一个测试环境,以验证 Redis Enterprise 是否真的可以无限且线性地扩展。由于我们计划进行一些大负载,我们决定将 EC2 m4.16xlarge 实例(64 个内核、256GB RAM)用于集群节点,将 c4.8xlarge 实例(36 个内核、60GB RAM)用于运行 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://#:9443/v1/bdbs
我们通过将代理线程数目设置为 24 来调整每个节点上的代理,以应对预期负荷
> rladmin tune proxy all max_threads 24
> rladmin tune proxy all threads 24
我们使用了支持 OSS 集群 API 的 memtier_benchmark,首先往数据库中填充大约 10 00万项,然后运行测试。
以下是我们在填充和基准测试阶段使用的 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 个分片的数据库,并展示了出色的结果:超过 1000 万次操作/秒,且延迟略高于 1 毫秒!以下是从 Redis Enterprise UI 采取的屏幕截图
我们进行了这个实验,以便验证 Redis Enterprise 的无共享架构,可以借助 Redis Enterprise 5.0 中引入的新 OSS 集群 API 线性扩展。我们的实验包括
我们发现,从 1 个节点的集群扩展到 6 个节点的集群时,性能可线性扩展,如下图所示
对这些结果进行更深入的分析表明,在将单节点集群扩展到双节点集群,再扩展到 6 节点集群时,每个节点的吞吐量变化都不超过 10%。我们认为,测试之间的这些性能变化可能与每次测试迭代时不同的资源条件(网络、虚拟机等)有关。
随着 OSS 集群 API 的推出,Redis Enterprise 5.0 只需向数据库添加分片,并向集群添加节点,便可轻松地进行线性扩展,如本次基准测试所证明的那样。我们计划继续打破数据库领域的性能记录,但我们希望在 2017 年 re:invent 大会上分享这一点,所以停留在了一半。请继续关注!