(一)VoltDB 简介

Posted on 2017-01-11(星期三) 12:00 in VoltDB

一、VoltDB 简介

VoltDB 是一种内存数据库,作为常见的内存数据库( K-V 存储),但也可以只将这种k-v形式存储的内存数据库称为内存缓存(cache),其不是通常sql操作数据库因此也称类似的数据存储为 NoSQL,但作为新型的内存数据库NewSQL,不同于 NoSQL 数据库,它还是立足于常用的关系型数据库数据存储方式,并且支持 sql,支持事务。

作为新兴的一种内存数据库技术,VoltDB 可以说是完美,尤其是对于数据量大,单笔数据小的使用场景,voltDB 占尽了优势,采用内存存储,是为了提高传统关系型数据库速度的瓶颈,shard-nothing 结构让它可以做到集群部署的高可用,弹性存储。最关键的是其很好的继承了传统数据库的sql以及事务特性,这对于其使用者可以很好的从传统关系型数据库切换到voltDB来。下面将具体介绍 VoltDB 的特性以及使用。

1.1 事务

VoltDB 的事务沿用了传统关系型数据库的特性,并且在传统型数据库事务之上做出了很多优化以及改进。

VoltDB 是如何确保其事务特性?(ACID)

  • 原子性:对于一次事务的执行,在 VoltDB 中 提供了存储过程来封装,以此来保证原子性。
  • 一致性:VoltDB 消除了数据库的锁,插销和资源管理的开销,使用并行的单线程方式确
  • 隔离性:VoltDB 实现了事务的最高隔离级别,可串行化读。
  • 持久性:VoltDB 目前存在的两个版本,社区版与企业版,对于企业版支持周期性的数据库的snapshot,而社区版的持久化方案,会在后面的章节中详细介绍。

1.2 SQL结构语言

VoltDB 最大的优点之一,它很好的支持了 SQL,按 SQL99 标准来书写 SQL 。它包含了 DDL ,DML 以及 SQL 函数。DDL 支持创建 TABLEVIEWINDEX 等常用的 DDL,另外还有 PROCEDURESTREAMVoltDB特有的 DDL,VoltDB支持的 DML 语言包含了以下介绍的几种,DELETEINSERTSELECTUPDATE以及UPSERTUPSERT可以理解为一种复合操作。需要特殊说明的是,在VoltDBDELETEUPDATE是不允许出现子查询的,只有SELECTINSERT操作可以支持子查询,其中INSERT也只支持简单的子查询。

image

image

下面来强调说明 VIEW 以及 STREAMVIEW 在传统关系型数据库当中是为了减少 sql 重复使用等用途,同样在 VoltDB 中使用视图(物化视图)可以在某一程度上很大的提升查询速度,但是在创建 VIEW 时必须含有聚集函数。STREAM 在企业版的使用中( STREAM 暂不支持社区版)是用来从 VoltDBExport 数据到其他目的地,比如 file,kafka,elasticsearch,rabbitMQ,jdbc 等。

1.3 分区

VoltDB 分区特性可以说是其提高检索速度的一大关键因素,尤其在做几张大表的联表查询的时候,效率尤为显著。VoltDB 的分区计划是将行平均分发到各个节点分区。用户通过指定被分区的表的列(分区键),作为内部Hash函数的输入参数,进行 Hash 策略分区。在整个集群中,所有的节点对等,数据平均分发。

image

上述图中三张表,每张表都做了 Partition 然后平均分发到集群下的三个节点上。当然也可以做到单个节点分成多个区来存储。 VoltDB 另外还提供了一种 Replication 存储,这种方式可以说是小表的一种特有,在默认情况下,VoltDB 对所创建的表都是做了 Repliaction 操作,即为每个节点复制一张同样的表结构以及表数据。

另外,分区特性的最佳实现必须基于分区键的选取以及设计。其他因素涉及到集群的参数以及硬件设备。

1.4 存储过程

VoltDB 所有的事务都是由 java 实现的预编译存储过程实现的,且所有的存储过程在任意站点上都是序列化执行的,这样使 VoltDB 达到了最高的隔离级别,且消除了锁的使用,很好地提高了处理速度。VoltDB 提供了两种接口,http JSON 以及 JDBC,使用任意接口都可以实现客户端调用已经部署好的存储过程。

image

1.5 处理速度以及高可用集群

VoltDB 与传统关系型数据库最大的一点差距在于它的速度,尤其在事务处理量(秒级)以及联表查询。另外其企业版的支持的高可用也是相当棒,在出现范围内的节点宕机,集群可以保证正常工作并且保证数据不丢失。而设置与这些特性有关的参数 siteperhost 与 ksafty 也同样非常关键,详细的将会在下面章节中具体介绍。

二、参考文档

  1. https://docs.voltdb.com/UsingVoltDB