你好,游客 登录
背景:
阅读新闻

修改驱动,使用Erlang+VoltDB实现每秒87.7万事务

[日期:2013-04-12] 来源:VoltDB博客  作者:Henning Diedrich [字体: ]

摘要:Henning Diedrich,游戏公司Eonblast Corporation的CEO;为了更好的利用Erlang和VoltDB,自建驱动将TPS提升至87.7万,并于GitHub上开源。

游戏公司Eonblast Corporation的CEO Henning Diedrich,。带来了Erlang与VoltDB的连接驱动,将TPS提升至87.7万TPS(用例中相当于350万QPS),以下为译文:

Henning Diedrich首次接触VoltDB是为了给大型网络游戏服务器寻找更好的数据库,在其经历了扩展MySQL的“悲惨遭遇”后,Henning看上了VoltDB,因为VoltDB比MySQL更适合复杂游戏世界的需求,最起码Henning认为VoltDB比其它任何数据库都适合。当然Henning同样在寻找比Java更适合程序服务器的语言,如同各位所想,Erlang捕获了Henning的“芳心”。这样一来对Henning来说,就万事具备只欠Erlang上的VoltDB“驱动”了。

驱动的建立

Henning的动作不可谓不快,3年后应VoltDB的要求,2010年其捐献了该驱动的第一个版本。这个驱动使用起来已逼近完美,唯一欠缺的就是(集群)主机间使用的是同步连接。而在2012年VoltDB决定建立一个更大更犀利的版本, 现已在GitHub上开源

下面将介绍新的异步驱动所具备的特性:纯Erlang,完全并行的微进程(microprocess),极其的快速、稳定并适合 VoltDB 3,继承并整合了先前版本。新驱动的可靠及一致的高吞吐量保障建立在多年Erlang MySQL驱动和 Emysql开发经验之上,而连接池和调用队列更是采用了最初为Electonic Arts设计的核心建模,其可靠性毋庸置疑。这些因素保障了新的Erlang驱动可以承受峰值访问,并为VoltDB服务器节点分配负载。

至于基准脚本的建立,Henning借鉴了之前他为VoltDB建立 Node.js的经验。有了之前的这些经验,Henning很清楚让云集群能更好运行需要什么样的数据以及必须详细的地方。

驱动内部结构的实现基本上完成了预期的要求:程序的微进程将调用驱动中的函数给一个专用的连接器发送消息,它将处理所有的连接工作。请求发送以后,初始化进程将被阻塞在一个同步的接收块(当然,它不会阻塞你其它的所有进程)或者根据需要继续运行,已经有理由选择异步模式了?结果从服务器送到进程中的mailbox中。(本段中所说的同步只是针对驱动,而对VoltDB的调用使用的仍然是异步模式,驱动只是简单的让进程在接受块中等待)

在这里你有很多的选择,比如:存在让你建立专用进程去处理请求发送的模式,从而保护你的初始化进程不会被驱动中其它活动打断。对那些你不会在意成功与否的写操作在发起后你就可以弃之不理,甚至是阻止接收这些操作失败后的返回消息。

基准应用程序

基准基于VoltDB的投票用例,这个例子在每个VoltDB都存在;原始的用例设置中,有一个页面用于显示结果,每400毫秒修改一次。你可以从VoltDB安装目录下examples/voter中找到它。

基准需要一些准备工作:数据库需要写入6个选手的姓名,然后向服务器每个核心发送100万的写入事务,每个事务都会给选手中随机的一个送去一票。最终显示每个参赛者所得的票数,通过使用VoltDB的materialized view和ad-hoc查询。(在VoltDB术语中,ad-hoc属于常规查询)

基准源在驱动的主目录之下的 etc/bench中,同样你还可以在其中发现一个详细的 README.md,其中阐述了基准运行的多个途径。你可以使用以下的代码在本地测试,当然会很慢:

$ git clone git://github.com/VoltDB/voltdb.git voltdb
$ git clone git://github.com/VoltDB/voltdb-client-erlang.git erlvolt
$ cd voltdb/examples/voter && ./run.sh &
$ cd && cd erlvolt && make clean all bench

通常会在屏幕上显示如下结果:

 

    metal:~ hd$ cd voltdb-3-com/examples/voter && ./run.sh &
    [1] 10817
    metal:~ hd$ Initializing VoltDB...

     _    __      ____  ____  ____ 
    | |  / /___  / / /_/ __ \/ __ )
    | | / / __ \/ / __/ / / / __  |
    | |/ / /_/ / / /_/ /_/ / /_/ / 
    |___/\____/_/\__/_____/_____/

    --------------------------------

    Build: 3.0 voltdb-3.0-95-gfffab2b Community Edition
    Connecting to VoltDB cluster as the leader...
    Initializing initiator ID: 0, SiteID: 0:5
    WARN: Running without redundancy (k=0) is not recommended for production use.
    Server completed initialization.

    metal:erlvolt hd$ cd && cd erlvolt && make clean all bench
    clean
    erlc -W -I ../include  +debug_info -o ../ebin erlvolt.erl
    erlc -W -I ../include  +debug_info -o ../ebin erlvolt_app.erl
    erlc -W -I ../include  +debug_info -o ../ebin erlvolt_conn.erl
    erlc -W -I ../include  +debug_info -o ../ebin erlvolt_conn_mgr.erl
    erlc -W -I ../include  +debug_info -o ../ebin erlvolt_profiler.erl
    erlc -W -I ../include  +debug_info -o ../ebin erlvolt_sup.erl
    erlc -W -I ../include  +debug_info -o ../ebin erlvolt_wire.erl
    erlc -W -I ../../include  +debug_info -o ../../ebin bench.erl

    Erlvolt Bench 0.9 (client 'VSD')
    -------------------------------------------------------------------------------------------------------------------------------------
    Client 'VSD', voter, 100,000 calls, steady, 200 workers, delay n/a, direct, queue n/a, slots n/a, limit n/a, verbose, "n/a" stats/sec
    Hosts: localhost:21212 
    connect ...
    preparation ...
    Start at: 2013-02-06 18:56:20 .....................
    Starting: 2013-02-06 18:56:20
    calls ... ..................................
    cool down ... 
    check writes ... ok
    results ...  votes:     100,000 (6 contestants)
    .....Edwina Burnam:      16,817
    ....Jessie Alloway:      16,808
    ...Tabatha Gehling:      16,669
    .....Alana Bregman:      16,613
    ....Jessie Eichman:      16,556
    ......Kelly Clauss:      16,537
    close pool ...
    Client 'VSD', voter, 100,000 calls, steady, 200 workers, delay n/a, direct, queue n/a, slots n/a, limit n/a, verbose, "n/a" stats/sec
    -------------------------------------------------------------------------------------------------------------------------------------

    Client 'VSD' overall: 14,357 T/sec throughput, 0.00% fails, total transactions: 100,000, fails: 0, total time: 6.965sec 
    Erlvolt 0.3.3, bench started 2013-02-06 18:56:20, ended 2013-02-06 18:56:26, database: +100,000 new votes
    [++++++++++++++]

 

更进一步的介绍,比如在云中进行最棒的基础测试,查看etc/bench/README.md,或者在驱动根目录下查看这个页面:doc/BENCHMARK-README.html。

基准测试结果

当在单核心(-smb +S 1)上运行时,使用一个12-node VoltDB服务器集群,Erlang驱动会跑出每个核心上2.65万TPS(事务/秒)。如果将全配的16核心的集群实例作为客户端节点,每台机器上都会达到26万TPS。

使用8个节点连接到1个12节点的VoltDB集群,每个客户端节点将达到平均的10.9689万TPS,整个集群将达到87.7517万TPS。

鉴于这个基准测试的是驱动而不是服务器,Henning Diedrich并未对服务器集群做出调整。当然随着集群继续增大时,每个客户端核心的性能可能会受到EC2的网络限制。当然基准只有在服务器未过载的情况下才会体现出效果,而通过“backpressure”也可以最大程度上的防止系统过载。

测试环境

Henning将一个20节点的Amazon EC2 cc2.xlarge拆分成8个Erlang客户端和12个VoltDB服务器节点。M3.2xlarge提供了如下特性:

 

  • Cluster Compute Eight Extra Large Instance (cc2.8xlarge)
  • 60.5GiB内存
  • 88个EC2计算单元(2×Intel Xeon E5-2670,8核)
  • 3370 GB的实例存储
  • I/O性能:10 G的以太网

 

节点配置如下:

 

  • Ubuntu Server 12.04 LTS for Cluster Instances AMI
  • Oracle Java JDK 1.7
  • Erlang R15B03
  • VoltDB Enterprise Edition 3.0 RC(该基准在免费的Volt 3.0 Community Edition版本上也可以完美运行)

 

事务相关

客户端通过调用Voter的vote()方法进行储存,这个过程肯定不会只执行一个写操作,取决于你的逻辑, 可分为4-6个操作

 

  • 检索调用者(投票者)的位置(一个查询操作)
  • 检查调用者是否超过了他的投票次数(一个查询操作)
  • 验证调用者投票的对象是否有效(一个查询操作)
  • 如果上面全部有效,则投票生效(一个插入操作)

 

基于以上这些,每个插入同时引起两处不同的materialized view的改变,这样的话87.7万的TPS造成了350万的QPS

观察结果和注意点

Henning认为这里最值得关注的数字就是单CPU核心上的2.65 TPS,整合了10万次的操作。这可以让你对你需要的硬件数量进行估算,当然还要切记的是服务器的性能一般比EC2实例要高的多。当然这里没有选用8台主机而是使用EC2实例,也是基于EC2实例性能的透明性。





收藏 推荐 打印 | 录入: | 阅读:
相关新闻