sysbench压测DM的高可用切换测试

一、配置集群

1. 配置svc.conf

[root@localhost dm]# cat /etc/dm_svc.conf 
TIME_ZONE=(480)
LANGUAGE=(CN)DM=(192.168.112.139:5236,192.168.112.140:5236)
[DM]
LOGIN_MODE=(1)
SWITCH_TIME=(300)
SWITCH_INTERVAL=(200)

二、编译sysbench

2.1 配置环境变量


[dmdba@~]# vi ~/.bash_profile												--修改[dmdba@~]# export DM_HOME="/opt/dmdbms"
[dmdba@~]# export PATH=$PATH:/opt/dmdbms/bin[dmdba@~]# source ~/.bash_profile	

2.2 编译sysbench

2.2.1 配置

## 赋予权限
[root@localhost sysbench-master-dpi]# chmod 755 * -R
## 生成confifure
[root@localhost sysbench-master-dpi]# ./autogen.sh 
## 执行配置文件
## x86平台编译方式
[root@localhost sysbench-master-dpi]# ./configure --without-mysql --with-dm## arm平台编译方式
## [root@localhost sysbench-master-dpi]# ./configure --without-mysql --with-dm --build=aarch64-unkown-linux-gnu

2.2.2.2 修改dpi源码

将dm_drv_connect函数的自动提交由默认的非自动提交改为自动提交,如不改 跑insert update相关的语句 事务会回滚

# 修改
sysbench-master-dpi/src/drivers/dm/drv_dpi_dm.c将dm_drv_connect函数的自动提交由默认的非自动提交改为自动提交//rc = dpi_set_con_attr(dm_con->hdbc, DSQL_ATTR_AUTOCOMMIT, DSQL_AUTOCOMMIT_OFF, 0);rc = dpi_set_con_attr(dm_con->hdbc, DSQL_ATTR_AUTOCOMMIT, DSQL_AUTOCOMMIT_ON, 0);

2.2.3 编译

## 编译
[root@localhost sysbench-master-dpi]# make## 拷贝sysbench到src/lua下进行测试
[root@localhost src]# cd /opt/sysbench-master-dpi/src
[root@localhost src]# cp sysbench lua/

三、压测sysbench

3.1 准备数据

## 准备数据
./sysbench oltp_read_write.lua --tables=5 --table-size=200000 --db_driver=dm --dm-db=DM --dm-user=SYSDBA --dm-password=SYSDBA --auto-inc=0 --threads=4 --time=180 --report-interval=1 prepare

3.2 开始压测

导入oltp_insert_reconnect.lua脚本到lua目录下

sysbench.cmdline.options = {table_size = {"Number of rows per table", 5000},tables = {"Number of tables", 1},auto_inc = {"Use auto-incremenit IDs", false},
}local drv = sysbench.sql.driver()
local con-- 最大重连次数
local MAX_RETRIES = 30function connect_db()local retry_count = 0local max_retries = MAX_RETRIES or 5 while retry_count < max_retries dolocal status, err = pcall(function()con = drv:connect()end)-- 如果连接成功,跳出循环if status thenprint("Database connection established.")returnelseretry_count = retry_count + 1print(string.format("Connection failed: %s. Retrying %d/%d...", err, retry_count, max_retries))os.execute("sleep 1")endend-- 如果达到最大重试次数,抛出错误error("Failed to connect to the database after multiple retries.")
end-- 断开连接函数
function disconnect_db()if con thencon:disconnect()con = nilprint("Database connection closed.")end
endfunction sysbench.hooks.before_connect()connect_db()
endfunction sysbench.hooks.after_disconnect()disconnect_db()
end-- 执行事务的函数,包含重连检测
function execute_query(query)local status, result = pcall(function()return con:query(query)end)-- 如果查询失败,尝试重连if not status then-- 具体细化的话 可以根据错误码做重连逻辑-- 这里统一做重连逻辑disconnect_db()    os.execute("sleep 1")connect_db()execute_query(query)endreturn result
end-- 10 groups, 119 characters
local c_value_template = "###########-###########-###########-" .."###########-###########-###########-" .."###########-###########-###########-" .."###########"-- 5 groups, 59 characters
local pad_value_template = "###########-###########-###########-" .."###########-###########"function get_c_value()return sysbench.rand.string(c_value_template)
endfunction get_pad_value()return sysbench.rand.string(pad_value_template)
end-- 执行 write only 测试
function event()local table_name = "sbtest" .. sysbench.rand.uniform(1, sysbench.opt.tables)
execute_query("SELECT c FROM sbtest1 WHERE id = 1")
local k_val = sysbench.rand.default(1, sysbench.opt.table_size)
local c_val = get_c_value()
local pad_val = get_pad_value()if (sysbench.opt.auto_inc) theni = 0
else-- Convert a uint32_t value to SQL INTi = sysbench.rand.unique() - 2147483648
endexecute_query(string.format("INSERT INTO %s (id, k, c, pad) VALUES " .."(%d, %d, '%s', '%s')",table_name, i, k_val, c_val, pad_val))end

3.2.1 运行文件


./sysbench oltp_insert_reconnect.lua --auto-inc=0   --tables=5 --table-size=5000 --db_driver=dm --dm-db=DM --dm-user=SYSDBA --dm-password=SYSDBA --threads=4 --time=180 --report-interval=1 --db-debug=on --debug=on   run#./sysbench oltp_insert_reconnect.lua  --db_driver=dm --dm-db=DM --dm-user=SYSDBA --dm-password=SYSDBA --threads=4 --time=180 --report-interval=1 --db-debug=on --debug=on   run

3.2.2 进行集群切换测试

[root@localhost bin]# ./dmmonitor ./dmmonitor_noc.iniSWITCHOVER

3.3 清理数据

## 清理数据
./sysbench oltp_insert_reconnect.lua --db_driver=dm --dm-db=DM --dm-user=SYSDBA --dm-password=SYSDBA --threads=4 --time=180 --report-interval=1 --auto-inc=0   --tables=5 --table-size=5000 --db-debug=on --debug=on  cleanup

4. 附录

4.1 dpi中的reconnect代码

/* Reset connection to the server */
static int dm_drv_reconnect(db_conn_t  *sb_conn)
{dm_conn_t *dm_con = sb_conn->ptr;DPIRETURN     rc;sdbyte err_msg[512];sdint2 msg_len;sdint4 err_code;// log_text(LOG_DEBUG, "Reconnecting");if (dm_con == NULL){return 1;}if (dm_con->hdbc != NULL){dpi_logout(dm_con->hdbc);}/* rc = dpi_login(dm_con->hdbc, (sdbyte *)args.db, (sdbyte *)args.user, (sdbyte *)args.password);if (rc != DSQL_SUCCESS){dpi_get_diag_rec(DSQL_HANDLE_DBC, dm_con->hdbc, 1, &err_code, err_msg, sizeof(err_msg), &msg_len);log_text(LOG_ALERT, "Error - DM_%d_%s", err_code, err_msg);  return 1;}*/while (1) {rc = dpi_login(dm_con->hdbc, (sdbyte *) args.db, (sdbyte *) args.user, (sdbyte *) args.password);log_text(LOG_DEBUG, "rc= %d",rc);usleep(1000);if (rc != DSQL_SUCCESS) {dpi_get_diag_rec(DSQL_HANDLE_DBC, dm_con->hdbc, 1, &err_code, err_msg, sizeof(err_msg), &msg_len);// log_text(LOG_DEBUG, "ERR dm_drv_reconnect fail - DM_%d_%s", err_code, err_msg);}else{// log_text(LOG_DEBUG, "SUC dm_drv_reconnect");break;}}return 0;
}

4.2 TPS计算逻辑

  • 每次会调用lua脚本的 event函数 函数执行玩了以后 会调用左边这个sb_event_stop函数
  • 这个函数里面 会根据线程号 总值+1

4.2 QPS计算逻辑

  1. dm提供的驱动中在dm_drv_prepare方法中使用get_stmt_type函数方法给stmt->counter属性赋值
  2. sysbench在执行execute方法时在进行取stmt->counter属性自增

4.3 mysql的重连逻辑

每次check_error的时候根据错误码判断类型 如果是CR_SERVER_LOST_EXTENDED 则 进行 reconnect的计数器+1 同时 执行重连函数

4.4 dpi的读写分离如何配置

dpi_set_con_attr(dm_con->hdbc, DSQL_ATTR_RWSEPARATE, DSQL_RWSEPARATE_ON, 0);
dpi_set_con_attr(dm_con->hdbc, DSQL_ATTR_RWSEPARATE_PERCENT, 25);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/887053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络】网络抓包与协议分析

网络抓包与协议分析 一. 以太网帧格式分析 这是以太网数据帧的基本格式&#xff0c;包含目的地址(6 Byte)、源地址(6 Byte)、类型(2 Byte)、数据(46~1500 Byte)、FCS(4 Byte)。 Mac 地址类型 分为单播地址、组播地址、广播地址。 单播地址&#xff1a;是指第一个字节的最低位…

日常工作笔记: python3 windows命令行 print中文报错

由于工作需要&#xff0c;近期在写python。在测试py文件时&#xff0c;发现了一个问题&#xff1a; 在cmd窗口打印中文会报错。使用try catch也捕获不到异常&#xff0c;十分烦恼&#xff01; print(中文) 网上搜索了各类解决方案&#xff0c;有在代码文件头加编码格式的&…

安宝特方案 | AR助力紧急救援,科技守卫生命每一刻!

在生死时速的紧急救援战场上&#xff0c;每一秒都至关重要&#xff01;随着科技的发展&#xff0c;增强现实&#xff08;AR&#xff09;技术正在逐步渗透到医疗健康领域&#xff0c;改变着传统的医疗服务模式。 安宝特AR远程协助解决方案&#xff0c;凭借其先进的技术支持和创新…

2025职业院校技能大赛信息安全管理与评估(河北省) 任务书

2025职业院校技能大赛信息安全管理与评估--河北省 任务书 模块一网络平台搭建与设备安全防护任务1&#xff1a;网络平台搭建 &#xff08;50分&#xff09;任务2&#xff1a;网络安全设备配置与防护&#xff08;250分&#xff09; 模块二网络安全事件响应、数字取证调查、应用程…

aws服务(二)机密数据存储

在AWS&#xff08;Amazon Web Services&#xff09;中存储机密数据时&#xff0c;安全性和合规性是最重要的考虑因素。AWS 提供了多个服务和工具&#xff0c;帮助用户确保数据的安全性、机密性以及合规性。以下是一些推荐的存储机密数据的AWS服务和最佳实践&#xff1a; 一、A…

vscode 远程连接ssh 密钥方式

目录 1. powershell 生成key&#xff1a; 2. 在服务器上安装公钥 3).为了确保连接成功&#xff0c;输入如下指令以保证以下文件权限正确&#xff1a; 3 开启 ssh 密钥登录 vscode 远程连接配置 python连接 python实现 1. powershell 生成key&#xff1a; 在命令行执行s…

C++:设计模式-单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一种设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并且提供全局访问点。实现单例模式的关键是防止类被多次实例化&#xff0c;且能够保证实例的唯一性。常见的实现手法包括懒汉式、饿汉式、线程安全的懒汉式等。…

《深入浅出HTTPS​​​​​​​​​》读书笔记(9):对称加密算法

在密码学中&#xff0c;用于数据加密的算法主要有两种&#xff0c;分别是对称加密算法&#xff08;Symmetric-key Algorithms&#xff09;和非对称加密算法&#xff08;Asymmetrical Cryptography&#xff09;。 对称加密算法一般是通过一个算法和一个密钥&#xff08;secret k…

【数据库入门】关系型数据库入门及SQL语句的编写

1.数据库的类型&#xff1a; 数据库分为网状数据库&#xff0c;层次数据库&#xff0c;关系型数据库和非关系型数据库四种。 目前市场上比较主流的是&#xff1a;关系型数据库和非关系型数据库。 关系型数据库使用结构化查询语句&#xff08;SQL&#xff09;对关系型数据库进行…

【通俗理解】ELBO(证据下界)——机器学习中的“情感纽带”

【通俗理解】ELBO&#xff08;证据下界&#xff09;——机器学习中的“情感纽带” 关键词提炼 #ELBO #证据下界 #变分推断 #机器学习 #潜变量模型 #KL散度 #期望 #对数似然 第一节&#xff1a;ELBO的类比与核心概念【尽可能通俗】 ELBO&#xff0c;即证据下界&#xff0c;在…

react后台管理系统(二)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;React篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容:react后台管理系统(二) 前言 本文档旨在详细说明如何在一个基于React的应用程序中实现左侧菜单…

【学习笔记】AD智能PDF导出(装配文件)

2.下一步“NEXT” 3.选择文件名称&#xff0c;下一步“NEXT” 4.可选导出原材料的BOM表 右键选择装配图“Create Assembly Drawings” 5.可以双击下图方框&#xff0c;或者右键需要编辑的标题&#xff0c;选择“Properties”&#xff0c;勾选如下图 6.装配文件&#xff0c;添加…

在win10环境部署opengauss数据库(包含各种可能遇到的问题解决)

适用于windows环境下通过docker desktop实现opengauss部署&#xff0c;请审题。 文章目录 前言一、部署适合deskdocker的环境二、安装opengauss数据库1.配置docker镜像源2.拉取镜像源 总结 前言 注意事项&#xff1a;后面docker拉取镜像源最好电脑有科学上网工具如果没有科学上…

如何构建高效的接口自动化测试框架?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在选择接口测试自动化框架时&#xff0c;需要根据团队的技术栈和项目需求来综合考虑。对于测试团队来说&#xff0c;使用Python相关的测试框架更为便捷。无论选…

AI Prompt Engineering

AI Prompt Engineering 简介 Prompt Engineering, 提示工程&#xff0c;是人工智能领域的一项技术&#xff0c;它旨在通过设计高效的提示词&#xff08;prompts&#xff09;来优化生成式 AI&#xff08;如 GPT、DALLE 等&#xff09;的输出。提示词是用户与生成式 AI 交互的核…

CSS给元素的四个角添加边框

Css给元素的四个角添加边框 实现一&#xff1a; <div class"border"></div> /*使用线性渐变背景表示 left top 表示左上角*/ .border{background:linear-gradient(to left, #04c886, #04c886) left top no-repeat,linear-gradient(to bottom, #04c886…

【bug】使用transformers训练二分类任务时,训练损失异常大

使用transformers训练二分类任务时&#xff0c;训练损失异常大 问题分析 问题 training_loss异常大&#xff0c;在二分类损失中&#xff0c;收敛在1~2附近&#xff0c;而eval_loss却正常&#xff08;小于0.5&#xff09; 分析 参考&#xff1a; Bug in gradient accumulation…

C 语言Day 01 学习总结

Day 01 学习总结 嵌入式学习的四个阶段 C语言 学习重点&#xff1a; C语言写代码的流程&#xff1a; 需求分析 - 确定程序目标。理清思路 - 明确实现步骤。代码编写 - 学习和使用 C 语言语法。调试 - 解决错误&#xff0c;验证功能。代码提交 - 学习版本控制工具&#xff08;Gi…

npm镜像查看和修改

在国内使用 npm 时&#xff0c;推荐修改 npm 的镜像源为国内的镜像站&#xff08;如淘宝 npm 镜像&#xff09;以提升安装速度。以下是修改 npm 镜像的步骤&#xff1a; 方法一&#xff1a;使用 npm 自带命令修改 查看当前的 npm 源&#xff1a; npm config get registry默认情…

基于SpringBoot实现的城镇保障性住房管理系统(代码+论文)

&#x1f389;博主介绍&#xff1a;Java领域优质创作者&#xff0c;阿里云博客专家&#xff0c;计算机毕设实战导师。专注Java项目实战、毕设定制/协助 &#x1f4e2;主要服务内容&#xff1a;选题定题、开题报告、任务书、程序开发、项目定制、论文辅导 &#x1f496;精彩专栏…