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 = 30

function connect_db()
    local retry_count = 0
    local max_retries = MAX_RETRIES or 5 

    while retry_count < max_retries do
        local status, err = pcall(function()
            con = drv:connect()
        end)

        -- 如果连接成功,跳出循环
        if status then
            print("Database connection established.")
            return
        else
            retry_count = retry_count + 1
            print(string.format("Connection failed: %s. Retrying %d/%d...", err, retry_count, max_retries))

	        os.execute("sleep 1")
        end
    end

    -- 如果达到最大重试次数,抛出错误
    error("Failed to connect to the database after multiple retries.")
end



-- 断开连接函数
function disconnect_db()
    if con then
        con:disconnect()
        con = nil
        print("Database connection closed.")
    end
end

function sysbench.hooks.before_connect()
    connect_db()
end

function 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)
    end

    return 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)
end

function 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) then
     i = 0
else
    -- Convert a uint32_t value to SQL INT
    i = sysbench.rand.unique() - 2147483648
end

execute_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.ini

SWITCHOVER

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);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高性能linux服务器运维实战小结 性能调优工具

性能指标 进程指标 进程关系 父进程创子进程时&#xff0c;调fork系统调用。调用时&#xff0c;父给子获取一个进程描述符&#xff0c;并设置新的pid&#xff0c;同事复制父进程的进程描述符给子进程&#xff0c;此时不会复制父进程地址空间&#xff0c;而是父子用相同地址空…

pcb元器件选型与焊接测试时的一些个人经验

元件选型 在嘉立创生成bom表&#xff0c;对照bom表买 1、买电容时有50V或者100V是它的耐压值&#xff0c;注意耐压值 2、在买1117等降压芯片时注意它降压后的固定输出&#xff0c;有那种可调降压比如如下&#xff0c;别买错了 贴片元件焊接 我建议先薄薄的在引脚上涂上锡膏…

【zookeeper03】消息队列与微服务之zookeeper集群部署

ZooKeeper 集群部署 1.ZooKeeper 集群介绍 ZooKeeper集群用于解决单点和单机性能及数据高可用等问题。 集群结构 Zookeeper集群基于Master/Slave的模型 处于主要地位负责处理写操作)的主机称为Leader节点&#xff0c;处于次要地位主要负责处理读操作的主机称为 follower 节点…

C 语言复习总结记录三

C 语言复习总结记录三 一 函数的定义 维基百科中对函数的定义&#xff1a;子程序 在计算机科学中&#xff0c;子程序&#xff08;英语&#xff1a;Subroutine, procedure, function, routine, method, subprogram, callable unit&#xff09;&#xff0c;是一个大型程序中的…

MYSQL——多表设计以及数据库中三种关系模型

大致介绍数据库中三种关系模型 一对多&#xff08;1:N&#xff09; 定义&#xff1a; 一个实体可以与另一个实体的多个实例相关联&#xff0c;而后者只能与前者的一个实例相关联。 例子&#xff1a; 学生和课程的关系。 学生&#xff08;1&#xff09;&#xff1a;每个学生…

OpenCV和Qt坐标系不一致问题

“ OpenCV和QT坐标系导致绘图精度下降问题。” OpenCV和Qt常用的坐标系都是笛卡尔坐标系&#xff0c;但是细微处有些不同。 01 — OpenCV坐标系 OpenCV是图像处理库&#xff0c;是以图像像素为一个坐标位置&#xff0c;即一个像素对应一个坐标&#xff0c;所以其坐标系也叫图像…

实验四:构建园区网(OSPF 动态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验步骤 1、在 eNSP 中部署网络 2、设计全网 IP 地址 3、配置二层交换机 4、配置路由交换机并测试通信 5、配置路由接口地址 6、配置 OSPF 动态路由&#xff0c;实现全网互通 一、实验简介 使用路由…

《剖析 Spring 原理:深入源码的旅程(二)》

六、Spring 的 Bean 注入与装配 Spring 的 Bean 注入与装配的方式有很多种&#xff0c;可以通过 xml、get set 方式、构造函数或者注解等。简单易用的方式就是使用 Spring 的注解&#xff0c;Spring 提供了大量的注解方式&#xff0c;如 Autowired、Qualifier 等。Spring 还支持…

Java文件上传解压

目录结构 工具类 枚举 定义文件类型 public enum FileType {// 未知UNKNOWN,// 压缩文件ZIP, RAR, _7Z, TAR, GZ, TAR_GZ, BZ2, TAR_BZ2,// 位图文件BMP, PNG, JPG, JPEG,// 矢量图文件SVG,// 影音文件AVI, MP4, MP3, AAR, OGG, WAV, WAVE}为了避免文件被修改后缀&#xff0…

CSRF保护--laravel进阶篇

laravel对csrf非常重视&#xff0c;专门针对csrf作出了很多的保护。如果您是刚刚接触laravel的路由不久&#xff0c;那么您可能对于web.php路由文件的post请求很疑惑&#xff0c;因为get请求很顺利&#xff0c;而post请求则可能会遭遇失败。其中一个失败的原因是由于laravel的c…

jupyter notebook的 markdown相关技巧

目录 1 先选择为markdown类型 2 开关技巧 2.1 运行markdown 2.2 退出markdown显示效果 2.3 注意点&#xff1a;一定要 先选择为markdown类型 3 一些设置技巧 3.1 数学公式 3.2 制表 3.3 目录和列表 3.4 设置各种字体效果&#xff1a;加粗&#xff0c;斜体&#x…

【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本

GRAPH ATTENTION NETWORKS 代码详解 前言0.引言1. 环境配置2. 代码的运行2.1 报错处理2.2 运行结果展示 3.总结 前言 在前文中&#xff0c;我们已经深入探讨了图卷积神经网络和图注意力网络的理论基础。还没看的同学点这里补习下。接下来&#xff0c;将开启一个新的阶段&#…

redis工程实战介绍(含面试题)

文章目录 redis单线程VS多线程面试题**redis是多线程还是单线程,为什么是单线程****聊聊redis的多线程特性和IO多路复用****io多路复用模型****redis如此快的原因** BigKey大批量插入数据测试数据key面试题海量数据里查询某一固定前缀的key如果生产上限值keys * &#xff0c;fl…

神经网络问题之二:梯度爆炸(Gradient Explosion)

梯度爆炸&#xff08;Gradient Explosion&#xff09;是神经网络训练过程中常见的一个问题&#xff0c;它指的是在反向传播过程中&#xff0c;梯度值变得非常大&#xff0c;超出了网络的处理范围&#xff0c;从而导致权重更新变得不稳定甚至不收敛的现象。 一、产生原因 梯度爆…

小杨的N字矩阵c++

题目描述 小杨想要构造一个m*m 的 N 字矩阵&#xff08; m为奇数&#xff09;&#xff0c;这个矩阵的从左上角到右下角的对角线、第1 列和第m 列都 是半角加号 &#xff0c;其余都是半角减号 - 。例如&#xff0c;一个 5*5 的 N 字矩阵如下&#xff1a; --- -- -- -- --- 请…

2024 年企业中的生成式 AI 现状

2024: The State of Generative AI in the Enterprise - Menlo Ventures 企业 AI 格局正在被实时改写。随着试点&#xff08;Pilot&#xff09;让位于生产&#xff08;Production&#xff09;&#xff0c;我们对 600 名美国企业 IT 决策者进行了调查&#xff0c;以揭示新出现的…

Ubuntu24虚拟机-gnome-boxes

推荐使用gnome-boxes&#xff0c; virtualbox构建失败&#xff0c;multipass需要开启防火墙 sudo apt install gnome-boxes创建完毕&#xff5e;

Haystack 的开源开发 LLM 应用设计框架

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

leetcode 919.完全二叉树插入器

1.题目要求: 完全二叉树 是每一层&#xff08;除最后一层外&#xff09;都是完全填充&#xff08;即&#xff0c;节点数达到最大&#xff09;的&#xff0c;并且所有的节点都尽可能地集中在左侧。设计一种算法&#xff0c;将一个新节点插入到一棵完全二叉树中&#xff0c;并在…

提升性能测试效率与准确性:深入解析JMeter中的各类定时器

在软件性能测试领域&#xff0c;Apache JMeter是一款广泛使用的开源工具&#xff0c;它允许开发者模拟大量用户对应用程序进行并发访问&#xff0c;从而评估系统的性能和稳定性。在进行性能测试时&#xff0c;合理地设置请求之间的延迟时间对于模拟真实用户行为、避免服务器过载…