voltDB学习笔记

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

VoltDB逐步深入第一章概述VoltDB是StoneBraker最新研究成果,是一个优化吞吐率的高性能集群开源SQLRDBMS,支持ACID。从硬件上看,VoltDB基于PC+以太网+本地存储;从体系结构上看,其内部是一个ShareNothing的内存数据库,通过并行单线程来保证事务一致性和高性能,所有事务被实现为Java存储过程,所有存储过程(事务)均全局有序,由于避免了锁的使用,因此可以保证每个事务在所有分区上并行执行完成后才继续执行下一个事务,事务不会乱序执行。存储过程内部支持分组、多路Join、聚合、函数等等,如果希望提高吞吐率,使用单事务多SQL可以有效提高吞吐率。VoltDB的可靠性通过冗余和自动恢复来保证。VoltDB值得关注的一个特性是自动数据分区,数据表会被自动分配到集群节点。可以看成是传统Sharding的升级、整合版本。另外一个特性是自动快照,这样在一个事务内部无需进行IO操作,可以在微秒级别完成事务,据说性能提高50倍。第三个特性是异步事务提交。从某种意义上看,VoltDB是一个共享内存的集群,有些像此前有人提到的“RamCloud“。VoltDB的系统性能据说在几个节点就可以达到百万TPSVoltDB支持多节点并行事务处理,理论上不存在节点上限,不过VoltDB开发人员最大测试集群是20个节点。第二章简单应用2.1voltdb创建数据库及简单操作1.首先创建一个文件,命名为:abner.sql,文件内容为:CREATETABLEtowns(townVARCHAR(64),countyVARCHAR(64),stateVARCHAR(2));备注:以上的语句称为:schema2.编译文件:abner.sql,命令如下:voltdbcompile–oabner.jarabner.sql备注:voltdb编译abner.sql中包含的schema,并创建abner.jar,“-o”选项表示自己命名jar包的名字,如果不带“-o”参数,则默认生成catalog.jar,命令如下:voltdbcompileabner.sql3.编译成功,创建一个应用catalog,可以启动数据库,启动数据库的参数很多,这里不再描述,详细选项看第一章,启动数据库命令如下:命令:voltdbcreatecatalogabner.jar备注:catalog关键字告诉voltdb创建数据库时使用哪个应用catalog4.启动成功后,验证数据库是否可进行操作,例如:插入数据,查询数据等新打开一个会话,进入voltdb的bin目录,在命令行输入:./sqlcmd命令执行成功,进入voltdb的sql命令行接口,然后可进行记录插入和数据查询。插入数据:insertintotownsvalues(‘Billerica’,‘middlesex’,‘MA’);insertintotownsvalues(‘Buffalo’,‘Erie’,‘NY’);验证插入记录是否成功:selectcount(*)astotalfromtowns;操作完成,需要退出sql命令行模式,输入:exit即可;如果想关闭数据库进程,在启动数据库的会话上,通过发送终结信号给操作系统,按下:Ctrl-C这样数据库就可以关闭了。2.2导入批量数据工具在voltdb的bin目录下有个文件:csvloader,此文件为shell脚本,可批量导入数据待导入的数据为:data.txt,字段间的分隔符为:“|”,位于:/home目录下首先启动数据库:voltdbcompilecatalogabner.jar启动成功后,打开一个新会话,进入voltdb的bin目录,执行如下命令:./csvloader--separator“|”--skip1--file/home/data.txttowns备注:--separator:表示字段间以什么作为分隔符--skip:文件中跳过的行数,--skip1表示第一行不导入--file:文件位置towns:表示导入数据的表名导入完成后,进入sql命令行模式:./sqlcmd可进行查询:select*fromtowns;2.3分片Partitioning:分片或者说分区,是voltdb的最重要的特性之一。分区的目的是分割数据和处理数据的过程。如果一个表被分区,每次插入数据,voltdb按照分区列决定此行记录插入到哪个分区,例如towns表,安好town列分区,那么对于有同样town的行,存在同一个分区中。按照指定列分区命令如下:PARTITIONTABLEtownsONCOLUMNtown如果两个表有着同样的字段:例如CREATETABLEtowns(townVARCHAR(64),stateVARCHAR(2),state_numTINYINTNOTNULL,countyVARCHAR(64),county_numSMALLINTNOTNULL,elevationINTEGER);CREATETABLEpeople(state_numTINYINTNOTNULL,county_numSMALLINTNOTNULL,stateVARCHAR(20),countyVARCHAR(64),populationINTEGER);Towns和people表都有state,state_num,但是两张表中的state不完全一致,在towns中state是缩写,在people中是全称,因此用state_num作为分区字段更好。PARTITIONTABLEtownsONCOLUMNstate_num;PARTITIONTABLEpeopleONCOLUMNstate_num;如果使用state进行查询的情况更加频繁,则可以创建一个replicatedtable复制表:CREATETABLEstates(abbreviationVARCHAR(20),state_numTINYINT,nameVARCHAR(20),PRIMARYKEY(state_num));这个表尽可能只用来进行读,并且每个分区中都会创建。实现方法:用CREATETABLE而不用PARTITIONTABLE缺点比较明显:降低并发性,而且要插入数据要在所有的分区执行一次2.4更新schema和持久化保存数据Voltdb数据库的快照完全基于磁盘的,包括所有的数据。在voltdb数据库运行中,可以通过命令:voltadminsave创建快照Voltadminsave/home/voltdbroot/snapshots/“towns”创建的快照名是:towns,存放的路径为:/home/voltdbroot/snapshots/有了复制数据库的功能,可以通过recover命令代替create来启动数据库命令:Voltdbrecover如果有多个快照,Voltdb查找最新的快照进行恢复,快照包含了catalog和数据,在恢复时不需要指定catalog用voltadminupdate实现更新,命令如下:命令:voltadminupdatetowns.jarvoltdbroot/deployment.xml必须指定schema和deployment对表结构的调整要先保存数据,然后将数据导入新数据库voltadminrestore命令可以恢复数据但不包括catalog,命令:voltadminrestore/home/voltdbroot/snapshots/states将快照的数据导入表:states,但catalog已经存在,不会修改catalog在开发或者测试阶段,我们手动恢复数据或者更新catalog是必须的,但在应用阶段,就有必须保持快照是最新的,以防宕机或者其它意外。解决方法:定时执行快照计划,对数据库的数据进行备份,通过配置文件的配置项完成配置项如下:snapshotprefix=tutorialfrequency=5mretain=3/Snapshot的名字叫做:tutorial,快照执行的频率为:5min,保留3分最近的快照。其余的快照将被删除,以节省空间。通过命令:voltdbrecoverhostlocalhostdeploymentdeployment.xml更新配置项,如果是集群则把“localhost”替换为集群的leader2.5存储过程每次执行复杂的查询是令人讨厌的,voltdb支持通过存储过程执行。每次只修改输入。创建存储过程的schema:Createprocedureas例如:CREATEPROCEDUREleastpopulatedASSELECTTOP1county,abbreviation,populationFROMpeople,statesWHEREpeople.state_num=?ANDpeople.state_num=states.state_numORDERBYpopulationASC;leastpopulated:存储过程的名字?:作为输入参数,用户可以指定条件查询的具体条件值创建的存储过程中也可以指定单分区或者多分区,可以在不停止数据库的情况下,更新数据库,更新方式和更新表的方法一样:例如:$voltdbcompile-otowns.jartowns.sql$voltadminupdatetowns.jardeployment.xml存储过程支持java客户端,可以用于设计更加复杂的存储过程importorg.voltdb.*;publicclassLeastPopulatedextendsVoltProcedure{publicfinalSQLStmtgetLeast=newSQLStmt(SELECTTOP1county,abbreviation,population+FROMpeople,statesWHEREpeople.state_num=?+ANDpeople.state_num=states.state_num+ORDERBYpopulationASC;);publicVoltTable[]run(integerstate_num)throwsVoltAbortException{voltQueueSQL(getLeast,state_num);returnvoltExecuteSQL();}}Jvava的存储过程作为一个单元、事务,要么成功要么失败。编写了java的存储过程,将其编译,然后利用命令:CREATEPROCEDUREFROMCLASSUpdatePeople;PARTITIONPROCEDUREUpdatePeopleONTABLEpeopleCOLUMNstate_num;第三章集群实战搭建集群三个节点:10.1.1.5110.1.1.5210.1.1.55要在三个节点执行相同的操作:1.安装voltdb2.创建schemaCREATETABLEHELLOWORLD(HELLOVARCHAR(15),WORLDVARCHAR(15),DIALECTVARCHAR(15)NOTNULL,PRIMARYKEY(DIALECT));PARTITIONTABLEHELLOWORLDONCOLUMNDIALECT;CREATEPROCEDUREFROMCLASSInsert;CREATEPROCEDUREFROMCLASSSelect;PARTITIONPROCEDUREInsertONTABLEHELLOWORLDCOLUMNDIALECT;PARTITIONPROCEDURESelectONTABLEHELLOWORLDCOLUMNDIALECT;保存为:helloworld.sql3.

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功