精华内容
下载资源
问答
  • voltdb mysql_VoltDB安装

    2021-01-30 12:55:20
    1.什么是VoltDB?是一个优化吞吐率的高性能集群开源SQLRDBMS(Database Management System),它是一个内存关系型数据库,既获得了nosql的良好可扩展性,高吞吐量的数据处理,又没有放弃原传统关系型数据库的事务支持--...

    1.什么是VoltDB?

    是一个优化吞吐率的高性能集群开源SQLRDBMS(Database Management System),它是一个内存关系型数据库,既获得了nosql的良好可扩展性,高吞吐量的数据处理,又没有放弃原传统关系型数据库的事务支持--ACID

    从硬件上来看,VoltDB基于PC+以太网+本地存储,从体系结构来看其内部是一个ShareNothing(注1)的内存数据库,通过并行单线程来保证事务的一致性和高性能,所有事务被实现为java存储过程,所有存储过程(事务)都全局有序,由于避免了锁的使用,因此可以保证每个事务在所有分区上并行执行完成后才继续执行下一个事务,事务不会乱序执行。存储过程内部支持分组,多路join,聚合,函数等等,

    VoltDB---自动数据分区,数据表会自动分配到集群节点,可以看成是传统sharding的升级整合版本。

    ---自动快照,意味着一个事务内部无需进行IO操作,可在微秒级别完成事务,

    ---异步事务提交,从某种意义上看,VoltDB是一个共享内存的集群(?),支持多节点并行事务处理,理论上不存在节点上限

    2.VoltDB部署安装环境

    voltdb的代码以及系统构建都是在64位的linux/OS X之上的,它的编译需要如下环境:

    java 1.8

    Apache Ant 1.7 或者更高版本

    一个支持C++11的编译器

    Python 2.6 或者更高版本

    cmake 2.8 或者更高版本

    安装ant:

    tar -xzvf apache-ant-1.9.13-bin.tar.gz

    # 配置环境变量vi /etc/profile

    export ANT_HOME=/data/webserver/apache-ant-1.9.13

    export PATH=$ANT_HOME/bin:$PATH

    VoltDB安装:

    unzip voltdb-voltdb-9.0.zip

    cd voltdb-voltdb-9.0

    ant clean

    ant

    配置VoltDB环境变量:

    export VOLTDB_PATH=/data/webserver/voltdb-voltdb-9.0

    export PATH=$VOLTDB_PATH/bin:$PATH

    export CLASSPATH=.:$VOLTDB_PATH/lib/*:$VOLTDB_PATH/voltdb/*:$CLASSPATH

    初始化VoltDB并启动:

    voltdb init

    voltdb start

    启动成功后,通过浏览器http://localhost:8080访问VoltDB管理控制台:

    225a0edc6d4ede3e0827379bde6e4e88.png

    展开全文
  • 本帖最后由 〇〇 于 2014-8-31 16:23 编辑VoltDB实时投票应用性能测试分类: 工作日志272013-01voter是votedb开源包中的一个性能测试程序,代码位于源码包examples/voter/目录下。该程序模拟短时间内大量用户发起投票...

    本帖最后由 〇〇 于 2014-8-31 16:23 编辑

    VoltDB实时投票应用性能测试

    分类: 工作日志

    27

    2013-01

    voter是votedb开源包中的一个性能测试程序,代码位于源码包examples/voter/目录下。该程序模拟短时间内大量用户发起投票的场景,测试每秒处理的投票请求(三次读一次写的事务)的能力。官方发布的两个基于该程序的性能测试报告。测试环境部署在12台Amazon E2云主机服务上,服务端版本是voltdb 2.2:

    686K TPS with Spring Framework Web App and VoltDB

    695k TPS with Node.js and VoltDB

    本文将深入到voter程序内部,分析该测试的流程,以及给出自己的性能测试结果。 (本文代码部分的格式正在修改,先请将就看文本的)

    1、表结构(ddl.sql)

    contestants表存储候选人编号和名字,该表的数据量较小,并且不会改变。

    CREATE TABLE contestants

    (

    contestant_number integer     NOT NULL

    , contestant_name   varchar(50) NOT NULL

    , CONSTRAINT PK_contestants PRIMARY KEY

    (

    contestant_number

    )

    );

    vote表存储每一次投票的信息,包括投票电话、州名和所投的候选人编号。同时该表的会按电话号码做多节点分区。

    CREATE TABLE votes

    (

    phone_number       bigint     NOT NULL

    , state              varchar(2) NOT NULL

    , contestant_number  integer    NOT NULL

    );

    PARTITION TABLE votes ON COLUMN phone_number;

    area_code_state表存储州编号和州名的映射关系。

    CREATE TABLE area_code_state

    (

    area_code smallint   NOT NULL

    , state     varchar(2) NOT NULL

    , CONSTRAINT PK_area_code_state PRIMARY KEY

    (

    area_code

    )

    );

    根据voter表创建视图v_votes_by_phone_number,表示每个电话号码已经投票的次数(应用限制最大投票次数)

    是的,voltdb支持Create View。根据官方文档的解释,VoltDB存储的是物理视图,即每次插入、更新、删除数据都会修改物理视图中所关联记录的数据。

    CREATE VIEW v_votes_by_phone_number

    (

    phone_number

    , num_votes

    )

    AS

    SELECT phone_number

    , COUNT(*)

    FROM votes

    GROUP BY phone_number

    ;

    根据contestants表创建视图v_votes_by_contestant_number_state,表示每个候选人来自不同州的投票数。

    CREATE VIEW v_votes_by_contestant_number_state

    (

    contestant_number

    , state

    , num_votes

    )

    AS

    SELECT contestant_number

    , state

    , COUNT(*)

    FROM votes

    GROUP BY contestant_number

    , state

    ;

    2、存储过程

    voter中定义了5个存储过程,其中主要的Vote存储过程包含4个statement,三次Select和一次Insert

    通过候选人编号,查询候选人

    public final SQLStmt checkContestantStmt = new SQLStmt(

    "SELECT contestant_number FROM contestants WHERE contestant_number = ?;");

    通过电话号码,查询该号码已投的票数

    public final SQLStmt checkVoterStmt = new SQLStmt(

    "SELECT num_votes FROM v_votes_by_phone_number WHERE phone_number = ?;");

    通过州编号,查询州名

    public final SQLStmt checkStateStmt = new SQLStmt(

    "SELECT state FROM area_code_state WHERE area_code = ?;");

    将投票的电话号码、来源州、投票对象记录到votes表,同时更新两个视图

    public final SQLStmt insertVoteStmt = new SQLStmt(

    "INSERT INTO votes (phone_number, state, contestant_number) VALUES (?, ?, ?);");

    存储过程,输入投票电话、候选人编号,以及每个电话最大投票数(常量)

    public long run(long phoneNumber, int contestantNumber, long maxVotesPerPhoneNumber) {

    voltQueueSQL(checkContestantStmt, EXPECT_ZERO_OR_ONE_ROW, contestantNumber);

    voltQueueSQL(checkVoterStmt, EXPECT_ZERO_OR_ONE_ROW, phoneNumber);

    //根据电话号码计算所在州区号

    voltQueueSQL(checkStateStmt, EXPECT_ZERO_OR_ONE_ROW, (short)(phoneNumber / 10000000l));

    VoltTable validation[] = voltExecuteSQL();

    //验证输入的候选人编号是否合法

    if (validation[0].getRowCount() == 0) {

    return ERR_INVALID_CONTESTANT;

    }

    //验证该电话投票数是否到达上限

    if ((validation[1].getRowCount() == 1) &&

    (validation[1].asScalarLong() >= maxVotesPerPhoneNumber)) {

    return ERR_VOTER_OVER_VOTE_LIMIT;

    }

    //如果计算的州区号没有记录,投票仍然有效,州名记录为XX

    final String state = (validation[2].getRowCount() > 0) ? validation[2].fetchRow(0).getString(0) : "XX";

    //完成投票

    voltQueueSQL(insertVoteStmt, EXPECT_SCALAR_MATCH(1), phoneNumber, state, contestantNumber);

    voltExecuteSQL(true);

    return VOTE_SUCCESSFUL;

    }

    另外4个存储过程没有列入性能统计,不再具体介绍,含义如下:

    • Initialize.java 初始化区号表和候选人表

    • GetStateHeatmap 获取按分区得票数最高的候选人

    • ContestantWinningStates.java 查询每个候选人早获胜的N个州

    • Results.java 获得最终投票结果

    3、单节点性能测试

    测试环境是两台双路E5420服务器,服务端版本采用2013年1月刚发布的VoltDB 3.0开源版:

    • CPU: 2 * E5420 (qual 2.5G)

    • RAM: 8GB

    • LAN: 1000Mbps

    • 1 client,1 server

    性能测试的配置参数包括:

    • 服务端处理线程数,分别取1、2(默认值)、4、8、16

    • 客户端连接模式,分别是sync同步、jdbc同步,async异步三种。

    考察的性能指标包括:

    • 每秒执行的事务数:tps

    • 平均请求延时:latency_avg

    • 95%最大请求延时:latency_95

    • 99%最大请求延时:latency_99

    以下是三种请求模式和不同服务端线程数情况下的性能曲线图,其中8线程异步模式下性能达到11.8万TPS。而两种同步模式下的性能最高值则是服务端4线程,分别是6.3万和5.9万。

    (需要再次提醒,所统计的TPS性能是指每秒执行的事务数,包括三次读操作,其中两次是轻量级表的读,一次是对大表视图的读,以及一次带主键并发互斥的写操作。)

    image

    以下两张图分别是平均和95%延时统计。可以看出sync和jdbc两种同步模式下延时一直维持很低(小于5ms)。而async异步模式下,当服务端线程数小于等于8时,也保持低于20ms的水平,但当服务端线程数为16,平均和95%最大延时都出现了大幅的增加,分别达到了131ms和350ms。

    imageimage

    为了进一步分析上面不同线程数下“延时突变”现象,我有进行了进一步的测试——对线程数进行微调。从4到11每个线程数都测试async异步模式的延时,最终得到如下数据。当线程数低于6时,延时随线程数缓慢上升。而当线程数在7到10,延时则突然下降到小于10ms区间。当线程数增加到11以上后,又发生了延时数据的突变,产生了大幅增长。

    image

    仅从已测试数据来看,我们推测当服务端配置线程数接近服务器可用内核数时,VoltDB达到最优吞吐率和较理想的延时波动。当然由于本次测试的CPU不支持Intel超线程技术,不清楚这个关于内核数的推断应该适用于物理内核数、还是逻辑内核数。

    从VoltDB公布的技术架构来看,以上推断也是可以成立的。VoltDB的服务端采用CPU级别的Share-noting设计,为每个线程分配了固定的主键区间,事务操作串行化,这样可以减少数据在CPU缓存和kenel内存区的加载频率,从而提高处理性能。当所服务端线程数与内核数相匹配,便恰好符合该设计。

    最后总结以下,VoltDB的处理能力不一定超出Redis等KV数据库,但考虑其SQL和事务能力能力,而KV数据库如果需要应用控制事务性能往往大打折扣。因此,我们可以认为VoltDB是一个性能很强大的内存关系数据库,适合使用在需要实时高性能和事务支持的在线游戏、交易等业务。

    (好吧,它是AGPL的,我知道,但总算有个开源数据库供我们学习之)

    下期预告

    • VoltDB的集群如何部署?

    • 为什么我把voter服务端部署到两个节点之后,性能反而比单服务器下降了呢?

    • 如何让VoltDB客户端支持路由?

    展开全文
  • 之前在git上下载的voltdb,以及在官网下载的社区版voltdb均不支持持久性事务,和扩展集群,今天下载了企业试用版voltdb,安装过程不再赘述,记录一下我的使用过程持久性测试以前的voltadminshutdown;之后重新启动...

    之前在git上下载的voltdb,以及在官网下载的社区版voltdb均不支持持久性事务,和扩展集群,今天下载了企业试用版voltdb,安装过程不再赘述,记录一下我的使用过程

    持久性测试

    以前的 voltadmin shutdown;之后重新启动voltdb后,仍然不能恢复数据,即使使用recover命令恢复后,也不能再现之前的数据,但是用了企业版的之后,shutdown后重新启动,则会加载之前生成的snapshot,恢复文件

    6869196c9c3e36cc49b8254c06665a43.png

    如图所示,会从磁盘中读入snapshot,之前的命令也可以重现,当然,数据库里的内容保存完好

    a8fec9310054c1f8a534eda3356d51f3.png

    这里列出部分数据

    事务测试

    voltdb为了避免时间的开销,避免了锁的使用,也就是说无法使用mysql的事务语句

    3f79e3a9419d3a034042c6aa580a0aac.png

    触发器测试

    也无法使用触发器

    02db42cdc88e6ebe3b0745b3d149101f.png

    搭建集群

    参考官方文档,搭建集群

    初始化根目录使用 --config 指定配置文件(记得备份一份),所有的节点必须使用相同的配置文件

    voltdb init -D ~/mydb --config=myconfig.xml

    启动一个五节点数据库集群,指定voltsvr1作为主机节点。确保运行该命令的节点数与--count参数中指定的节点数相匹配。

    voltdb start -c 5 -H voltsvr1

    执行此语句后,voltdb会修改config目录下的cluster.properties文件,hostcount变成5

    3ce9b18143dcd46d95d48467a7db0fab.png

    以下命令(在所有三个服务器上发出)启动三节点集群:

    voltdb start --host = svrA,svrB,svrC

    在群集上启动VoltDB数据库时,VoltDB服务器进程将执行以下操作:

    如果要在选择作为主机节点的节点上启动数据库进程,它将等待来自其余节点的初始化消息。主机是从命令行上的主机列表中选择的,并通过管理群集启动过程在启动期间扮演特殊角色。重要的是,群集中的所有节点都可以解析您指定的主机节点的主机名或IP地址。

    如果要在非主机节点上启动数据库,它会向主机发送初始化消息,指示它已准备就绪。在连接了正确数量的节点(在命令行中指定)之前,数据库无法运行。

    一旦所有节点都发送了初始化消息,主机就会向其他节点发送一条消息,表明集群已完成。一旦启动过程完成,主机的角色就结束了,它就像集群中的每个其他节点一样成为对等体。它不再执行任何特殊功能。

    展开全文
  • 一般认为NoSQL数据库在性能...这两个SQL解决方案分别是MySQL加NoSQL层插件和支持SQL的VoltDB数据库。MySQL + HandlerSocketYoshinori Matsunobu是Sun/Oracle的前雇员,从事MySQL的研发工作,目前是DeNA的首席数据...

    一般认为NoSQL数据库在性能方面要优于传统的SQL数据库。但是有两个SQL的解决方案宣布:对于大型系统的高可扩展性需求,SQL仍然是可行的解决方案!这两个SQL解决方案分别是MySQL加NoSQL层插件和支持SQL的VoltDB数据库。

    MySQL + HandlerSocket

    Yoshinori Matsunobu是Sun/Oracle的前雇员,从事MySQL的研发工作,目前是DeNA的首席数据库和基础设施架构师,他以插件的方式为MySQL/InnoDB提供解决方案,可以在一台2.53GHZ、8核CPU、32G内存的Nehalem服务器上把每秒的查询数量(qps)提升到750,000以上。

    在同样的硬件环境下,无插件的MySQL只能提供100,000左右的qps,如果使用memecached的话,可以增加到大约400,000。经过对RDBMS的分析,Matsunobu意识到大部分时间都花在SQL的开销上,比如调用MYSQLparse()、MYSQLlex()、make_join_statistics()和JOIN::optimize()等。他写到:

    很显然性能降低的原因主要在SQL层,而不是“InnoDB(存储)”层。MySQL必须做很多事情......但memcached/NoSQL是不需要做这些额外工作的。

    SQL层的功能包括解析SQL语句、打开/锁定/解锁/关闭表、解决并发问题等。Matsunobu的解决方案就是增加额外的NoSQL层:

    我们认为最好的方式就是在MySQL内部实现一个NoSQL的网络服务器。也就是说,编写一个网络服务器作为MySQL的插件(守护插件),用来监听特定端口,接收NoSQL的协议和API,然后通过MySQL内部存储引擎API直接访问InnoDB。这种方式很像NDBAPI,不同的是它可以与InnoDB交互。

    他的团队开发了HandlerSocket插件,有了这个插件,MySQL更像一个NoSQL数据库,通过监听一个独立的端口,接收从SQL层来的简单查询请求,例如主键查询,索引扫描和插入/更新/删除。这一变化把数据库性能提升到了750K qps以上。常用端口可以接收处理复杂查询,其核心仍然是SQL数据库。DeNA采用SQL/NoSQL混合的方式取得了成功,据Matsunobu所言,在相同的时间内,这种解决方案把多个memcached和MySQL主从服务器的方案远远甩在了后面。

    VoltDB

    另一个很有希望的SQL解决方案是VoltDB,这是一个内存中的开源OLTP SQL数据库,能够保证事务的完整性(ACID)。VoltDB是由原Ingres和Postgres的架构师Mike Stonebraker设计的。该数据库主要特征如下:

    为了获得最大化吞吐量,数据保存在内存中(而不是在硬盘),这样可以有效消除缓冲区管理。

    VoltDB通过SQL引擎把数据分发给集群服务器的每个CPU进行处理。

    每个单线程分区自主执行,消除锁定和闩锁的需求。

    VoltDB可以通过简单的在集群中增加附加节点的方式实现性能的线性增加。

    正如其开发者宣称的那样,该数据库的性能使其成为NoSQL解决方案的有力竞争者:

    VoltDB在单节点上可以每秒处理53000个事务请求(TPS),其他DBMS在相同的硬件环境下只能处理1155个。VoltDB的扩展是近似线性的──在12个节点的VoltDB集群上进行同样测试,可以处理560,000 TPS。

    基准案例:某个客户的在线游戏在12个节点的VoltDB集群上处理了130万 TPS。

    VoltDB还针对NoSQL的键-值存储方式作了基准测试,VoltDB在处理各种键-值存储负载的情况下获得了相同或更好的性能。

    除了它的性能,VoltDB的主要优势是可以与SQL用户进行交流,这些SQL用户是很好的资源。

    近期还会推出VoltDB的企业版本,包括基于浏览器的数据库管理系统,提供、管理和监控数据库集群。除了免费的社区版本,针对企业版的支持也开始了。

    展开全文
  • 大数据时代,随着数据量的爆炸式增长,对于数据的处理速度要求也越来越高,以往基于MySQL的数据处理方案已无法满足大吞吐、低延迟的写入和高速查询的场景;百分点总结出了一套完整的解决方案,本文就带你一同了解...
  • 原文链接 :http://www.infoq.com/cn/news/2010/11/MySQL-HandlerSocket-VoltDB/ 一般认为NoSQL数据库在性能方面要优于传统的SQL...这两个SQL解决方案分别是MySQL加NoSQL层插件和支持SQL的VoltDB数据库。 MyS
  • He wrote a short guide to help his team get through the transition for PHP developers moving from MySQL to VoltDB. Here’s an excerpt: Is there PhpMyAdmin or similar Yes there is! This tool is ...
  • MySQL/HandlerSocket和VoltDB:NoSQL的竞争者 一般认为NoSQL数据库在性能方面要优于传统的SQL数据库。但是有两个SQL的解决方案宣布:对于大型系统的高可扩展性需求,SQL仍然是可行的解决方案!这两个SQL解决方案...
  • 因此,为VoltDB数据库设计架构使用与为Oracle,MySQL或任何其他关系数据库产品设计数据库相同的技能和知识。本指南通过将工作分为三章来描述应用程序设计的阶段:在DDL中设计架构以定义数据库结构。本章介绍了模式...
  • VoltDB是内存关系型数据库和计算引擎,能在廉价服务器集群上实现每秒数百万次数据事务处理和毫秒级的平均延迟,提供了NoSQL数据库的可伸缩性和传统关系数据库系统的ACID一致性。通过将数据库表进行自动哈希分区来...
  • MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster 的数据节点,管理服务器,以及(可能)专门的数据访问程序。关于 Cluster 中这些组件的关系,请参见下图:  所有...
  • MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster 的数据节点,管理服务器,以及(可能)专门的数据访问程序。关于 Cluster 中这些组件的关系,请参见下图: 所有的...
  • 1. VoltDB是什么?...VoltDB与传统数据库(如DB2,Oracle,MySQL等)最大的不同点就是,VoltDB把所有数据放在内存里,而且能够scale out,执行在一个集群上。集群上的每一个节点都能够执行部分数...
  • VoltDB内存数据库分析

    2014-04-02 11:11:39
    VoltDB是一个宣称性能超过Mysql 100倍的新型数据库。它源自Micheal Stonebraker一篇论文H-Store。在这篇论文发表后,Stonebraker成立了VoltDB公司带着他的一些学生开始在OLTP数据库领域打拼。Stonebraker从上世纪70...
  • VoltDB是一个宣称性能超过Mysql 100倍的新型数据库。它源自Micheal Stonebraker一篇论文H-Store。在这篇论文发表后,Stonebraker成立了VoltDB公司带着他的一些学生开始在OLTP数据库领域打拼。Stonebraker从上

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

mysqlvoltdb

mysql 订阅