前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用 Erlang 和 VoltDB 玩转 877,000 TPS

用 Erlang 和 VoltDB 玩转 877,000 TPS

作者头像
hldh214
修改2018-01-09 18:03:21
2K0
修改2018-01-09 18:03:21
举报
文章被收录于专栏:信达雅信达雅

注:本文的内容最初由 Henning Diedrich 在 VoltDB 博客上撰写。

在一台合理配置的 EC2 下(详见下文),使用我们全新的 VoltDB Erlang 驱动程序,我们实现了 877,519 TPS。

我是一家游戏公司 Eonblast Corporation 2 的首席执行官 Henning Diedrich 1。我想介绍一下我们创建的新的 Erlang VoltDB 驱动程序,这是一个允许两种类型定义技术一起工作的软件:VoltDB 3 和 Erlang 4。

驱动

我第一次尝试使用 VoltDB 是为了寻找一个更好的支持高并发在线游戏服务器的数据库。我经历了痛苦的第一次 5 对 MySQL 的扩展,发现 VoltDB 3 特别适合更复杂的游戏世界的需求。事实证明比任何其他数据库更好 6。

我也曾经在编程服务器上寻找比 Java 更好的语言,为此 Erlang 7 引起了我的注意。为了能够一起使用它们 8,我开始为 VoltDB 9 创建 Erlang 驱动程序。

为此在三年前开始工作,并于 2010 年向 VoltDB 提交了驱动程序的第一个版本 10。这是完全可用的,但开箱即用只支持同步连接。在 2012 年,VoltDB 决定赞助创建一个更大更刺激的版本。如今这个梦实现了 11。

下面介绍的 benchmark 是使用新的异步驱动程序进行的。这是纯 Erlang,完全并行化的微处理器,非常快,适合于 VoltDB 3 12。它建立在几乎所有以前强大的驱动程序版本之上。我能够从维护 Erlang MySQL 驱动程序 Emysql 的经验中得出的结论 13 来确保可靠的,一贯的高吞吐量。连接池和队列仿照那些可靠的主力,最初在 EA 设计的。它们使 Erlang 驱动程序能够吸收访问高峰,并在整个 VoltDB 服务器节点之间分配负载。

我前一阵子利用从 Node.js benchmark 14 中学到的经验教训,为 VoltDB 写了一个 benchmark 脚本。这一次,我知道我会注重哪些指标,以及我应该采取什么样的双重检查措施来使云集群的性能得到充分的利用。

驱动程序的内部结构已经按照预期执行:程序的微处理器使用驱动程序暴露出来的函数将消息发送到处理套接字工作的专用连接进程。发送请求后,如果选择异步模式,启动进程将被阻塞在同步接收中(当然,这并不会阻塞所有其他进程),或者继续执行。服务器的相应将到达您的进程的 mailbox。 (注意,在这个上下文中,在查看驱动程序时是同步的,对于 VoltDB 服务器的调用仍然是一个异步调用,驱动程序只是让你的进程在一个接收块中等待。)

有很多选项可以使用。例如。监控模式,创建一个工作进程来处理发送请求,从而保护您的启动进程免受驱动程序中的任何中断。你可以 一劳永逸,因为你不在乎他们是否成功了,或者失败。

Benchmark

该 benchmark 是基于每个 VoltDB 发行版附带的 VoltDB 选举器示例。它“验证和存储选秀节目选手的电话投票”。在最初的示例设置中,有一个网页显示结果的插图,每 400 毫秒更新一次。您可以在 VoltDB 安装的 examples/voter 目录中找到它。

benchmark 从一个准备阶段开始,在这个阶段数据库中涵盖了 6 位参赛者的姓名,然后每个 CPU 核心向服务器发起 100 万次写入事务,每个参赛者随机给一个参赛者“投票”。最后,通过具体化视图和 VoltDB 具体查询显示每个参赛者的选票。 (按照 VoltDB 的说法,具体查询是在存储过程中未预先制定的普通查询。)

benchmark 来源位于驱动程序主目录的 etc/bench 15 下,您还可以在其中找到详细的README.md,它解释了运行benchmark 的多种方法,并使其适合您的设置。对于在本地主机上运行的(慢)测试,基本上是这样的:

代码语言:shell
复制
$ 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

运行结果:

代码语言:shell
复制
    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
    [++++++++++++++]

更详细的说明,例如如何在云中最好地运行 benchmark,请参阅 etc/bench/README.md 16 或 doc/BENCHMARK-README.html。

Benchmark 结果

在单核(-smb + S 1)上运行时,在另一端监听一个 12 节点的 VoltDB 服务器集群时,Erlang 驱动程序显示单核的吞吐量为每秒 26,500 个事务(TPS)。当充分利用 16 核集群实例作为客户端节点时,每台计算机每秒钟通常达到 260000 次事务的吞吐量。 (CPU规格见下文)

使用连接到 12 节点 VoltDB 集群的 8 个客户端节点,每个客户端节点平均每秒执行 109,689 个事务,总共达到 877,519 TPS

由于这个benchmark 是关于驱动程序,而不是服务器,所以我没有尝试调整服务器集群。经过大量的实验,我认为对于更大型的服务器集群来说,每个客户端核心的较低的性能将反映出 EC2 云的网络限制,即使对于更大的集群实例 17,希望benchmark 不会受限于带宽。

benchmark 的一部分目标是测试驱动在负载下的状态,结果非常好。驱动程序不会因真正的过载而崩溃,当服务器不允许进一步请求容量时,它可以很好地应对“背压”18。但是,在不超载服务器的情况下,速度最快。

环境

我部署了一台 20 个节点的 Amazon EC2 cc2.xlarge 集群, 分解成 8 个 Erlang 客户端和 12 个 VoltDB 服务器节点。 m3.2xlarge 提供以下内容,如 Amazon EC2 实例类型页面17所述:

集群 => 八个超大实例(cc2.8xlarge)

  • 60.5 GiB 内存
  • 88 个 EC2 计算单元(2 个 Intel Xeon E5-2670, 8 个内核)
  • 3370 GB 的实例存储
  • 64 位机
  • I/O 性能: 特别高(10千兆以太网)

这些节点配置是:

  • 适用于群集实例 AMI 的Ubuntu Server 12.04 LTS 版
  • Oracle Java JDK 1.7
  • Erlang R15B03
  • VoltDB Enterprise Edition 3.0 RC

根据来自 VoltDB 的建议,五个服务器节点中的每一个都被设置为六个分区,所以我在数据库集群中有30个分区。

这个 benchmark 可以在 free Community Edition of Volt 3.0 上执行。

事务

客户端通过调用 Voter 的 vote() 存储过程不断调用 VoltDB 集群。这个程序不仅执行一次写操作,而且取决于你如何统筹 4 到 6 次操作:

  • 它检索调用者的位置(select
  • 验证调用者未超过其最大投票数(select
  • 验证调用者是否投票给有效的参赛者(select
  • 如果上述所有条件通过,则进行投票(insert

最重要的是,每个插入也触发更新到两个不同的具体化视图。

下面是定义使用的存储过程的实际查询19:

代码语言:sql
复制
// 检查投票是否为有效的参赛者
SELECT contestant_number FROM contestants WHERE contestant_number = ?; 

// 检查选民是否超出了允许的选票数量 
SELECT num_votes FROM v_votes_by_phone_number WHERE phone_number = ?; 

// 检查区号以检索相应的状态
SELECT state FROM area_code_state WHERE area_code = ?; 

// 记录投票
INSERT INTO votes (phone_number, state, contestant_number) VALUES (?, ?, ?); 

因此,877,000 TPS 每秒执行 350 万次 SQL 操作,即三个选择和一个插入。

后记

在我看来,最重要的数字是我看到的每个 CPU 内核每秒处理 26,500 个事务,这意味着 10 万次操作。这将允许您粗略估计您在业务服务器端(VoltDB 客户端)可能需要的硬件数量。您的客户通常会有更多的工作要做,而不是简单地全部丢给服务器来做,就像 benchmark 一样。所以你有一个上限在这里,可以从那里感觉到你的方式。请注意,许多机器将显示比 EC2 实例高得多的性能配置文件。

我们决定以 Amazon 弹性云作为 benchmark,希望这会推出最明了的设置。一个由八个“裸机”节点组成的本地集群肯定会比 EC2 的集群性能更好,如果你每天使用这个节点,那么这样做会更经济。但是我们的吞吐量数字很难独立重现。

实际上,您可以轻松地尝试完全相同的 benchmark 。VoltDB 和新的驱动程序可以从 VoltDB 下载 20。驱动程序的 README.md 21 以及 benchmark 16 都有关于如何使用驱动程序以及如何进行 benchmark 的更多说明。要找到驱动程序的实验性新版本以及快速错误修复,请试试托管在 github 上的 Eonblast Erlvolt 22。免费的 VoltDB 社区版也托管在 github 上23

代码语言:text
复制
[1] Author on Twitter: https://twitter.com/hdiedrich

 
[2] Eonblast: http://www.eonblast.com

 
[3] VoltDB: http://www.voltdb.com

 
[4] Erlang: http://www.erlang.org

 
[5] Deepolis: http://www.deepolis.com

 
[6] Choosing the Best Database For a Game: http://voltdb.com/dig-deeper/webinars.php

 
[7] Why Erlang? http://www.slideshare.net/eonblast/why-erlang-gdc-online-2012

 
[8] Erlang and VoltDB: http://www.slideshare.net/eonblast/voltdb-and-erlang-tech-planet-2012

 
[9] Erlvolt 0.2: https://github.com/Eonblast/Erlvolt/tree/01b304f8975c2168be105c1b9c972386264c0a4e

 
[10] http://blog.voltdb.com/community-contributions-erlang-client-library/

 
[11] Erlvolt 0.3: https://github.com/VoltDB/voltdb-client-erlang

 
[12] VoltDB 3: http://blog.voltdb.com/introducing-voltdb-3-0/

 
[13] Emysql: https://github.com/Eonblast/Emysql

 
[14] 695k with Node.js: http://blog.voltdb.com/695k-tps-nodejs-and-voltdb/

 
[15] bench.erl: https://github.com/VoltDB/voltdb-client-erlang/blob/master/etc/bench/bench.erl

 
[16] Bench README: https://github.com/VoltDB/voltdb-client-erlang/blob/master/etc/bench

 
[17] Amazon EC2 Cluster Instances: http://aws.amazon.com/ec2/instance-types/

 
[18] Backpressure: http://voltdb.com/docs/UsingVoltDB/DesignAppLogic.php

 
[19] Query Source: https://github.com/VoltDB/voltdb/blob/master/examples/voter/src/voter/procedures/Vote.java

 
[20] VoltDB Downloads: VoltDB http://voltdb.com/community/downloads.php

 
[21] Driver README: https://github.com/VoltDB/voltdb-client-erlang

 
[22] Erlvolt Development: https://github.com/Eonblast/Erlvolt

 
[23] VoltDB Community Edition: https://github.com/VoltDB/voltdb
评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 驱动
  • Benchmark
  • Benchmark 结果
  • 环境
    • 集群 => 八个超大实例(cc2.8xlarge)
    • 事务
    • 后记
    相关产品与服务
    云数据库 SQL Server
    腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档