快照voltDB学习笔记

voltdb  时间:2021-01-26  阅读:()

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.

ZJI-全场八折优惠,香港服务器 600元起,还有日本/美国/韩国服务器

月付/年付优惠码:zji  下物理服务器/VDS/虚拟主机空间订单八折终身优惠(长期有效)一、ZJI官网点击直达ZJI官方网站二、特惠香港日本服务器香港大埔:http://hkdb.speedtest.zji.net/香港葵湾:http://hkkw.speedtest.zji.net/日本大阪:http://jpsk.speedtest.zji.net/日本大阪一型 ...

易探云:买香港/美国/国内云服务器送QQ音乐绿钻豪华版1年,价值180元

易探云产品限时秒杀&QQ音乐典藏活动正在进行中!购买易探云香港/美国云服务器送QQ音乐绿钻豪华版1年,价值180元,性价比超级高。目前,有四大核心福利产品推荐:福利一、香港云服务器1核1G2M,仅218元/年起(香港CN2线路,全球50ms以内);福利二、美国20G高防云服务器1核1G5M,仅336元/年起(美国BGP线路,自带20G防御);福利三、2G虚拟主机低至58.8元/年(更有免费...

RAKsmart 黑色星期五云服务器七折优惠 站群服务器首月半价

一年一度的黑色星期五和网络星期一活动陆续到来,看到各大服务商都有发布促销活动。同时RAKsmart商家我们也是比较熟悉的,这次是继双十一活动之后的促销活动。在活动产品中基本上沿袭双11的活动策略,比如有提供云服务器七折优惠,站群服务器首月半价、还有新人赠送红包等活动。如果我们有需要RAKsmart商家VPS、云服务器、独立服务器等产品的可以看看他们家的活动。这次活动截止到11月30日。第一、限时限...

voltdb为你推荐
美团月付怎么关闭商家退出美团怎么退月付百万的女人们人100%靠外表日剧男主是谁骁龙765g和骁龙865哪个好请问苹果的a13处理器和骁龙865综合性能两个相差大不大?以及打游戏哪个更流畅?机械表和石英表哪个好石英表和机械表哪个好英语词典哪个好哪个英语词典好oppo和vivo哪个好vivo好还是oppo手机好呢?行车记录仪哪个好行车记录仪哪种好用?行车记录仪哪个好我想买一个24小时监控行车记录仪,哪款比较好?网络机顶盒哪个好现在网络机顶盒哪个牌子好?网络机顶盒哪个好机顶盒哪个好用
免费com域名申请 国外php主机 便宜建站 韩国电信 美国主机代购 谷歌香港 howfile 免费dns解析 上海联通宽带测速 免费ftp 东莞服务器托管 石家庄服务器托管 测速电信 腾讯网盘 asp空间 中国电信宽带测速 网站防护 阿里云邮箱怎么注册 mteam 美国十大啦 更多