NewSQL数据库VoltDB特性简介

转自:

https://blog.csdn.net/dc_726/article/details/41909719

https://blog.csdn.net/jxchinaren/article/details/38394217

 

 

VoltDB是一个革命性的新型数据库产品,被称作NewSQL数据库。它基于H-Store,号称比当前数据库产品的吞吐量高45倍,同时又具有很高的扩展性。它的特性主要有以下几点:

Ø  高吞吐、低延迟:通过内存计算,存储过程和串行数据访问实现。

Ø  可扩展性:自动分区和复制,保证性能和可扩展性。

Ø  高可用性:同步的多主复制(在VoltDB中叫K-safety)。

Ø  持久化:数据库快照与命令日志(command log)的创新技术组合。

1 高吞吐、低延迟

VoltDB能够提供高吞吐、低延迟的SQL操作,总体来说,它是通过内存计算避免磁盘阻塞(disk stall),通过存储过程避免用户阻塞(user stall),通过集群结点内的数据访问串行化,避免传统数据库锁、缓冲管理的开销。此外,VoltDB并不是纯Java开发,其SQL执行引擎是C++写成的,所以并不受GC暂停的影响。

Ø  内存计算:使VoltDB在事务执行期间无需等待磁盘加载,避免磁盘I/O开销。充分利用了现代服务器上庞大的内存,将吞吐量最大化。

Ø  存储过程:避免应用与数据库之间的多次通信开销,每个事务被定义成一个存储过程,因此事务只需一次通信往返。然而,VoltDB并不是只支持存储过程,从1.1版本开始已经能够支持来自JDBC、SQL命令行、HTTP/JSON、原生C++/PHP/C#/Node.js等等客户端的SQL查询。唯一的限制就是:VoltDB总是自动提交模式,不支持手动控制事务

Ø  数据访问串行化:传统数据库在前面两种阻塞等待的情况下,会切换执行其他事务,因此会导致很大的锁(latching and locking)开销。而一个VoltDB数据库由许多内存计算引擎组成(叫做partition分区),每个分区都是数据和相关处理过程的集合。VoltDB在集群内自动分发数据创建分区,每个分区内都是单线程的,从而避免了传统数据库对并发控制的开销。

Ø  C++执行引擎:VoltDB使用原生C++代码进行表数据的内存分配和SQL的执行,之所以核心不使用Java就是避免将表数据这种长时间存活的数据放置到JVM堆上,同时对内存使用进行更细粒度的控制。此外,像静态的部署相关和schema相关的数据,尽管是在Java中管理,但也使用DirectByteBuffer分配到堆外内存。所以其实JVM堆只是用来分配事务相关的一些存活期很短的数据,这对于GC来说是合适的负载。

 

如果某个事务只涉及一个单一分区内的数据,则其处理流程如下图所示:

2 扩展性架构

从架构上看,VoltDB属于shared nothing架构,因此可以很容易地实现扩展,可以通过增加已存在结点的容量和性能实现垂直扩展,通过动态增加新结点实现水平扩展,而在这个过程中不需要修改任何数据库schema和应用程序代码。

 

同时,VoltDB不仅支持表分区,还支持表复制。对于大表,可以通过分区来提高性能。对于频繁读取的小表,可以通过复制来减少join。

 

这与分布式缓存GemFire中的mirrored region和partitioned region的概念很像。在GemFire这,mirrored region包含全量数据,而partitioned region只包含分区数据。但不同的是,VoltDB是根据表的特点选择复制或分区,而GemFire则通过mirrored region将其他分区数据抓取到一起形成全量的数据镜像。

 

如果一个事务涉及多个分区的数据访问,那么其处理流程如下图所示。一个结点会充当协调者(coordinator),负责分发任务给其他结点,并收集结果,完成任务。

3 高可用性

不像传统RDBMS产品依赖第三方的HA解决方案,VoltDB提供三种HA能力:K-safety,网络故障检测,存活结点重连(rejoin)。

3.1 K-safety

当配置成K-safety时,VoltDB会自动地复制数据库分区,K表示副本的个数。例如K=0时表示没有副本,所以任何一个结点的故障都会导致整个数据库集群的停止服务。当K=1时表示有1个副本,即一共2份拷贝。要注意的是:VoltDB中的副本是可以读写的,而不是传统的主从复制关系。

 

关于数据同步问题的解决,任何发生在复制分区上的操作都会发送给各个拷贝的结点去执行,来保证一致性。如果其中一个结点失败,那么数据库会继续发送这个操作给失败的结点。因此在这一点上VoltDB与传统数据库有很大不同,不存在多主(multi-master)情况下的数据同步冲突问题。所以K-safety也叫做同步多主复制。

3.2 网络故障检测

当网络发生故障时,VoltDB的结点彼此之间被物理隔离开,而认为对方已经发生故障。那么K-safety机制会使这两侧的结点继续分别提供服务。如果不及时检测到的话,这种“分离的大脑”(split brain)会导致严重的数据同步问题。因此,VoltDB会自动检测网络故障,立即评估出那一侧结点应该继续服务,并快照另一侧的结点数据后停掉服务。当网络故障解决时,可以直接使用下面将介绍到的存活结点重连技术将结点重新加入到集群中。

3.3 存活结点重连

离线的VoltDB结点可以通过rejoin操作重新加入到集群中。具体过程是:首先从兄弟结点获得一份数据拷贝,当追赶上兄弟结点时,此存活结点就可以回到正常状态,接受任务了。

4 持久化

尽管VoltDB的HA能够降低当机概率,但故障还是偶尔会发生,而且DBA有时也要定期地停机维护。因此,VoltDB提供了高性能的快照和命令日志(command log)来支持各种持久化需求。对于日志,VoltDB支持同步和异步,以及刷新到磁盘的时间间隔等配置。

 

那command log与传统的WAL(write-ahead log)有什么区别呢?(待深入研究)

总结

但这样也不代表VoltDB是万能的,其设计和特性决定了其应用场景,VoltDB比较适合高频率请求、短事务的应用,像金融、零售、Web2.0等,以及流式数据应用,像推荐引擎、实时广告平台、点击流处理、欺诈交易检测等。

参考资料

1 VoltDB Technical Overview

2 Using VoltDB

Debunking Myths about the VoltDB in-memory database

Impact of Java Garbage Collection on in-memory databases

Command logging vs. Write-ahead Logging

 

****************************************************************************************

 

VoltDB内存数据库的十大FAQ

1. VoltDB是什么?

->VoltDB是一家新型关系型分布式内存数据库管理系统,以解决OLTP为初衷,正在不断增加处理OLAP,提供BI的功能。VoltDB与传统数据库(如DB2,Oracle,MySQL等)最大的不同点就是,VoltDB把全部数据放在内存里,并且可以scale out,运行在一个集群上,集群上的每个节点都可以执行部分数据处理任务。

VoltDB官网:http://voltdb.com/

 

2. VoltDB支持SQL吗?支持Transaction吗?

-> VoltDB支持大多数SQL语句,目前还在不断增加对SQL的支持。VoltDB的单个SQL语句和Stored procedure都支持Transaction的所有ACID属性,是一个完完全全的支持事务处理的系统。这点与key-value等系统等是有很大区别的。

VoltDB还支持JDBC,ODBC(soon)等接口,客户端也支持语言C#,C++,Erlang,Go,Java,JSON,Node.js,PHP,Python,Ruby等。

 

3. VoltDB适用于什么类型的应用?

->大数据领域可以分两类:a)数据总量大,b)单个数据元小,但数据产生快,有大量高并发。VoltDB主要是来解决Big Data下面Fast Data的问题,同时也在增加处理大数据量的能力。因此,VoltDB更加适合OLTP类型的应用,可以有效提高数据库高并发下的系统吞吐量,常见的应用有几类:a)需要实时交互的大型多人在线游戏,b)在线广告业务,c)移动电信通讯业务,d)银行或股票交易系统,e)在线商城(如淘宝,京东等),f)网络实时监控或传感器应用等

换句话讲,任何需要strong consistency的高并发业务,都是VoltDB最擅长的。同时实时交互的BI和OLAP也是VoltDB很不错的领域。当然如果你的数据规模是PB以上级别的OLAP话,就目前而言,那还是选择基于Hadoop的分析系统比较合适。

 

4. VoltDB数据库性是用什么语言写的?

VoltDB使用的语言大致分两种,底层引擎是C/C++,上层的SQL语义处理,并发管理,分布式集群等任务都是Java。另外,还有些工具使用Python,JS等做的。

底层Engine的任务包括:数据存储,内存管理及SQL具体执行的数据处理

 

5. VoltDB数据库性能到底怎么样?

VoltDB的吞吐量很高,尤其是单位节点的吞吐量,应该是市面上数据库系统最高的了。单台家用笔记本上,也能跑出7,8万TPS(transactions per second)。根据不同的笔记本性能,吞吐量也略有差别。

这里推荐两篇关于VoltDB性能的文章:

a)http://www.csdn.net/article/2013-04-11/2814850-877000-tps-with-erlang-and-voltdb :这是一家游戏公司Eonblast Corporation的CEO自己用Erlang客户端测VoltDB性能的博文,文中测试吞吐量的结果为:87.7万的TPS,完成了350万的QPS。

b)http://voltdb.com/blog/voltdb-in-memory-database-achieves-best-in-class-results-running-in-the-cloud-on-the-ycsb-benchmark-3/:文中对比了YCSB benchmark在云端的测量数据,结论是:VoltDB系统吞吐量可以根据集群的节点数线性增长,Workload B用12个节点跑出72.4万的TPS。要知道12年的MySQL和Cassandra在相似的机器上才跑出不到18万的TPS,现在的VoltDB跑Key-Value的应用,性能是当时他们的4倍之多。

C)https://www.sgi.com/pdfs/4238.pdf:SGI公司对VoltDB性能做了测试:10个节点能跑出120万的TPS,30个节点跑出了337万的TPS。

 

6. VoltDB是内存数据库,数据会不会容易丢失?如何实现高可用性?

数据库中数据的安全,一定是最为关键的问题。作为内存数据库,VoltDB有很多种科技手段来保证数据的可靠性。VoltDB已有不上金融领域的商业应用,这已经证明了内存数据库VoltDB在数据可靠性上是没问题的。

K-safety:VoltDB的数据是分区的,设定K-safety(即同步的分区拷贝数量)参数,可以确保整个集群的稳定性。如果K设置为1,每个分区都在集群内有一个拷贝,如果有一台机器当机了,整个VoltDB集群可以正常运行。

Snapshot(快照):用户可以根据应用设置snapshot的周期,VoltDB可以对数据做snapshot,然后将其写入Disk,数据就永久性的存在了。如果意外当机,VoltDB可以根据磁盘上已有的snapshot文件,进行数据恢复操作。恢复数据速度很快,我自己测试的60多G的数据,完成恢复需要2分钟左右。

Command Logging(命令日志):这个功能是VoltDB特有的,和Snapshot一起使用,记录了保存两次snapshot之间所有写(write)操作的日志,是为了确保不会有任何transaction丢失。读操作(read)不改变数据,所以不被记录。

Database Replication:这个是传统数据库已经有的功能了,就是在另一个地方,做一个完全一摸一样的数据拷贝,如果主集群不工作了(如集体断电),立刻讲服务切换到附属集群上去,通常附属集群要设立在一个物理范围上不同的地区。

以上内容有免费的网上学习视频,会英语的同学强烈推荐:http://voltdb.com/resources/volt-university/tutorials/section-1-6/

 

7. VoltDB是分布式数据库,有哪些特点?

VoltDB分布式内存数据库的性能,没两台机器之间不共享任何内存和数据,可以完全看做独立的两台机器,而只是用网络连接在一起。VoltDB的性能可以线性增长,支持动态添加节点,节点自动恢复等功能。

动态添加节点:不同业务可能会有自己的高峰期,打个比方,如果不满足现在3台机器的性能(吞吐量),可以动态增加节点,提高数据库服务器处理的性能。

节点自动恢复:如果集群中一台机器当机,K-safety参数设置大于或等于1,VoltDB依然可以正常运行。之后,等该机器维修好之后(当然也可换一台新机器),可以动态再添加到集群当中来。

 

8. 谁在使用VoltDB?VoltDB的客户有哪些?

VoltDB的客户数量在400多个,合作伙伴也有30个左右,其中包括惠普HP,雅虎这样的大型IT公司。业务范围也大多是之前提到的VoltDB比较擅长的领域,涉及fast data和高并发的应用。具体情况可以参考链接:

http://voltdb.com/about/customers/

http://voltdb.com/partners/voltdb-partners/

 

9. VoltDB是否开源?有哪些资料参考和学习?

VoltDB有开源版本,免费试用。同时也有商业版,包含有更多功能。下载需要到官网亲自下载,例如数据恢复,command logging等功能是需要需要商业版的,商业版本有30天免费试用的。如果你是开发人员,希望研读源代码或者为VoltDB做贡献,GitHub的Wiki页面上也有如何设置Java eclipse,进行开发。

开源版本下载地址:https://github.com/VoltDB/voltdb/releases

开源代码在GitHub上:https://github.com/VoltDB/voltdb

VoltDB免费在线视频学习课程(会英文的同学,强烈推荐学习):http://voltdb.com/resources/volt-university/tutorials/

VoltDB的JIRA系统:https://issues.voltdb.com/

VoltDB的社区论坛:https://forum.voltdb.com/

VoltDB的支持邮箱:有任何疑问都可以发到此邮箱 support at voltdb.com

 

10. VoltDB商业版本费用如何?

具体的收费规则,我不是很清楚,但我可以确定,一定比传统大型数据库Oracle,SQL Server,DB2啥的便宜好多,比起SAP HANA也要便宜好多好多。

具体情况可以发邮件到support at voltdb.com询问,一定有人会回复相关问题。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章