对云计算供应商成本进行成本比较是很容易的;但是对应用程序进行性能比较则不是那么简单的了。在同一个云计算或跨不同云计算的环境下,对运行其中的不同类型数据库应用程序进行性能比较将是特别具有挑战性的一项工作。雅虎云计算服务基准(YCSB)是专为帮助用户了解不同云计算数据库性能以及在实际负载下存储数据性能表现的一个测试框架。这个测试框架的源代码可从GitHub下载获得。
雅虎云计算服务基准工具包括了两个重要的组成部分:一个工作负载生成器和一组生成器生成的工作负载,以及针对大量NoSQL数据库的接口,其中包括Cassandra、DynamoDB、Hbase、MongoDB、Redis以及甲骨文公司的NoSQL数据库。当然,它还配有一个用于关系型数据库的JDBC接口。
当面临进行应用程序架构决策时,诸如YCSB这样的数据库测试基准是特别有用的。例如,一个不再满足性能需求的现有数据库应用程序可能会迫使你考虑扩容硬件资源或者变更基础数据库。如果额外的硬件能够实现近乎线性的性能提升(例如,双倍的服务器可实现双倍的性能),那么硬件扩容将是一个合适的选择。但是,硬件扩容并不总是能够帮助我们实现性能的线性提升,因为不让管理员充分发挥额外硬件资源优势的应用程序中还存在着其他的性能提升瓶颈。
如果你更换了你的数据库,那么你就会有很多的选择项,特别是如果你选择使用NoSQL数据库来取代之前的关系型数据库。虽然一开始的性能提升可能并不明显,但是一些特定类型的NoSQL数据库将说明问题。例如,社交网络分析就正好适合使用图形数据库。如果用户不需要支持复杂查询应用,那么诸如Cassandra和Amazon DynamoDB这样的关键值数据库则可能比MongoDB这样的文档存储更为适合。测试基准可以通过测试数据来帮助你决定哪一个数据库最适合你的需求。
运行YCSB的***步就是确定你所希望测试的数据库类型以及希望在数据库上运行的工作负载。一旦你已经创建了你的数据库,那么你必须创建一个与你的目标工作负载相关的计划。计划的实施细节将随数据库类型的不同而有所变化。例如,可能在MySQL中创建一个数据表,而在Cassandra中创建一个列族和关键值空间。
测试基准是比较数据库性能的一大利器,但是工作负载也必须配合你的实际生产负载,当选择数据库时,除测试结果外还需要考虑其他的设计考量。你可以运行由YCSB提供的核心工作负载或者创建你自己的。核心工作负载包括一组六个具有不同读/写操作特性的工作负载。一些工作负载是以更新升级为主的,而另一些则是测试读操作性能的。如果你创建你自己的工作负载,那么你就必须开发一个Java应用程序,以便于扩展现有YCSB类生成数据并执行读/写操作。
工作负载是使用参数开关进行设置的,因此你是可以在不同的线程数和单位时间运行数下测试工作负载的。它分为了两个阶段:创建数据的导入阶段,和执行特定工作负载下操作然后输出一组性能统计数据的执行阶段。除了运行时间和单位时间的运行次数外,还有很多的延迟测量数据,其中包括平均值、***值、最小值、第95个百分点的延迟数和99个百分点的延迟数。
如果你有一个现成的应用程序,它可能会从性能监控工具中收集数据以确定你的应用程序中读、写以及更新操作的运行数据。如果你使用了一个关系型数据库,那么则需特别关注运行次数最频繁和运行时间最长的查询操作。
有很好的候选对象可供在自定义工作负载中使用。
如果你开发了一个新应用程序,那么你应当在正式把应用程序投入生产之前运行一系列的测试基准以便于对大量的不同的可能生产负载进行评估。这可以为不同条件下不同数据库的性能表现评估提供有价值的信息。如果你希望了解大部分时间的中等工作负载以及设计需求中偶尔发生的高峰工作负载的运行情况,可针对两种情况进行测试。理想情况下,你所选择的数据库将在所有预期的情况下性能表现良好。
你还应当根据使用频率来选择数据库。如果一个数据库在大多数预期的工作负载下能够表现良好,但在一个设计范围外或偶尔发生的工作负载下表现糟糕,那么你可能会选择这个数据库。