首页 > 其他分享 >openGauss Cluster Manager RTO Test

openGauss Cluster Manager RTO Test

时间:2024-03-25 10:46:42浏览次数:33  
标签:主库 err RTO DSN Cluster go Test openGauss

一、环境介绍

  1. 软件环境
    类别 版本 下载链接 备注
    OS openEuler 20.03 (LTS) https://repo.openeuler.org/openEuler-20.03-LTS/ISO/aarch64/openEuler-20.03-LTS-aarch64-dvd.iso 操作系统
    BenchmarkSQL 5.0 https://sourceforge.net/projects/benchmarksql/files/latest/download驱动版本:postgresql-9.3-1102.jdbc41.jar 模拟 TPCC 压力的程序驱动为程序自带的 pg 驱动
    Golang go1.18 linux/arm64 https://golang.google.cn/dl/go1.18.1.linux-arm64.tar.gz https://gitee.com/opengauss/openGauss-connector-go-pq/blob/master/example/multi_ip/multi_ip.go https://gitee.com/opengauss/openGauss-connector-go-pq/tags 模拟应用连接的程序
    openGauss 3.0.0 https://opengauss.obs.cn-south-1.myhuaweicloud.com/3.0.0/arm/openGauss-3.0.0-openEuler-64bit-all.tar.gz 数据库
  2. 硬件环境
    主机 CPU 规格 硬盘 职责
    node1 Kunpeng-920 虚拟机 16c/64g 通用型 SSD 主库
    node2 Kunpeng-920 虚拟机 16c/64g 通用型 SSD 同步备库
    go 程序
    node3 Kunpeng-920 虚拟机 16c/64g 通用型 SSD 异步备库 BenchmarkSQL 程序
  3. 架构图

二、测试场景

  1. go 程序多 IP 连接测试 RTO
    原理:CM 检测主库发生故障,不可访问时会自动选新主,go 驱动通过 target_session_attrs=read-write 控制只连主库,通过 SQL select sysdate,pg_is_in_recovery(); 查询结果时间戳查看 RTO

go 程序代码
[root@cloud001-0003 go]# cat 1.go
// Copyright © 2021 Bin Liu [email protected]

package main

import (
"database/sql"
"fmt"
_ "gitee.com/opengauss/openGauss-connector-go-pq"
"log"
"os"
"os/signal"
"syscall"
"time"
)

/*
需要有访问dbe_perf.global_instance_time的权限
CREATE USER dbuser_monitor with login monadmin PASSWORD 'Mon@1234';
grant usage on schema dbe_perf to dbuser_monitor;
grant select on dbe_perf.global_instance_time to dbuser_monitor;
CGO_ENABLED=0 GOOS=linux GOARCH=arm64
*/

var (
dsnExample = DSN="postgres://gaussdb:secret@foo,bar,baz/mydb?sslmode=disable" DSN="postgres://gaussdb:secret@foo:1,bar:2,baz:3/mydb?sslmode=disable" DSN="user=gaussdb password=***** host=foo,bar,baz port=5432 dbname=mydb sslmode=disable" DSN="user=gaussdb password=***** host=foo,bar,baz port=5432,5432,5433 dbname=mydb sslmode=disable"
)

func main() {
os.Setenv("DSN", "postgres://gaussdb:Enmo12345@...:26000,...:26000,...:26000/postgres?"+
"sslmode=disable&loggerLevel=debug&target_session_attrs=read-write")
connStr := os.Getenv("DSN")
if connStr == "" {
fmt.Println("please define the env DSN. example:\n" + dsnExample)
return
}
fmt.Println("DNS:", connStr)
db, err := sql.Open("opengauss", connStr)
if err != nil {
log.Fatal(err)
}
var (
newTimer = time.NewTicker(1 * time.Second)
doClose = make(chan struct{}, 1)
)

    go func() {
            for {
                    select {
                    case <-newTimer.C:
                            if err := getNodeName(db); err != nil {
                                    fmt.Println(err)
                            }
                    case <-doClose:
                            newTimer.Stop()
                            return
                    }
            }
    }()

    sigChan := make(chan os.Signal, 2)
    signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) //nolint:staticcheck
    defer signal.Stop(sigChan)
    <-sigChan
    doClose <- struct{}{}

}

func getNodeName(db *sql.DB) error {
var err error
// tx, err := db.Begin()
// if err != nil {
// return err
// }
// defer tx.Commit()
var sysdate string
var pgIsInRecovery bool
var nodeName string
err = db.QueryRow("select sysdate,pg_is_in_recovery();").
Scan(&sysdate, &pgIsInRecovery)
if err != nil {
return err
}
var channel string

    // err = db.QueryRow("select channel from pg_stat_get_wal_senders() limit 1 ").
    //      Scan(&channel)
    fmt.Println(sysdate, nodeName, pgIsInRecovery, channel)
    // if err != nil {
    //      return err
    // }
    return nil

}

模拟数据库故障
[omm@cloud001-0002 data]$ mv db1/ db1.bak
go 程序连接数据库及重连时间

时间差
2022/04/11 16:02:13.614273 connector.go:222: info dialing server host ... port 26000
2022/04/11 16:02:20.683716 connector.go:145: debug find instance host ... port 26000

RTO时间7s
2. BenchmarkSQL 多 IP 连接测试 RTO
原理:CM 检测主库发生故障,不可访问时会自动选新主,jdbc 驱动通过 target_session_type=master 控制只连主库,通过 SQL 程序执行时间戳查看 RTO

BenchmarkSQL 模拟负载及重连时间

时间差
16:02:13,561 [Thread-8] ERROR jTPCCTData : Unexpected SQLException in STOCK_LEVELsage: 153MB / 897MB
16:02:20,834 [Thread-57] FATAL jTPCCTerminal : Unexpected SQLException on rollback: This connection has been closed.

RTO时间7.273s
3. 数据库端观测时间
数据库日志

时间差
2022-04-11 16:02:13.253 tid=1795056 StartAndStop ERROR: data path disc writable test failed, /opt/mogdb/data/data/db1.
2022-04-11 16:02:20.438 tid=1815697 LOG: failover msg from cm_server, data_dir :/opt/mogdb/data/data/db1 nodetype is 2

RTO时间7.185s
总结
在有负载情况(tpcc 压测产生负载,数据库服务器 CPU 占用 50%左右)进行主库宕机测试,
以主库宕机为起始点,备库成功作为新主库启动成功为终止点 RTO 为 7.185s
以主库宕机为起始点,模拟 TPCC 压测的 benchmarkSQL 程序成功重新连接到新主库为终止点 RTO 为 7.273s
以主库宕机为起始点,模拟其它应用连接数据库的 go 程序成功重新连接到新主库为终止点 7s
由于 go 程序至精确到 s,猜测实际时间为 7.185s 以上
综上所述 openGauss Cluster Manager RTO 约为 7s 左右

标签:主库,err,RTO,DSN,Cluster,go,Test,openGauss
From: https://www.cnblogs.com/helloopenGauss/p/18093855

相关文章

  • AtCoder Beginner Contest 346 题解
    A-AdjacentProductQuestion给你\(N\)个整数\(A_1,A_2,\dots,A_N\)。同时,定义\(B_i=A_i\timesA_{i+1}\(1\leqi\leqN-1)\)按此顺序打印\(B_1,B_2,\dots,B_{N-1}\)Solution按照题意模拟Code#include<bits/stdc++.h>usingnamespacestd;intmain......
  • Weekly Contest 390
    ProblemA每个字符最多出现两次的最长子字符串思路双指针,使用一个数组记录每个字符的出现次数,当出现次数大于2时l往左收缩其余情况往右划代码classSolution{publicintmaximumLengthSubstring(Strings){intn=s.length();int[]cnt=newint......
  • test-md
    ThisisTitleThisisSubtitleThisissub-subtitleThisissub-sub-subtitleThisisaparagraph.italicbolditalicandbolddeleteinlineblock#pythoncodedeffoo():print("Hello")//javacodeclassMain{publicstaticvoidmain(......
  • test-md
    ThisisTitleThisisSubtitleThisissub-subtitleThisissub-sub-subtitleThisisaparagraph.italicbolditalicandbolddeleteinlineblock#pythoncodedeffoo():print("Hello")//javacodeclassMain{publicstaticvoidma......
  • LeetCode 1778. Shortest Path in a Hidden Grid
    原题链接在这里:https://leetcode.com/problems/shortest-path-in-a-hidden-grid/description/题目:Thisisan interactiveproblem.Thereisarobotinahiddengrid,andyouaretryingtogetitfromitsstartingcelltothetargetcellinthisgrid.Thegridiso......
  • AtCoder Beginner Contest 346
    AtCoderBeginnerContest346最刺激的一集。尝试挑战手速极限,用了57s做A。但是好像还是很慢。然后做B,仍然想挑战手速。结果一眼出思路只要把wbwbwwbwbwbw多重复几遍就可以代替「无限长」。很快就写完了。然后交了三发罚时。后来发现我复制若干遍wbwbwwbwbwbw的时候......
  • AtCoder Beginner Contest 346
    A-AdjacentProduct(abc346A)题目大意给定\(n\)个数,依次输出相邻俩数的乘积。解题思路按照题意模拟即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(false);cin.tie(0);c......
  • 在pycharm中运行程序时总是以tests方式运行
    ##问题描述前两天在使用python写机器学习的算法时,有一个程序一直以Pythontests的方式运行,并且一直运行失败,截图如下:解决方法到设置中:File->Settings->Tools->PythonintegratedTools文件->设置->工具->python集成工具->默认测试运行程序......
  • 【消息队列开发】 实现 VirtualHostTests 类——测试虚拟主机操作
    文章目录......
  • pytest教程-18-内置fixture
    领取资料,咨询答疑,请➕wei: June__Go上一小节我们学习了pytest运行上次失败用例的方法,本小节我们讲解一下pytest几种内置fixture的使用方法。pytest的开发者在pytest中包含了一些常用的Fixture。pytest预包装的Fixture可以帮助你在测试中轻松而一致地做一些非常有用的事情。......