1.概要信息
1.1VoltDB为何物?
VoltDB是为满足极端多的事务处理以及以下需求而设计的关系数据库系统:
可以提供比传统数据库系统好很多的性能。
可以线性扩展。
兼容SQL作为数据库管理接口。
兼容ACID,满足数据一致与完整性。
7*24*365高可用。
1.2VoltDB架构
VoltDB数据库是一个分布式,可扩展,shared-nothing的内存数据库。使用JAVA 写的存储过程来定义事务。使用标准SQL访问数据,使用并行的单线程处理方式确保数据一致性,同时避免了传统数据库的锁,插销,资源管理开销。
1.3VoltDB如何获得ACID兼容
为确保数据可靠性,必须满足原子性,一致性,隔绝性,持久性四个特征。
原子性:
VoltDB通过使用存储过程来确保原子性,一个存储过程执行必须等待前一个存储过程成功或回滚结束。
一致性:
VoltDB在所有的数据库查询中强制schema与数据类型约束.
隔绝性:
VoltDB事务全局(所有被影响的分区)顺序执行(没有交叉)(任何一个分区同一时间只有一个执行,即串行的)。
持久性:
VoltDB提供分区复制以及周期性的数据库snapshot,确保数据持久化。
1.4可扩展性是如何得来的?
VoltDB自动在集群中的可用节点分发行记录。通过增加集群节点,可以提高数据库集群的性能和容量,当数据重新载入时,VoltDB自动重分布数据。
1.5VoltDB如何处理数据库分区
VoltDB通过分区计划将行分发到各个数据库分区。用户通过指定被分区的表的列,作为内部HASH函数的输入参数。注意,不是所有的表都需要被分区,读比较多的表考虑复制较合适
1.6VoltDB分区与传统数据库分片的不同
传统的数据库分片,数据表被存放在完全不相干的数据库当中。更加可怕的是,数据一致性必须通过应用逻辑来保证。但是使用VoltDB的话,ACID兼容性是基于整个数据库集群的,不需要应用来考虑。
另一个传统数据库分片的弱点是数据备份,恢复以及管理,都必须基于单个节点。而使用VoltDB就没有这么麻烦了,这些操作都被集中化了。
1.7适合VoltDB的应用场景
VoltDB适合OLTP系统,单个事务较小,但是事务总量非常之多的应用。比如金融,零售,WEB2.0等传统OLTP应用。
2.比较信息
2.1VoltDB与MySQL数据库分片的区别
VoltDB设计的初衷是提供高并发能力,对应用来说透明的分区解决方案。MySQL的数据库分片方案,需要应用编写代码来管理和访问数据库分片,或者理解为MySQL的数据库分片对应用来说不是透明的。
VoltDB的水平分区不牺牲ACID特性,可管理性。同时不会增加程序设计的复杂度。
对于OLTP系统,在同等硬件的情况下,VoltDB提供比MySQL分片更好的性能。
2.2VoltDB与MySQL with Memcached的区别
Memcached,分布式内存缓存.一般放在应用和数据库之间,提供频繁访问的数据库对象的缓存,但是需要应用来管理这个缓存。memcached本身并没有可靠性和一致性保障,需要应用来管理缓存和数据库的HASH算法。更重要的是CACHE的使用一般只对读性能有提高,而写的话可能反而更差劲。
VoltDB提供比memcached同等或更高的读性能,同时不失ACID特性,更加重要的是,VOLTDB提供与读同等性能的写性能。
2.3VoltDB与Key-Value数据库的区别
Key-Value数据库用于存储任意数据,基于各自KEYS。因为只有一个KEY,所以Key-Value数据库做分布式架构非常的简单。但是Key-Value不提供结构化数据存储,不提供系统数据可靠性。
使用VoltDB可以存储结构型或非结构型数据,同时提供数据存储的可靠性,一致性,持久化,标准SQL接口。VOLTDB甚至可以在一个事务中通过多个KEY对数据进行读写.VoltDB提供与键值数据库相当或者更好的事务吞吐能力
3.技术信息
3.1VoltDB支持的平台
目标平台CENTOSv5.4,兼容64-bit POSIX-compliant 平台。支持Ubuntu9.04 OSX10.5,10.6。使用源代码及编译脚本支持更多操作系统。
3.2VoltDB支持的SQL
VoltDB v1版支持ANSI-标准SQL子集,支持CREATE INDEX, CREATE TABLE, CREATE VIEW ,SELECT, INSERT, UPDATE, DELETE 。
其他SQL将陆续在后续的版本添加。参考VOLTDB手册。
3.3VoltDB是否支持blob
当前版本不支持blob,但是可以使用varchar存储BASE64来代替,限制最大1M大小。
3.4VoltDB为什么不支持ODBC/JDBC?
VoltDB的主要交互通过JAVA存储过程实现,使用ODBC,JDBC连接意义不大。应为所有的添加修改操作必须新建或修改JAVA存储过程。
3.5如何增加VoltDB集群的容量?
VoltDB的大小由初始话过程决定,编译应用CATALOG,启动数据库。要增加集群容量,需要做如下操作:
1。使用SnapshotSave存储过程将当前数据库内容镜像到磁盘。
2.重新编译应用CATALOG,指定VOLTDB集群新的SIZE。
3.重启VOLTDB数据库集群,使用新的CATALOG。
4.使用SnapshotRestore系统过程还原第一步备份的镜像至新的VOLTDB集群。
3.6VoltDB数据库集群最大支持多少节点?
VoltDB单个节点的性能约为传统DBMS的30-50倍,同时VOLTDB官方已经在3-12个节点的集群上都做过测试,在小于12个节点的集群中,性能指标可以达到10万TPS。并且已经成功部署20个节点的集群,尽管在VOLTDB的架构上没有限制节点数量,但是如果客户需要部署超过20个节点的集群,可以联系VOLTDB以便做得更好。
3.7VoltDB有哪些数据库管理工具?
在当前的版本中,VoltDB提供了一些命令行工具初始化,创建数据库,其他的如改变日志特征,创建镜像,修改CATALOG,关闭集群可以通过调用系统过程来实现。后续的版本将陆续添加更多的自动化脚本或命令。
3.8数据库监控工具
当前的版本提供的工具不多,可以通过调用Statistics, SystemInformation system procedures来监控数据库。后续的版本会添加更多的友好的工具。
4.最佳实践
4.1自增长的索引列的实现?
目前的版本没有AUTO_INCREMENT功能,如果要实现自增长的列值需求,可以新建一个表,这个表的每一行存储表名,列名,当前值。如
CREATE TABLE AUTOINCREMENT (
TABLE_NAME VARCHAR[50] NOT NULL,
CURRENT_VALUE BIGINT NOT NULL DEFAULT 1
);
然后创建一个存储过程来维护这个表和返回当前值。
4.2使用VoltDB存储Key-Value
使用VoltDB不仅仅可以存储Key-Value,VOLTDB提供了很好的平台来满足类似目的,如通过创建一个两字段的表int|char[],varchar,然后根据int|char[]作为键值分区。这样的话就可以建立一个非结构化的存储结构了。使用VOLTDB存储KV的好处是,提供了同等或超越KV数据库的性能,并且保留了ACID特性。
使用VOLTDB存储KV的限制,单行长度最大1M(VARCHAR),以后可能增加。
4.3如何调整应用,使之在VOLTDB环境获得最大吞吐量
首先遵守如下三条规则:
1.通过设计,尽量减少跨节点的事务。
2.使用异步存储过程调用。如果每一次客户端调用存储过程都需要等待响应的话,VOLTDB的队列不能被充分利用,不能获得最好的性能体现。使用异步调用,同时可以避免客户端性能瓶颈。
3.客户端与VOLTDB的所有节点建立连接,在跨分区事务中性能较好。
其他:调用ExecuteSQL之前队列多个SQL(类似多步提交),
确保最后一个ExecuteSQL调用包含TRUE标签作为一个参数,告知过程可以关闭数据库事务作为最后调用的一部分,而不是某一个步骤.