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

NewSQL数据库VoltDB特性简介的更多相关文章

  1. 十六款值得关注的NoSQL与NewSQL数据库--转载

    原文地址:http://tech.it168.com/a2014/0929/1670/000001670840_all.shtml [IT168 评论]传统关系型数据库在诞生之时并未考虑到如今如火如荼 ...

  2. 我发起了一个 .Net 平台上的 NewSql 数据库 BabanaDB

    发起这个项目的起因, 是偶然看到一个网友发的 MongoDB 的 新闻, 我想, 像  MongoDB  这样的 非关系数据库 ,随时 都可以写 很多个, 真正 难写 的 是  关系数据库, 非关系数 ...

  3. [转帖]sql server版本特性简介、版本介绍简介

    sql server版本特性简介.版本介绍简介 https://www.cnblogs.com/gered/p/10986240.html 目录 1.1.sql server的版本信息 1.2.版本重 ...

  4. 分库分表 or NewSQL数据库?终于看懂应该怎么选!【转】

    最近与同行科技交流,经常被问到分库分表与分布式数据库如何选择,网上也有很多关于中间件+传统关系数据库(分库分表)与NewSQL分布式数据库的文章,但有些观点与判断是我觉得是偏激的,脱离环境去评价方案好 ...

  5. ES6新特性简介

    ES6新特性简介 环境安装 npm install -g babel npm install -g babel-node //提供基于node的REPL环境 //创建 .babelrc 文件 {&qu ...

  6. SpartanBrowser产品和安全特性简介

    v:* { } o:* { } w:* { } .shape { }p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-botto ...

  7. Atitit.数据库新特性战略规划 mssql sql server 2008 SQL2012 SQL2014

    Atitit.数据库新特性 mssql sql server 2008 SQL2012 SQL2014 1. Sql2012 新特性 1 1.1. 增加了Sequence对象. 1 1.2. 新的分页 ...

  8. AsyncLocal 与 ThreadLocal ThreadStatic特性简介

    AsyncLocal 与 ThreadLocal [.NET深呼吸]基于异步上下文的本地变量(AsyncLocal) https://www.cnblogs.com/tcjiaan/p/5007737 ...

  9. 大数据技术原理与应用【第五讲】NoSQL数据库:5.5 从NoSQL到NewSQL数据库

    应用场景: OldSql数据库:希望一种架构就能支持多种应用场景,但证明不可能.   NewSql数据库:同时具备OldSql和NoSQL各自的优点:水平可扩展性,强一致性,事务一致性,支持查询,支持 ...

随机推荐

  1. Java IO(三)

    在Java IO提供的类中,除了前面介绍的RandomAccessFile类之外,还有一系列的io操作类. 主要分为两大类.字符流和字节流.关系图如下: 在Java IO的操作中,很好的体现了Java ...

  2. ●codeforces 528D Fuzzy Search

    题链: http://codeforces.com/problemset/problem/528/D 题解: FFT 先解释一下题意: 给出两个字符串(只含'A','T','C','G'四种字符),一 ...

  3. UVA 11584 划分回文字串

    将其划分为尽可能少的回文串 dp[i] = min(dp[i],dp[j] + 1)    来表示j+1~i是回文串 #include <iostream> #include <cs ...

  4. Python中模块之logging & subprocess的讲解

    subprocess & logging模块的介绍 1. subprocess 该模块替代了os.system & os.pawn*所实现的功能. 2. logging 1. 日志五大 ...

  5. JsonArray转List,list转json字符串

    JsonArray data = object.getAsJsonArray("data"); Gson gson =new Gson(); List<Object> ...

  6. WEB中间件--Jboss未授权访问,

    1,Jboss未授权访问部署木马 发现存在Jboss默认页面,点进控制页 点击 Jboss.deployment 进入应用部署页面 也可以直接输入此URL进入 http://www.ctfswiki. ...

  7. Golang学习笔记:channel

    channel channel是goroutine之间的通信机制,它可以让一个goroutine通过它给另一个goroutine发送数据,每个channel在创建的时候必须指定一个类型,指定的类型是任 ...

  8. C# 制作屏保(图片位置随机变化)

    最近无所事事,闲着无聊,在网上翻看资料时碰巧看到了屏保制作,根据大神的思路也理解到屏保也不是很难.因此根据我自己的理解,动手谢了一个屏保. 首先,打开VS2010创建一个Windows窗体应用程序,名 ...

  9. python 类属性.方法 实例的基本用法

    class man(): classify = "people"# 全局属性 def __init__(self,name,age,value,):#类方法 self.name = ...

  10. 【转】动态规划DP

    [数据结构与算法] DP 动态规划 介绍 原创 2017年02月13日 00:42:51 最近在看算法导论. DP全称是dynamic programming,这里programming不是编程,是一 ...