230 likes | 809 Views
VoltDB 入门介绍. 概要. 一、 Technical Overview 二、 Technical Action 三、 Demo 演示. Technical Overview . What is VoltDB? It’s an open-source OLTP database that is designed to run on a cluster. It is an in-memory shared-nothing system. Tables are partitioned across multiple servers in the cluster.
E N D
概要 一、Technical Overview 二、Technical Action 三、Demo演示
Technical Overview What is VoltDB? • It’s an open-source OLTP database that is designed to run on a cluster. • It is an in-memory shared-nothing system. • Tables are partitioned across multiple servers in the cluster.
Technical Overview VoltDB的优点: • 可以提供比传统数据库系统好很多的性能。 • 可以线性扩展。 • 兼容SQL作为数据库管理操作接口。 • 兼容ACID,满足数据一致与完整性。 • 7*24*365高可用。
Technical Overview 如何实现ACID: • 原子性(Atomicity): • VoltDB通过使用存储过程来确保原子性,一个存储过程执行必须等待前一个存储过程成功或回滚结束。 • 一致性(Consistency): • VoltDB在所有的数据库查询中强制schema与数据类型约束. • 隔绝性(Isolation,又称独立性): • VoltDB事务全局(所有被影响的分区)顺序执行(没有交叉)(任何一个分区同一时间只有一个执行,即串行的)。 • 持久性(Durability): • VoltDB提供分区复制以及周期性的数据库snapshot,确保数据持久化。
Technical Overview VoltDB的架构: VoltDB数据库是一个分布式,可扩展,shared-nothing的内存数据库。使用JAVA 写的存储过程来定义事务。使用标准SQL访问数据,使用并行的单线程处理方式确保数据一致性,同时避免了传统数据库的锁,插销,资源管理开销。
Technical Overview VoltDB的事务提交: • 运行前,用户自己写存储过程,并提交给服务端。 • 运行时,用户程序调用存储过程完成事务操作,所有事务的运行逻辑是由VoltDB在服务器进程中完成的。 • 缺点?
Technical Overview VoltDB的数据分布: • 结构基于SNA。 • 数据分布策略是基于哈希的。 • 采用这种方法后,集群的规模是事先确定好的,新增机器需要停止服务后重新分布数据。另外,数据哈希被分散后,数据的连续性被打乱了,在这个数据结构上做范围查询需要动用服务这张表的所有机器,处理范围查询会很低效。
Technical Overview VoltDB的事务处理: • 依赖NTP服务进行各节点之间的时间同步。 • 多个事务在多个服务器节点同时执行, • 如果事务之间有冲突,那么事务的执行是完全隔离的,即达到SERIALIZABLE ISOLATION。 • 事先分析好存储过程之间的关系,如果两个事务可能存在冲突,则不让这两个进程在同一个时间执行。 • 并发处理中,每一个事务在执行之前都要等待一个Round Trip时间,VoltDB已经进行了优化。
Technical Overview VoltDB的性能(官方): VoltDB is very scalable; it should scale to 120 partitions, 39 servers, and 1.6 million complex transactions per second at over 300 CPU cores, VoltDB 宣称具备非常高的可伸缩性,超过 120 个分区、39台服务器,可在 300 个 CPU 核心上每秒钟处理 160 万的复杂事务。 测试例子
Technical Overview VoltDB的局限性: • 灵活性&扩展性。必须停止服务进行修改而不能动态修改。 • SQL语法支持,不支持动态sql,不支持or语法。 • “select * from foo where bar = ?;” (YES) • “select * from ? where bar = ?;” (NO) • 性能?
Technical Overview VoltDB的适用场景: VoltDB适合OLTP系统,单个事务较小,但是事务总量非常之多的应用。比如金融,零售,WEB2.0等传统OLTP应用。 http://voltdb.com/customers正在使用VoltDB的一些公司
Technical Action VoltDB的运行要求:
Technical Action VoltDB的安装: $ tar -zxvf voltdb-2.1.tar.gz -C $HOME/ $ sudo tar -zxvf voltdb-2.1.tar.gz -C /opt $ cd /opt $ sudomv voltdb-2.1 voltdb
Technical Action • VoltDBApplication step by step: • Defining the Database Schema • Writing the Stored Procedure for CRUD • Writing the Client Application • Creating the Project Definition • Building the Application • Run
Technical Action • 分表字段: • 建表时的主键索引不一定是voltdb里的分表字段(Partitioning column)。 • 分表字段是根据业务,频率来确定的,确定的分表字段需要在项目定义文件和存储过程文件中指明。 • @ProcInfo( • singlePartition = true, • partitionInfo = "Reservation.FlightID: 0" • ) • <partition table="Reservation" column="FlightID">
Technical Action • 分表字段的建立规则: • 任意的int或string型字段都可以作为分表字段,类似索引,从上下文看是全局的。 • 对于每一个表来说分表字段有且只能有一个,如果有两个或以上的字段需要作为分表字段,就用这些字段组合起来形成一个新字段来做。 • 分表字段不能为null,可以为empty或0,分表字段的值不需要唯一。
Technical Action • Replicated Tables: • VoltDB里如果不在项目定义文件中特别指定一个表有分表字段,则这个表默认被复制(Replicated)。 • 可以复制的表要满足的条件:Small, mostly read-only tables can be replicated。
Technical Action VoltDB stored procedure(一般形式): import org.voltdb.*; @ProcInfo( singlePartition = true|false, partitionInfo = "Table-name.Column-name: 0" ) public class Procedure-name extends VoltProcedure { // Declare SQL statements ... public datatype run ( arguments ) throws VoltAbortException { // Body of the Stored Procedure ... } }
Technical Action • Default Procedures for Partitioned Tables: • 表名大写,存储过程名小写。 • 针对最常用的insert、select、update和delete。 • Insert操作,参数按表结构定义的顺序排列。 • Select和delete只要主键。 • Update操作,参数也要按表结构定义的顺序排列,主键要出现两次。 • client.callProcedure("HELLOWORLD.insert","Howdy","Earth","American"); • client.callProcedure("HELLOWORLD.select“,"American").getResults(); • client.callProcedure("HELLOWORLD.update“,"Yo","Biosphere","American", • "American"); • client.callProcedure("HELLOWORLD.delete“,"American");
Technical Action Shortcut for Defining Simple Stored Procedures: <procedure class="procedures.simple.CountReservations"> <sql>SELECT COUNT(*) FROM RESERVATION</sql> </procedure> <procedure class="procedures.simple.CountChildren"> <sql>SELECT COUNT(*) FROM CUSTOMER WHERE AGE < 21</sql> </procedure> <procedure class="procedures.simple.MyReservationsByTrip"> <sql>SELECT R.RESERVEID, F.FLIGHTID, F.DEPARTTIME FROM RESERVATION AS R, FLIGHT AS F WHERE R.CUSTOMERID = ? AND R.FLIGHTID = F.FLIGHTID AND F.ORIGIN=? AND F.DESTINATION=? </sql></procedure>
Technical Action • VoltDBTools: • 工程模版生成脚本- Generate Script • $ cd /opt/voltdb/tools • $ python generate test test $HOME/workspace/test • VoltDB Studio • a browser-based tool • test, debug and optimize • a catalog viewer, an ad hoc SQL query pane, and a cluster monitor
Appendix VoltDB的资源: • Visit http://voltdb.com to… • Download VoltDB • Get sample app code • Join the VoltDB community • VoltDB user groups: www.meetup.com/voltdb • Follow VoltDB on Twitter @voltdb • 源码https://github.com/VoltDB/