VoltDB逐步深入
第一章概述
VoltDB是StoneBraker最新研究成果是一个优化吞吐率的高性能集群开源SQL RDBMS支持ACID。从硬件上看 VoltDB基于PC+以太网+本地存储从体系结构上看其内部是一个ShareNothing的内存数据库通过并行单线程来保证事务一致性和高性能所有事务被实现为Java存储过程所有存储过程事务均全局有序 由于避免了锁的使用 因此可以保证每个事务在所有分区上并行执行完成后才继续执行下一个事务事务不会乱序执行。存储过程内部支持分组、多路Join、聚合、函数等等如果希望提高吞吐率使用单事务多SQL可以有效提高吞吐率。 VoltDB的可靠性通过冗余和自动恢复来保证。
VoltDB值得关注的一个特性是自动数据分区数据表会被自动分配到集群节点。可以看成是传统Sharding的升级、整合版本。另外一个特性是自动快照这样在一个事务内部无需进行IO操作可以在微秒级别完成事务据说性能提高50倍。第三个特性是异步事务提交。从某种意义上看 VoltDB是一个共享内存的集群有些像此前有人提到的“Ram Cloud“。VoltDB的系统性能据说在几个节点就可以达到百万TPSVoltDB支持多节点并行事务处理理论上不存在节点上限不过VoltDB开发人员最大测试集群是20个节点。
第二章简单应用
2.1 voltdb创建数据库及简单操作
1.首先创建一个文件命名为 abner.sql 文件内容为
CREATE TABLE towns (town VARCHAR(64) ,county VARCHAR(64) ,state VARCHAR(2)
) ;
备注 以上的语句称为 schema
2.编译文件 abner.sql 命令如下voltdb compile–o abner.jarabner.sql
备注 voltdb编译abner.sql中包含的schema并创建abner.jar “-o”选项表示自己命名jar包的名字
如果不带“-o”参数则默认生成catalog.jar命令如下voltdbcompi leabner.sql
3.编译成功创建一个应用catalog可以启动数据库启动数据库的参数很多这里不再描述详细选项看第一章启动数据库命令如下
命令 voltdbcreate catalogabner.jar
备注 catalog关键字告诉voltdb创建数据库时使用哪个应用catalog
4.启动成功后验证数据库是否可进行操作例如插入数据查询数据等
新打开一个会话进入voltdb的bin目录在命令行输入 ./sqlcmd
命令执行成功进入voltdb的sql命令行接口然后可进行记录插入和数据查询。
插入数据insert intotownsvalues(‘Bi l lerica’, ‘middlesex’, ‘MA’);insert intotownsvalues(‘Buffalo’, ‘Erie’, ‘NY’);
验证插入记录是否成功select count(*) astotal from towns;
操作完成需要退出sql命令行模式输入 exit即可
如果想关闭数据库进程在启动数据库的会话上通过发送终结信号给操作系统按下Ct r l-C这样数据库就可以关闭了。
2.2导入批量数据工具
在voltdb的bin目录下有个文件 csvloader此文件为shel l脚本可批量导入数据待导入的数据为 data.txt字段间的分隔符为 “|”位于 /home目录下
首先启动数据库voltdb compi lecatalogabner.jar
启动成功后打开一个新会话进入voltdb的bin目录执行如下命令
./csvloader --separator “|” --skip 1--fi le/home/data.txt towns
备注
--separator表示字段间以什么作为分隔符
--skip文件中跳过的行数 --skip1表示第一行不导入
--fi le文件位置towns表示导入数据的表名
导入完成后进入sql命令行模式
./sqlcmd
可进行查询 select*from towns;
2.3分片
Partitioning分片或者说分区是voltdb的最重要的特性之一。分区的目的是分割数据和处理数据的过程。
如果一个表被分区每次插入数据 voltdb按照分区列决定此行记录插入到哪个分区例如towns表安好town列分区那么对于有同样town的行存在同一个分区中。
按照指定列分区命令如下
PARTITIONTABLEtownsON COLUMN town
如果两个表有着同样的字段例如
CREATE TABLE towns (town VARCHAR(64) ,state VARCHAR(2) ,state_num TINYINT NOT NULL,county VARCHAR(64) ,county_num SMALLINT NOT NULL,elevation INTEGER
) ;
CREATE TABLE people (state_num TINYINT NOT NULL,county_num SMALLINT NOT NULL,state VARCHAR(20) ,county VARCHAR(64) ,population INTEGER
) ;
Towns和people表都有state state中state是缩写在people中是全称 因此用state_num作为分区字段更好。
PARTITION TABLE towns ON COLUMN state_num;
PARTITION TABLE people ON COLUMN state_num;
如果使用state进行查询的情况更加频繁则可以创建一个repl icatedtable复制表CREATE TABLE states (abbreviation VARCHAR(20) ,state_num TINYINT,name VARCHAR(20) ,
PRIMARY KEY (state_num)
) ;
这个表尽可能只用来进行读并且每个分区中都会创建。
实现方法用CREATE TABLE而不用PARTITION TABLE
缺点比较明显 降低并发性而且要插入数据要在所有的分区执行一次
2.4更新schema和持久化
保存数据
Voltdb数据库的快照完全基于磁盘的包括所有的数据。在voltdb数据库运行中可以通过
命令 voltadmin save创建快照
Voltadmin save/home/voltdbroot/snapshots/“towns”
创建的快照名是 towns存放的路径为 /home/voltd broot/snapshots/
有了复制数据库的功能可以通过recover命令代替create来启动数据库
命令 Voltdb recover
如果有多个快照 Voltdb查找最新的快照进行恢复快照包含了catalog和数据在恢复时不需要指定catalog
用voltadmin update实现更新命令如下
命令 voltadmin updatetowns.jarvoltdbroot/deployment.xml
必须指定schema和deployment
对表结构的调整要先保存数据然后将数据导入新数据库voltadmi n restore命令可以恢复数据但不包括catal og
命令 voltadmin restore /home/voltdbroot/snapshots/ "states"
将快照的数据导入表:states但catalog已经存在不会修改catalog
在开发或者测试阶段我们手动恢复数据或者更新catalog是必须的但在应用阶段就有必须保持快照是最新的 以防宕机或者其它意外。
解决方法
定时执行快照计划对数据库的数据进行备份通过配置文件的配置项完成
配置项如下
<snapshot prefix="tutorial"frequency="5m"retain="3"
/>
Snapshot的名字叫做 tutorial 快照执行的频率为 5min保留3分最近的快照。其余的快照将被删除 以节省空间。
通过命令voltdb recover host localhost deployment deployment.xml
更新配置项如果是集群则把“localhost”替换为集群的leader
2.5存储过程
每次执行复杂的查询是令人讨厌的 voltdb支持通过存储过程执行。每次只修改输入。创建存储过程的schema
Create procedure as
例如
CREATE PROCEDURE leastpopulatedAS
SELECT TOP 1 county, abbreviation, population
FROM people, states WHERE people.state_num=?
AND people.state_num=states.state_num
ORDER BY population ASC;
leastpopulated存储过程的名字
?作为输入参数用户可以指定条件查询的具体条件值
创建的存储过程中也可以指定单分区或者多分区
可以在不停止数据库的情况下更新数据库更新方式和更新表的方法一样
例如
$ voltdb compile -o towns.jar towns.sql
$ voltadmin update towns.jar deployment.xml
存储过程支持j ava客户端可以用于设计更加复杂的存储过程import org.voltdb.*;public class LeastPopulated extends VoltProcedure {public final SQLStmtgetLeast = new SQLStmt(
" SELECT TOP 1 county, abbreviation, population "
+ " FROM people, states WHERE people.state_num=?"
+ " AND people.state_num=states.state_num"
+ " ORDER BY population ASC; " ) ;public VoltTable[ ] run(integer state_num)throws VoltAbortException {voltQueueSQL( getLeast, state_num ) ;return voltExecuteSQL( ) ;
}
}
Jvava的存储过程作为一个单元、事务要么成功要么失败。
编写了java的存储过程将其编译然后利用命令
CREATE PROCEDURE FROM CLASS UpdatePeople;
PARTITION PROCEDURE UpdatePeople ON TABLE people COLUMN state_num;第三章集群实战
搭建集群三个节点
10.1.1.51
10.1.1.52
10.1.1.55
要在三个节点执行相同的操作
1. 安装voltdb
2. 创建schema
CREATETABLE HELLOWORLD(
HELLOVARCHAR(15),
WORLDVARCHAR(15),
DIALECTVARCHAR(15)NOT NULL,
PRIMARY KEY(DIALECT)
);
PARTITION TABLE HELLOWORLD ON COLUMN DIALECT;
CREATE PROCEDURE FROM CLASS Insert;
CREATE PROCEDURE FROM CLASSSelect;
PARTITION PROCEDURE Insert ON TABLE HELLOWORLD COLUMN DIALECT;
PARTITION PROCEDURESelectONTABLE HELLOWORLD COLUMN DIALECT;保存为 hel loworld.sql
3.
有在六月份的时候也有分享过新网域名注册商发布的域名促销活动(这里)。这不在九月份发布秋季域名促销活动,有提供年付16元的.COM域名,同时还有5个+的特殊后缀的域名是免费的。对于新网服务商是曾经非常老牌的域名注册商,早年也是有在他们家注册域名的。我们可以看到,如果有针对新用户的可以领到16元的.COM域名。包括还有首年免费的.XYZ、.SHOP、Space等等后缀的域名。除了.COM域名之外的其他...
CheapWindowsVPS是一家成立于2007年的老牌国外主机商,顾名思义,一个提供便宜的Windows系统VPS主机(同样也支持安装Linux系列的哈)的商家,可选数据中心包括美国洛杉矶、达拉斯、芝加哥、纽约、英国伦敦、法国、新加坡等等,目前商家针对VPS主机推出5折优惠码,优惠后最低4GB内存套餐月付仅4.5美元。下面列出几款VPS主机配置信息。CPU:2cores内存:4GB硬盘:60G...
至今为止介绍了很多UCLOUD云服务器的促销活动,UCLOUD业者以前看不到我们的个人用户,即使有促销活动,续费也很少。现在新用户的折扣力很大,包括旧用户在内也有一部分折扣。结果,我们的用户是他们的生存动力。没有共享他们的信息的理由是比较受欢迎的香港云服务器CN2GIA线路产品缺货。这不是刚才看到邮件注意和刘先生的通知,而是补充UCLOUD香港云服务器、INTELCPU配置的服务器。如果我们需要他...