BenchmarkSQL 支持 TiDB 驱动以及 tidb-loadbalance

这篇具有很好参考价值的文章主要介绍了BenchmarkSQL 支持 TiDB 驱动以及 tidb-loadbalance。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者: GangShen 原文来源: https://tidb.net/blog/3c274180

使用 BenchmarkSQL 对 TiDB 进行 TPC-C 测试

   众所周知 TiDB 是一个兼容 MySQL 协议的分布式关系型数据库,用户可以使用 MySQL 的驱动以及连接方式连接 TiDB 进行使用,并且使用语法上与 MySQL 也没有差异。TPC-C 是一个对 OLTP(联机交易处理)系统进行测试的规范,模拟的是一个商品销售模型的场景,包括新订单生成、订单付款、最近订单查询、配送、库存缺货状态分析。

    PingCAP 在早期通过在开源的 BenchmarkSQL5.0 的基础上添加了对 MySQL 协议的支持,实现对 TiDB 进行 TPC-C 测试。具体可以参考 PingCAP 官方文档:https\://docs.pingcap.com/zh/tidb/v3.0/benchmark-tidb-using-tpcc

TiDB-JDBC 以及 tidb-loadbalance 介绍

   由于早期版本 TiDB 计算节点并不支持负载均衡,所以 TiDB 集群需要配合 HAProxy、LVS 或者 F5 等负载均衡使用,将应用连接分发到不同的计算节点上。TiDB 官方在 6.1 版本之后针对 Java 程序推出了 TiDB 自己的驱动 TiDB-JDBC和 Java 客户端负载均衡 tidb-loadbalance:
  • TiDB-JDBC **是基于 MySQL 8.0.29 的定制版本。TiDB-JDBC 基于 MySQL 官方 8.0.29 版本编译,修复了原 JDBC 在 prepare 模式下多参数、多字段 EOF 的错误,并新增 TiCDC snapshot 自动维护和 SM3 认证插件等功能。
  • tidb-loadbalance 是应用端的负载均衡组件。通过 tidb-loadbalance,你可以实现自动维护 TiDB server 的节点信息,根据节点信息使用 tidb-loadbalance 策略在客户端分发 JDBC 连接。客户端应用与 TiDB server 之间使用 JDBC 直连,性能高于使用负载均衡组件。目前 tidb-loadbalance 已实现轮询、随机、权重等负载均衡策略。

适配 BenchmarkSQL

   我们希望让 BenchmarkSQL 支持 TiDB-JDBC 驱动以及 tidb-loadbalance 应用端负载均衡,这样在对 TiDB 进行 TPC-C 测试时可以不用额外部署负载均衡软件来支持连接分发。先附上修改适配之后的 Github 仓库链接:https\://github.com/Win-Man/benchmarksql/tree/5.0-tidb-support

   本节将详细介绍如何通过修改 BenchmarkSQL 代码来支持 TiDB 驱动。

增加 TiDB 数据库类型定义

修改 src/client/jTPCC.java 文件,增加 TiDB 数据库定义:

        if (iDB.equals("firebird"))
            dbType = DB_FIREBIRD;
        else if (iDB.equals("oracle"))
            dbType = DB_ORACLE;
        else if (iDB.equals("postgres"))
            dbType = DB_POSTGRES;
        else if (iDB.equals("mysql"))
            dbType = DB_MYSQL;
        else if (iDB.equals("tidb"))
                dbType = DB_TIDB;
        else
        {
            log.error("unknown database type '" + iDB + "'");
            return;
        }

修改 src/client/jTPCCConfig.java 文件,增加 TiDB 数据库类型:

    public final static int     DB_UNKNOWN = 0,
                                DB_FIREBIRD = 1,
                                DB_ORACLE = 2,
                                DB_POSTGRES = 3,
                                DB_MYSQL = 4,
                                DB_TIDB = 5;

SQL 子查询增加别名

修改 src/client/jTPCCConnection.java 在 SQL 子查询中增加 AS L 别名,否则会出现语法错误。

            default:
                stmtStockLevelSelectLow = dbConn.prepareStatement(
                    "SELECT count(*) AS low_stock FROM (" +
                    "    SELECT s_w_id, s_i_id, s_quantity " +
                    "        FROM bmsql_stock " +
                    "        WHERE s_w_id = ? AND s_quantity < ? AND s_i_id IN (" +
                    "            SELECT ol_i_id " +
                    "                FROM bmsql_district " +
                    "                JOIN bmsql_order_line ON ol_w_id = d_w_id " +
                    "                 AND ol_d_id = d_id " +
                    "                 AND ol_o_id >= d_next_o_id - 20 " +
                    "                 AND ol_o_id < d_next_o_id " +
                    "                WHERE d_w_id = ? AND d_id = ? " +
                    "        ) " +
                    "    )AS L");
                break;

修改测试运行脚本

修改 run/funcs.sh 文件,添加 TiDB 驱动拷贝操作

function setCP()
{
    case "$(getProp db)" in
        firebird)
            cp="../lib/firebird/*:../lib/*"
            ;;
        oracle)
            cp="../lib/oracle/*"
            if [ ! -z "${ORACLE_HOME}" -a -d ${ORACLE_HOME}/lib ] ; then
                cp="${cp}:${ORACLE_HOME}/lib/*"
            fi
            cp="${cp}:../lib/*"
            ;;
        postgres)
            cp="../lib/postgres/*:../lib/*"
            ;;
        mysql)
            cp="../lib/mysql/*:../lib/*"
            ;;
        tidb)
                cp="../lib/tidb/*:../lib/*"
                ;;
    esac
    myCP=".:${cp}:../dist/*"
    export myCP
}

# ----
# Make sure that the properties file does have db= and the value
# is a database, we support.
# ----
case "$(getProp db)" in
    firebird|oracle|postgres|mysql|tidb)
        ;;
    "")        echo "ERROR: missing db= config option in ${PROPS}" >&2
        exit 1
        ;;
    *)        echo "ERROR: unsupported database type 'db=$(getProp db)' in ${PROPS}" >&2
        exit 1
        ;;
esac

新增 TiDB 配置文件模板 props.tidb

新增 run/props.tidb 配置文件:

db=tidb
driver=com.tidb.jdbc.Driver
conn=jdbc:tidb://127.0.0.1:4000/tpcc?useSSL=false&useServerPrepStmts=true&useConfigs=maxPerformance&rewriteBatchedStatements=true&cachePrepStmts=true&prepStmtCacheSize=1000&prepStmtCacheSqlLimit=2048
user=root
password=

warehouses=1
loadWorkers=4

terminals=1
//To run specified transactions per terminal- runMins must equal zero
runTxnsPerTerminal=0
//To run for specified minutes- runTxnsPerTerminal must equal zero
runMins=10
//Number of total transactions per minute
limitTxnsPerMin=0

//Set to true to run in 4.x compatible mode. Set to false to use the
//entire configured database evenly.
terminalWarehouseFixed=true

//The following five values must add up to 100
//The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4

// Directory name to create for collecting detailed result data.
// Comment this out to suppress.
resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
//osCollectorScript=./misc/os_collector_linux.py
//osCollectorInterval=1
//osCollectorSSHAddr=user@dbhost
//osCollectorDevices=net_eth0 blk_sda

添加 TiDB-JDBC 驱动以及 tidb-loadbalance jar 包

新建 lib/tidb 目录并放入 jar 包

测试使用

  1. 下载测试程序
git clone -b 5.0-tidb-support https://github.com/Win-Man/benchmarksql.git
  1. 安装 java 和 ant,以 CentOS 为例,可以执行以下命令进行安装
sudo yum install -y java ant
  1. 进入 benchmarksql 目录并执行 ant 构建
cd benchmarksql
ant
  1. 修改 benchmarksql/run/props.tidb 文件
conn=jdbc:mysql://{TiDB-IP}:{TiDB-PORT}/tpcc?useSSL=false&useServerPrepStmts=true&useConfigs=maxPerformance
warehouses=1000 # 使用 1000 个 warehouse
terminals=500   # 使用 500 个终端
loadWorkers=32  # 导入数据的并发数

{TiDB-IP}:{TiDB-PORT} 只需要填 TiDB 集群任意一个 TiDB Server 计算节点的 IP 地址与端口就可以,程序启动之后 tidb-loadbalance 会自动发现集群内部所有的计算节点并进行连接的分发。

  1. 在 TiDB 中创建 TPCC 测试库
create database tpcc;
  1. 运行 BenchmarkSQL 建表脚本并导入数据:
cd run && \
./runSQL.sh props.tidb sql.mysql/tableCreates.sql && \
./runSQL.sh props.tidb sql.mysql/indexCreates.sql
./runLoader.sh props.tidb
  1. 运行测试
./runBenchmark.sh props.tidb

TPCC测试对于分布式数据库测试的意义

   分布式数据库在近两年的热度一直非常高,由于 OceanBase 以及腾讯的 TPCC 打榜:
  • 世界第一!腾讯云数据库 TDSQL 登顶 TPC-C 榜,刷新全球纪录

  • OceanBase 登顶 TPC-C:无关比赛,只是在追求自我的极致

     很多人在数据库选型的时候会关注 TPCC 的测试结果,所以也有很多数据库厂商会在 TPCC 测试上进行专门的优化以此来提升在 POC 节点的测试成绩。但是往往有很多客户在做了数据库选型之后,将数据库产品应用于真实业务场景时发现,一些在 POC 时 TPCC 测试成绩优异的产品,对于真实业务的性能提升非常有限,甚至有些还不如没做分布式改造之前的性能。所以在做数据库选型测试,我们规划测试案例的时候,我们需要非常清楚我们设计的测试案例所要测试的目的以及测试案例设计的是否合理。完整的数据库选型如何设计这是一个非常大的题目,我这边不做展开讲述,但是在客户选择使用 TPCC 作为数据库选型中的性能指标这一点上,我有一些自己的想法。
    
     首先我们先了解 TPCC 这个测试的业务场景,这是一个典型的商品销售模型的场景,包括新订单生成、订单付款、最近订单查询、配送、库存缺货状态分析。交易的业务逻辑主要有:
    
  1. 仓库(Warehouse),有很多的仓库,每个仓库有很多的商品(Item),每个商品在每个仓库有自己的库存数目。仓的数目很多,比如一般测试都是1000仓起步(这个与一些电商平台是不一样的,例如淘宝,核心单元可能就个位数)。

  2. 买家(Customer),绝大多数情况下,买家只会从绑定的一个仓库买东西;少数情况下,买家才会从其他仓库买东西 文章来源地址https://www.toymoban.com/news/detail-630056.html

    基于这样的业务特征,很容易想到将数据库按照仓库 ID 进行分片,大多数的事务可以在单个分片内完成。对仓库 ID 进行分片这个第一反应就是很适合分库分表的分布式数据库解决方案。对数据进行分片之后,事务都在单个分片内执行,也就是在分库分表方案底下的单个数据库实例中实现,通过增加分片数量就可以很好的扩展整体的 TPCC 测试性能,从这个逻辑上 TPCC 体现的是单个数据库实例的性能,并不是一个分布式数据库整体的分布式能力。合理的设计分片字段后,只有少量的跨节点分布式事务,这对于分布式数据库的选型其实绕过了重要的分布式事务性能测试的点。
    
    而很多 TPC-C 测试性能优异但是真实业务场景性能平平的原因,原因在于 TPCC 的测试模型相对简单,真实世界是非常复杂的,真实的业务场景也不一定能够完美的设计分片键将所有的数据库按照分片规则去分布,在单个数据库实例内部完成事务。一旦涉及到跨节点的分布式事务,分库分表的分布式解决方案在性能上会大幅下降,因为基于分库分表的方案底层还是 MySQL 或者 PostgreSQL ,这些数据库不是原生的分布式数据库,要实现分布式事务需要通过 XA 事务接口或者其他方式实现,其性能不如原生的分布式数据库。并且原生分布式数据库从架构设计上就是为分布式考虑的,所以在分布式事务优化方面有更大的空间以及灵活度。
    
    总结来说,TPCC 的性能测试仅建议做参考不建议作为选型依据,如果是希望数据库选型的性能测试,建议使用真实业务场景进行测试更为准确靠谱。可以通过 JMeter 压测业务接口模拟不同的业务压力。
    

其他可参考文档

  • tidb-loadbalance 客户端方式软负载均衡配置实践
  • 选择驱动或 ORM 框架
  • PolarDB-X 数据分布解读(三) :TPCC与透明分布式

到了这里,关于BenchmarkSQL 支持 TiDB 驱动以及 tidb-loadbalance的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mt7981支持leds驱动 - 修改5g led为普通led

    一. 前言         由于工作中需要驱动mt7981的gpio,所以研究了下怎么使用mt7981的leds驱动子系统,记录如下文。 二. 将5g wifi灯复用为普通GPIO 1. 查看drivers/pinctrl/mediatek/pinctrl-mt7981.c 三. 修改设备树 修改arch/arm64/boot/dts/mediatek/mt7981-spim-nor-rfb.dts文件 1. 修改\\\"wf5g_led1\\\" pin的复用关系为

    2024年02月09日
    浏览(55)
  • PL2303驱动程序不支持WINDOWS 11及后续版本的解决办法

    更新了Windows11之后,发现计算机—设备管理里面的PL2303(USB转串口的驱动程序)提示:PL2303驱动程序不支持WINDOWS 11及后续版本,请安装正确驱动程序。 具体的解决办法和步骤可参考如下: 安装旧版本的驱动(下载地址如下,或自己安装个旧版本的) PL2303 USB转串口驱动程序

    2024年02月11日
    浏览(37)
  • Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130534343 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:没有了 下一篇:《Linu

    2024年02月08日
    浏览(77)
  • alibaba.item_get API:电商行业中的数据驱动决策支持

    alibaba.item_get  API 是阿里巴巴提供的一个用于获取商品详情的接口。在电商行业中,数据驱动的决策支持是非常重要的,而这个 API 可以帮助你获取到商品的各种详细信息,从而为你的决策提供支持。 具体来说,通过使用  alibaba.item_get  API,你可以获取到商品的以下信息:

    2024年01月17日
    浏览(47)
  • 微软推出 GPT-4 AI 驱动的Security Copilot工具,为防御者提供支持

    微软周二推出了有限预览版的 Security Copilot,标志着它继续寻求嵌入面向 AI 的功能,以试图提供“以机器速度和规模的端到端防御”。 由 OpenAI 的 GPT-4 生成 AI 和它自己的特定安全模型提供支持,它被宣传为一种安全分析工具,使网络安全分析师能够快速响应威胁、处理信号

    2024年02月15日
    浏览(57)
  • intel驱动程序和支持助理常见问题:不识别、无法检测等问题解决方法

    起因: wifi驱动有点问题,于是想着更新一下官方的驱动,下载intel驱动程序和支持助理并安装完成后,打开成了这个样子,刷新多少次都没有用,就是不识别。 解决方法: 经过一波胡乱操作,发现以下两个步骤可以解决这个问题: 步骤一,注册并登陆账号 点击上方的图标

    2024年02月06日
    浏览(78)
  • 形态驱动选股支持回测评估啦!!股票量化分析工具QTYX-V2.5.4

    前言 在股票交易中,不少交易者容易走入胜率的误区,总觉得策略的胜率要很高才能盈利,其实设置好止损点后,让利润奔跑,利用赔率也是可以长期盈利的。 股票量化分析工具QTYX的形态选股功能,就是利用了的赔率原理去获利。 比如出现双底形态、箱体形态的个股不一定

    2024年02月11日
    浏览(40)
  • 11-1 项目技术支持以及售后服务

    一,项目技术支持方案 网络拓扑结构 结构选型 当计算机数量较多的时候或可靠性要求较高时,优先采用星系,树型头拓扑结构,根据项目需求所示, 应采用星型拓扑,且使用双链路传输,以及对各个部门实施逻辑上的局域网隔离,使子公司与总公司能够相互通信 1.1项目网

    2024年01月16日
    浏览(44)
  • 支持向量机SVM介绍以及MATLAB实现

      支持向量机是数据挖掘中的一项新技术,是借助最优化方法来解决机器学习问题的新工具,最初由V.Vapnik等人提出,近几年来在其理论研究和算法实现等方面都取得了很大的进展,开始成为克服“维数灾难”和“过学习”等困难的强有力手段,其理论基础和实现途径的基本

    2023年04月09日
    浏览(31)
  • FPGA实现LVDS视频输出,纯verilog代码驱动,提供2套工程源码和技术支持

    FPGA实现LVDS视频输出,纯verilog代码驱动,提供2套工程源码和技术支持 LVDS协议作为中等速率的差分信号,在笔记本电脑和手机等消费电子领域应用广泛,FPGA实现LVDS视频协议也有广泛应用,一般在军工和医疗领域,LVDS视频相比RGB并行视频传输而言,图像质量和IO数量都有优势

    2024年02月04日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包