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. [COGS 1799][国家集训队2012]tree(伍一鸣)

    Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...

  2. [NOI 2010]航空管制

    Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上 ...

  3. ●BZOJ 4008 [HNOI2015]亚瑟王

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4008题解: 概率dp,神仙题 如果我们可以求出每种牌被取到的概率f,那么最后期望造成的伤害也 ...

  4. [Codeforces]906D Power Tower

    虽说是一道裸题,但还是让小C学到了一点姿势的. Description 给定一个长度为n的数组w,模数m和询问次数q,每次询问给定l,r,求: 对m取模的值. Input 第一行两个整数n,m,表示数 ...

  5. nginx负载均衡及详细配置

    接上篇nginx配置,然后再准备两台web服务器: nginx服务器:192.168.0.241 web1:192.168.0.141 web2:192.168.0.142 一.两台web服务器先安装 ...

  6. candy(动态规划)

    题目描述 There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  7. Python小代码_14_交换 2 个变量的 3 种方式

    a = 4 b = 5 #第一种 c = a a = b b = c print(a, b) #输出结果 #5 4 #第二种 a = a + b b = a - b a = a - b print(a ...

  8. CentOS, Fedora, or Red Hat一行命令安装apache + mysql + php 及各种依赖库

    sudo sh -c "yum install httpd httpd-devel mysql mysql-server mysql-devel php php-mysql php-comm ...

  9. Node.js Domain 模块

    Node.js Domain(域) 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的异常.引入 Domain 模块 语法格式如下: var domain = require(" ...

  10. CentOS 7安装Python3.5,并与Python2.7兼容并存

    CentOS7默认安装了python2.7.5,当需要使用python3的时候,可以手动下载Python源码后编译安装.1.安装python3.5可能使用的依赖1 yum install openss ...