热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TiDB5.0异步事务特性体验——基于X86和ARM混合部署架构

神州数码是国内领先的企业数字化服务商,从2018年开始,我们使用v2.0.5搭建了第一套TiDB数据库集群,之后便与TiDB结下不解之缘,在集团内多个业务场景下使用TiDB,其中一

作者:alexshen

原文来源:https://tidb.net/blog/71bb4db7


【是否原创】是\
【首发渠道】TiDB 社区\
【正文】


业务背景

神州数码是国内领先的企业数字化服务商,从2018年开始,我们使用v2.0.5搭建了第一套TiDB数据库集群,之后便与TiDB结下不解之缘,在集团内多个业务场景下使用TiDB, 其中一个比较有意思的场景是员工考勤。

神州数码拥有三家上市公司,平台遍布全国各地,员工数量众多,早上九点左右打卡,打卡途径包括但不限于门禁、指纹、人脸识别和移动签到,并且各地的考勤规则也略有差异。各地的打卡机不同,对接的数据库也不同,比如mysql、oracle、SQL Server等。过去,员工只能在下午四点半以后才能查询当天早上的打卡情况。随着业务规模和人员数量的增长,服务器需要不停的升级以应对高峰期打卡时的并发数据量,有时会出现打卡异常情况。上下班高峰期对考勤系统是一个不小的挑战,并且这是一个典型的写多读少的场景,为了能及时反馈打卡结果,对数据写入的延迟要求比较高。

而TiDB在5.0版本中提供了异步事务提交特性,这一点对写入频繁的场景非常有用,它可以有效地降低请求延时提高吞吐量。 考虑到这非常适用于考勤系统的场景,我们在同等配置下测试TiDB 5.0对事务读写性能的提升情况。


为什么使用混合部署架构

ARM架构的处理器以其优异的性能、低廉的成本和功耗被越来越多地使用在各种设备之上,对比X86的机器,ARM机器在性能功耗比(Performance per watt)方面是具有天然优势的,众多服务器厂商也早已经把ARM架构应用在CPU设计中,华为鲲鹏920便是比较典型的一款产品。

TiDB可以完美运行在ARM架构之上,这一点已经有实际案例可以说明。

基于TiDB的多平台兼容特性,我们同时使用ARM和X86的机器搭建混合架构的TiDB集群,来测试一下在混合部署架构下TiDB 5.0的异步事务提交特性到底有多少性能提升。


本次测试使用ARM物理机是神州鲲泰多路服务器,它搭载了4颗鲲鹏920CPU,核心数达到96核。



资源配置

本次测试所有的节点都运行在Centos 7.6系统,ARM节点和X86节点分别运行在两台物理机,使用千兆网络通信。

TiDB集群的拓扑结构如下图所示:

image

具体说明为:



  • 3台相同配置的TiDB节点,其中2台ARM+1台X86

  • 3台相同配置的PD节点,其中2台ARM+1台X86

  • 6台相同配置的TiKV节点,其中3台ARM+3台X86

  • 1台监控节点,ARM架构

  • 1台HAProxy节点,X86架构

  • 1台Sysbench节点,X86架构

测试工具使用Sysbench基准测试,版本是1.0.20,用oltp_read_write场景模拟复杂的事务提交,最后对比TiDB 4.0版本和5.0版本在不同并发量下事务的吞吐量和延时情况。

TiDB集群配置项:

```
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/tidb-deploy"
data_dir: "/tidb-data"
arch: "arm64"

monitored:
node_exporter_port: 9100
blackbox_exporter_port: 9115

server_configs:
tidb:
log.level: "error"
prepared-plan-cache.enabled: true
tikv:
log.level: "error"

pd_servers:
- host: 10.3.65.xxx
- host: 10.3.65.xxx
- host: 10.3.70.xxx
arch: "amd64"

tidb_servers:
- host: 10.3.65.xxx
- host: 10.3.65.xxx
- host: 10.3.70.xxx
arch: "amd64"

tikv_servers:
- host: 10.3.65.xxx
- host: 10.3.65.xxx
- host: 10.3.65.xxx
- host: 10.3.70.xxx
arch: "amd64"
- host: 10.3.70.xxx
arch: "amd64"
- host: 10.3.70.xxx
arch: "amd64"



  • host: 10.3.65.xxx



  • host: 10.3.65.xxx



alertmanager_servers:
- host: 10.3.65.xxx
```


测试方法



  • 使用tiup部署4.0.0版本集群

  • 使用HAProxy代理3个TiDB节点

  • 使用Sysbench准备测试数据,10张表,单表1000万行数据

  • 对oltp_read_write场景分别做并发维度50、100、200、400、800的压测

  • 销毁集群

  • 用相同的配置文件部署5.0.0版本集群,默认开启了异步事务提交

  • 使用Sysbench准备相同数据量的测试数据

  • 对oltp_read_write场景分别做并发维度50、100、200、400、800的压测

  • 数据对比得出结论,对比指标分别是QPS、TPS、延时

Sysbench配置项:

--table_size=10000000
--tables=10
--threads={50、100, 200, 400, 800}
--time=300
--report-interval=10


测试步骤

首先搭建TiDB4.0.0集群,集群信息如下:

image

HAProxy负载均衡清单:

image

创建测试库:

create database sbtest;

导入测试数据:

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host={proxy ip} --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password= --table_size=10000000 --tables=10 --threads=100 --time=300 --report-interval=10 prepare

执行50线程下的压测:

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host={proxy ip} --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password= --table_size=10000000 --tables=10 --threads=50 --time=300 --report-interval=10 run

image

执行100线程下的压测:

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host={proxy ip} --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password= --table_size=10000000 --tables=10 --threads=100 --time=300 --report-interval=10 run

image

执行200线程下的压测:

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host={proxy ip} --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password= --table_size=10000000 --tables=10 --threads=200 --time=300 --report-interval=10 run

image

执行400线程下的压测:

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host={proxy ip} --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password= --table_size=10000000 --tables=10 --threads=400 --time=300 --report-interval=10 run

image

执行800线程下的压测:

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host={proxy ip} --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password= --table_size=10000000 --tables=10 --threads=800 --time=300 --report-interval=10 run

image

以上5次压测的事务监控汇总为:

image

接下来清理掉4.0.0的集群:

tiup cluster destroy tidb-test

重新部署5.0.0的新集群:

image

我们查看新集群已经开启了异步事务提交:\
image

同样导入单表1000万行数据后做5次压测。

执行50线程下的压测:

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host={proxy ip} --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password= --table_size=10000000 --tables=10 --threads=50 --time=300 --report-interval=10 run

image

执行100线程下的压测:

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host={proxy ip} --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password= --table_size=10000000 --tables=10 --threads=100 --time=300 --report-interval=10 run

image

执行200线程下的压测:

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host={proxy ip} --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password= --table_size=10000000 --tables=10 --threads=200 --time=300 --report-interval=10 run

image

执行400线程下的压测:

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host={proxy ip} --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password= --table_size=10000000 --tables=10 --threads=400 --time=300 --report-interval=10 run

image

执行800线程下的压测:

sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host={proxy ip} --mysql-port=4000 --mysql-db=sbtest --mysql-user=root --mysql-password= --table_size=10000000 --tables=10 --threads=800 --time=300 --report-interval=10 run

image

以上5次压测的事务监控汇总为:

image


测试结果

image

image

通过以上对比数据可以看出,在并发量比较小的时候5.0版本性能提升非常明显,到400并发后吞吐量已经到了极限,随着并发量不断加大凸显出了硬件瓶颈,性能提升开始放缓,不过此时各指标依然高于4.0版本。

从各节点IO指标的监控数据来看,性能瓶颈主要是TiKV节点IO近乎打满导致,这一点也说明存储层依然对硬件要求比较高,希望TiDB能在后续版本中继续深度优化。

image

参考官方给出的TiDB 5.0测试数据,混合部署的测试结果在性能提升上还要高于纯X86机器,这一点还是非常让人惊喜的。

另外一点值得一提的是,从各自5次测试的监控曲线来看,TiDB 5.0在事务提交上的稳定性也有肉眼可见的提升,4.0的事务曲线波动比较大,5.0的事务曲线整体趋于平稳。


总结



  • TiDB支持多元架构部署,为各种应用提供架构选择。本次测试的两个TiDB版本都能够非常平稳地运行在混合架构下,整个测试过程没有任何异常问题。

  • 单在事务提交优化上,TiDB 5.0版本比4.0版本有大幅的性能提升,QPS、TPS、延时这3个重要指标都明显优于4.0。

  • 事务性能的提升,意味着TiDB在面对高并发的TP型业务有了更多发展空间。\
    分析了上面的测试数据,我们对把已有的业务系统升级到TiDB 5.0有了充足的信心。


推荐阅读
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Oracle字符集详解:图表解析与中文乱码解决方案
    本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ... [详细]
  • FreeBSD环境下PHP GD库安装问题的详细解决方案
    在 FreeBSD 环境下,安装 PHP GD 库时可能会遇到一些常见的问题。本文详细介绍了从配置到编译的完整步骤,包括解决依赖关系、配置选项以及常见错误的处理方法。通过这些详细的指导,开发者可以顺利地在 FreeBSD 上完成 PHP GD 库的安装,确保其正常运行。此外,本文还提供了一些优化建议,帮助提高安装过程的效率和稳定性。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 如何优化MySQL数据库性能以提升查询效率和系统稳定性 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • 阿里云MySQL与Oracle数据库的主从复制技术详解 ... [详细]
  • 在2015年1月的MySQL内核报告中,我们详细探讨了性能优化和Group Commit机制的改进。尽管网上已有大量关于Group Commit的资料,本文将简要回顾其发展,并重点分析MySQL 5.6及之前版本中引入的二进制日志(Binlog)对性能的影响。此外,我们还将深入讨论最新的优化措施,如何通过改进Group Commit机制显著提升系统的整体性能和稳定性。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • 本文深入探讨了如何选择适合业务需求的MySQL存储引擎,详细解析了不同存储引擎的特点、适用场景及其在数据存储和管理中的优势。通过对比InnoDB、MyISAM等主流引擎,为读者提供了全面的技术指导和专业建议,帮助开发者在实际应用中做出明智的选择。 ... [详细]
  • 在深入掌握Spring框架的事务管理之前,了解其背后的数据库事务基础至关重要。Spring的事务管理功能虽然强大且灵活,但其核心依赖于数据库自身的事务处理机制。因此,熟悉数据库事务的基本概念和特性是必不可少的。这包括事务的ACID属性、隔离级别以及常见的事务管理策略等。通过这些基础知识的学习,可以更好地理解和应用Spring中的事务管理配置。 ... [详细]
  • 在探讨 MySQL 正则表达式 REGEXP 的功能与应用之前,我们先通过一个小实验来对比 REGEXP 和 LIKE 的性能。通过具体的代码示例,我们将评估这两种查询方式的效率,以确定 REGEXP 是否值得深入研究。实验结果将为后续的详细解析提供基础。 ... [详细]
author-avatar
五月妖精23
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有