YugaByte评论:行星级Cassandra和Redis
在我作为数据库应用程序开发人员的几十年中,我从未想到过梦wild以求的是,我可以访问一个事务性的,行星级的,分布式的数据库,甚至比我要比较的许多数据库要少得多。 但是,随着Google Cloud Spanner,CockroachDB,Azure Cosmos DB,Neo4j Enterprise以及最新的YugaByte DB都已投入生产,一次性管道梦想现在已成为现实。
从广义上讲, Google Cloud Spanner提供了可扩展的,分布式的,高度一致的SQL数据库即服务,每个节点每秒可以处理大约2,000次写入和每秒10,000次读取,平均延迟时间为5毫秒。 为了加速不需要绝对最新数据的读取,可以请求Spanner进行过时的读取,因为它支持时间旅行查询。 Spanner使用SQL的Google方言,仅在Google Cloud Platform上运行。
[入门: Azure云迁移指南 。 •教程: Google Cloud入门 。 | 通过InfoWorld的云计算新闻通讯了解云计算的最新发展。 ]
CockroachDB是类似Spanner的开源SQL数据库,支持PostgreSQL有线协议和PostgreSQL SQL方言。 CockroachDB建立在RocksDB之上,RocksDB是一种开放源代码的交易性和一致的键值存储。 像Spanner一样,它支持时间旅行查询。 CockroachDB可以在任何云上运行,可以在具有或不具有业务流程的Docker容器中运行,也可以在Linux服务器或VM上运行。 CockroachDB的企业版增加了地理分区,基于角色的访问控制和支持。
Azure Cosmos DB是一种全局分布的,水平分区的多模型数据库即服务。 它提供了四个数据模型(键值,列族,文档和图形)和五个可调的一致性级别(强,有限制的陈旧性,会话,一致的前缀和最终)。 它提供五种API集:SQL(方言),MongoDB兼容,Azure表兼容,图形(Gremlin)和Apache Cassandra兼容。 它仅在Microsoft Azure云上运行。
Neo4j是使用Cypher查询语言的可伸缩且可生存的图形数据库。 您可以在Windows,MacOS和Linux,Docker容器以及VM中安装其非集群的开源版本。 Neo4j Enterprise支持高可用性和因果群集; 因果群集允许只读副本的异步更新群集,从而为地理分布的部署提供高性能。
输入Yugabyte DB
YugaByte DB是本文的主题,它是一个针对星球级应用程序的开源,高性能事务性高性能数据库,它支持以下三种API集:YCQL,与Apache Cassandra查询语言(CQL)兼容; YEDIS,与Redis兼容; 和PostgreSQL(目前尚不完整,处于beta中)。 YugaWare是YugaByte DB Enterprise Edition的业务流程层。 YugaWare可以快速完成在Amazon Web Services,Google Cloud Platform和(截至2018年第四季度)Microsoft Azure上的分布式集群的拆分工作。 YugaByte DB实现了多版本并发控制(MVCC),但尚不支持时间旅行查询。
YugaByte DB建立在RocksDB键值存储的增强派生之上。 YugaByte DB 1.0于2018年5月发布。
用于使分布式事务数据库一致且快速的两项关键技术是集群共识算法和节点时钟同步。 Google Cloud Spanner和Azure Cosmos DB均使用Leslie Lamport提出的Paxos共识算法 。 CockroachDB和YugaByte DB使用Diego Ongaro和John Ousterhout提出的Raft共识算法 。
Google Cloud Spanner使用基于GPS和原子钟的Google专有TrueTime API。 Azure Cosmos DB,CockroachDB和YugaByte DB使用混合逻辑时钟(HLC)时间戳和网络时间协议(NTP)时钟同步。
YugaByte设计目标
YugaByte的创始人Kannan Muthukkaruppan,Karthik Ranganathan和Mikhail Bautin是Apache HBase的提交者,Apache Cassandra的早期工程师以及Facebook NoSQL平台(由Apache HBase支持)的构建者。 他们对于YugaByte DB的目标是从理论上讲介于Azure Cosmos DB和Google Cloud Spanner之间的分布式数据库服务器。 也就是说,他们希望将Cosmos DB的多模型和高性能属性与ACID事务和Spanner的全局一致性相结合。 描述目标的另一种方式是,他们希望YugaByte DB能够同时成为事务性,高性能和星球级的。
他们将流程分为五个步骤,每个步骤耗时约六个月。 第一步是通过添加Raft共识协议,分片和负载平衡,并删除事务日志记录,时间点备份,来创建强一致性版本的RocksDB,这是用C ++编写的高性能键值存储。和恢复,这需要在更高的层中实现。
下一步是构建日志结构的,文档到**的存储引擎,添加非原始和嵌套类型,例如行,地图,集合和JSON。 然后,他们添加了一个可插拔的API层,例如Azure Cosmos DB,实现了与Cassandra兼容和Redis兼容的API,并将与PostgreSQL兼容的SQL API推迟到以后的阶段。 然后是扩展查询语言。
YugaByte云查询语言(YCQL)扩展了Cassandra API,支持分布式事务,高度一致的二级索引和JSON。 YugaByte字典服务(YEDIS)是Redis兼容的API,具有内置的持久性,自动分片和线性可伸缩性。 YEDIS可以选择从最近的数据中心进行时间线一致的低延迟读取,而强大的写入操作则可以保持全局一致性。 YEDIS还包括新的时间序列数据类型。
最终,在版本1.0中,YugaByte DB Enterprise添加了一层来协调,保护和监视跨多个区域和多个云的生产级部署,并将分布式备份存储到可配置的端点(例如Amazon S3)。 PostgreSQL支持仍然不完整,处于beta测试级别。
分布式ACID交易
冒着彻底简化流程的风险,让我尝试总结一下YugaByte执行分布式ACID事务的方式 。 ACID(代表原子性,一致性,隔离性和持久性)过去被认为是局限于SQL数据库的属性。
假设您提交了一个YCQL查询,其中包含事务内的更新,例如,成对的借方和贷方如果为了确保财务数据库的一致性而失败,则它们都必须中止。 YugaByte DB在无状态事务管理器中接受事务,其中一个在集群中的每个节点上运行。 然后,出于性能目的,事务管理器尝试在拥有该事务访问的大多数数据的平板电脑服务器上安排事务。
事务管理器将具有唯一ID的事务条目添加到事务状态表中。 然后,它将临时记录写入负责交易正试图修改的**的所有平板电脑。 如果存在冲突,则回退冲突的事务之一。
一旦所有临时记录均已成功写入,交易管理器便会要求交易状态记录板使用其Raft日志中“已提交交易”条目的时间戳将所有临时记录替换为常规记录。 最后,交易状态平板电脑将清除请求发送给参与交易的每个平板电脑。
为了提高性能,YugaByte积极地缓存正在进行的交易的信息,实施细粒度的锁定,并使用混合时间领导者租约来防止客户端读取旧领导者的陈旧值。 当没有冲突的操作时,单行ACID事务被优化为具有低延迟。 分布式ACID事务以较高的延迟为代价来保留正确性。
YCQL,YEDIS和PostgreSQL
YugaByte包括几乎完整的CQL实现以及一些扩展。 与Cassandra相比,一个巨大的改进是YugaByte是高度一致的,而Cassandra最终是一致的。 其他增强功能用于分布式事务,高度一致的辅助索引和JSON。 除了短距离扫描外,YugaByte在所有操作方面都胜过Cassandra ,这至少部分是由于其强大的一致性,它允许单次读取而不是Cassandra所需的定额读取。
Cassandra支持YugaByte中尚不支持的四种原始数据类型:日期,时间,元组和varint。 YugaByte对表达式也有一些限制。
YugaByte的Redis实现缺少列表数据类型,但添加了时间序列数据类型。 它增加了内置的持久性,自动分片和线性可伸缩性,以及从最近的数据中心读取数据的能力,从而降低了延迟。
YugaByte的PostgreSQL实现不是很远。 现在,它缺少UPDATE和DELETE语句,表达式,而SELECT语句缺少join子句。
YugaByte安装和测试
您可以从源代码,MacOS,Centos 7和Ubuntu 16.04或更高版本上的tarball以及Docker或Kubernetes上的Docker映像中安装开源YugaByte DB 。 然后,您可以创建集群并测试三个查询API和一些示例工作负载生成器。
我选择在Google Cloud Platform上安装YugaByte DB Enterprise 。 尽管要执行的手动步骤比我想要的要多,但是在获得企业版许可证**后的一个下午,我就可以进行安装和测试。
YugaWare实例在Google Cloud中的四CPU实例上运行后,我将Google Cloud Platform配置为数据库集群的云提供程序。
从YugaWare(YugaByte DB Enterprise的业务流程层)可以看到的Google Cloud Platform。 请注意,地图中每个区域标记内的数字表示该区域中的可用区域数。
然后,我在美国东部地区创建了一个由八个CPU实例组成的三节点群集。
创建一个宇宙。 在这里,我正在美国东部(南卡罗来纳州)区域的单独可用性区域中创建一个由三个节点组成的主群集,每个节点具有八个CPU。 请注意左下方的资源和成本摘要。
helloworld1 Universe的放大视图。 我目前尚未开始负载测试。
helloworld1 Universe的详细信息。 请注意,第二个节点已被选为集群的Raft领导者。
我使用CQL和Redis API进行了负载测试。
CQL(YCQL)基准测试期间的群集性能。 请注意,负载是重读取,强写入的插入等待时间稳定在1毫秒左右,而读取(SELECT)等待时间稳定在更低的值。
CQL和Redis负载测试的吞吐量和延迟。 CQL测试完成后,我进行了Redis测试。
我能够从命令行查询CQL和Redis数据。
使用CQL shell描述一个表并从YugaByte中检索一些记录。
使用Redis CLI从YugaByte检索一些记录。
我还在遍布世界各地的不同区域中创建了一个三节点群集(如下)。 如预期的那样,这花费了更长的创建时间(约45分钟),并且具有更高的写入延迟。 不幸的是,您无法绕开光速。
第二个YugaByte数据库集群,这次遍布全球。
针对全球分布式数据库的CQL负载测试。 请注意更高的写入延迟,以及完全合理的读取延迟。 (此屏幕截图来自YugaByte;我自己的屏幕截图不太清楚。)
YugaByte的费用
三节点的YugaByte DB Enterprise Edition许可证的起价为每年$ 40K。 除此之外,您还需要考虑服务器的成本。 对于使用八个CPU VM实例的Google Cloud Platform上的三节点群集,该费用每月在$ 800到$ 900之间,加上网络流量,也许是每年$ 11K。
我自己一个下午的测试费用为实例0.38美元,区域间出口0.01美元。 从YugaByte DB Enterprise界面中删除数据库集群很容易,而且一旦我停止运行管理和业务流程界面的VM实例,它就不再产生大量费用。
更快,更好,分布式
总体而言,YugaByte DB的性能与广告宣传相符。 在其发展的这一点上,它可用作更快,更好,分布式的Redis和Cassandra。 最终它也应该是一个更好的PostgreSQL,尽管根据我的经验,这需要很长时间(几年而不是几个月),尤其是在尝试调整关系联接的时候。
由于缺乏充实的SQL接口,YugaByte DB尚未与Google Cloud Spanner,CockroachDB或Azure Cosmos DB的SQL接口竞争。 由于缺少图形数据库支持,它尚未与Neo4j或Cosmos DB的图形接口竞争。 它确实与Redis,Cassandra和与Cosmos DB的Cassandra兼容接口竞争。
您是否应该自己尝试YugaByte DB? 如果您需要Redis或Cassandra的分布式版本,或者需要针对全球分布式方案替换MongoDB,则可以。 YugaByte DB还可以用于实现多个目的的单个数据库标准化,例如,像YugaByte客户Narvar所做的那样,将Cassandra数据库与Redis缓存结合在一起。 YugaByte DB还为Cassandra添加了高性能二级索引和JSON类型,从而增加了其作为事务数据库的实用性。
是否需要YugaByte DB的开源版本或企业版本取决于您的预算。 总的来说,如果您是一家初创企业,则可能需要开源版本。 如果您是一家拥有众多事务数据库应用程序的知名跨国公司,尤其是如果您需要经常上下扩展集群,则可能会受益于企业版的其他功能。
From: https://www.infoworld.com/article/3284357/yugabyte-review-planet-scale-cassandra-and-redis.html