前几天,当我浏览世界时,我阅读了 Aerospike 的 Anshu 和 Rajkumar 在 High Scalability 上的客座文章(顺便说一句,做得很好)。我真的很喜欢整篇文章,并且对他们为将 EC2 实例调整到 1M 标记所做的大量调整印象深刻,但我一直在想——Redis 会怎么做?
我可以进行全面基准测试。但是进行全面基准测试是一项耗时且资源密集的过程。更不用说比较苹果、橘子和各种水果的初始困难。真正的基准测试是一个陷阱,因为它只不过是一项从一开始就被认为是积压的任务。但我想得到答案,而且我想要它很快,所以我愿意做出一些牺牲来得到它。这意味着做第二件最好的事情——一个非基准测试。
非基准测试根据(我自己的)定义,与基准测试完全不同(因此得名)。在其中,你削减每一个角落,放松每一个假设,以获得一个快速粗略的估算。在实验室工作人员的帮助下,我们测量了 Redis 云软件的性能,没有任何进一步的优化。我们在以下设置下运行了我们的非基准测试
我们没有时间设置 VPC 并调整放置组以获得最佳性能,因此我们在标准服务环境中运行了整个过程——即在嘈杂、拥挤的 EC2 网络中。我们也没有为这个实验调整 CPU 行为或线程数量或分片的配置——我们让 Redis 云使用其默认值。我们没有测试多种网络配置,也没有添加额外的弹性网络接口 (ENI)。我们只是在 HVM 上使用了一个新配置的 Redis 云服务器,并对其进行了非基准测试……
您可以在 此 gist 中找到我们运行的原始输出,但最重要的是,它的得分略高于 120 万 TPS(确切地说是 1228432)。当然,这个惊人的结果真的很让我胃口大开,我立即要求进行全面、包含所有优化、经过详尽测试、包含水果和蔬菜的基准测试,以真正了解我们能用 Redis 推动多少极限!猜猜看?它在积压中 🙂
1关于分片和 Redis 云集群的一些说明(如上所述)
根据设计,Redis 服务器(大多数)是一个单线程进程。在这种情况下,通常使用分片来扩展 Redis 数据库,使其超出单个 CPU 内核或单个服务器的 RAM 容量的范围。实现分片有三种普遍接受的方法:客户端、代理或集群。由于基于客户端和代理的分片 Redis 解决方案更容易独立于实际的底层数据库引擎实现,因此这些(例如,Redis-rb 和 nutcracker)已经存在了一段时间了。但是,现在只有少数 Redis 集群解决方案。
分片的 Redis 集群意味着在一台或多台计算节点上跨网络部署的一堆 Redis 服务器(进程)。集群运行 Redis 数据库,每个数据库可能跨越多个节点和多个内核,并在累积的 RAM 量上运行。生产级集群还应该应对诸如确保数据库可用性、性能以及基础设施和数据库资源管理等挑战。
最知名的 Redis 集群实现自然是开源的。 Redis 集群 (v3) 已经处于测试版的后期阶段,预计将在几个月内投入生产。这个即将推出的版本将为我提到的许多挑战提供极好的答案。在其许多新功能中,新的 OSS 版本还包括 创建 分片 集群 的功能。代表整个 Redis 社区(如果我通过推测冒犯了任何人,我表示歉意 :)),我们预计 Redis 3.0 版本将成为各个方面的重要新版本!
除了开源 v3 之外,市面上还有其他一些 Redis 集群。有些人走在了前面,构建了自己的集群,每个人都有自己的理由。我不想说出任何人的名字(比如 Twitter、Flickr 或 Pinterest),但有一家构建了集群的公司是 Redis。我们的 Redis 云服务由我们自己的 Redis 集群实现提供支持,它已经在生产中使用了两年多。在此期间,我们一直在多个云和数据区域构建和运营我们的集群。作为一家初创公司,我们必须构建系统,以便能够经济高效地扩展,以适应我们商业公共服务的辉煌成功。
Redis 是开源 Redis 项目的贡献者——我们的大多数员工都是生活在 Redis 中并且呼吸 Redis 的出色开发人员——但我们的用户需要开源范围之外尚未准备好的解决方案。为了应对这些业务挑战,我们开发了能够让我们动态地将 Redis 数据库从兆字节扩展到太字节的解决方案。我们在四个不同的 IaaS 提供商和约 20 个数据中心中部署、扩展和管理集群。我们的用户创建了数万个数据库,对于每个数据库,我们不仅维护了可用性和性能,而且还负责操作和管理任务(所有这些都由一个 微小的 DevOps 团队 完成)。
要使用我们的 Redis 云集群,只需注册我们的服务并创建一个数据库。您可以在几秒钟内设置一个分片数据库(尽管分片不包含在我们的免费层中)。Redis 云实例可以使用标准策略(即根据 开源 Redis 集群规范)或使用强大的自定义分片策略进行分片,该策略完全可以通过一组正则表达式规则进行配置(查看该功能的帮助页面 以及有关更多信息的未来更新)。
只要我谈到这个话题,这里有一个关于 Redis 集群鲜为人知的事实:您无需在应用程序中更改任何内容即可开始使用它们。是的,您可以使用现有的代码和客户端库(无论是集群和分片感知的还是非感知的),并且您仍然可以获得集群提供的可扩展性、可用性和操作优势。我们的用户只需要创建数据库并配置其选项(可用性、数据持久性、分片、安全性等等)以及“巴辛加”!他们可以使用作为 Redis 集群中数据库网关的单个 Redis URL(主机名和端口)。当然,还有调整、最佳实践、优化、提示、技巧以及您可以在其基础上进行的无数其他事情,但是(如非基准测试所示),即使没有它们,我们的集群也是一个相当不错的表演者。
我本来打算简短说明这些说明,但集群是我最喜欢的主题,我可以一直讲下去(实际上我保证我会——更多相关公告/技术/基准测试/规范/比较将陆续发布)。为了保持这篇文章的大小适中,我将在此结束,并邀请您关注 我们 并在 向 我 喊话——我全天候在线 🙂
这篇文章最初发表于 2014 年 8 月 27 日的 HighScalability.com 上。