一、环境介绍

  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 bin.liu@enmotech.com

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 左右

openGauss Cluster Manager RTO Test的更多相关文章

  1. Spark运行模式_spark自带cluster manager的standalone cluster模式(集群)

    这种运行模式和"Spark自带Cluster Manager的Standalone Client模式(集群)"还是有很大的区别的.使用如下命令执行应用程序(前提是已经启动了spar ...

  2. Service Fabric Cluster Manager

    作者:潘罡 (Van Pan)@ Microsoft 我们回到Service Fabric最底层的话题,谈谈Service Fabric是怎么工作的. 首先,我们回到下面的文档,看看Service F ...

  3. Spark运行模式_Spark自带Cluster Manager的Standalone Client模式(集群)

    终于说到了体现分布式计算价值的地方了! 和单机运行的模式不同,这里必须在执行应用程序前,先启动Spark的Master和Worker守护进程.不用启动Hadoop服务,除非你用到了HDFS的内容. 启 ...

  4. Redis Cluster架构优化

    Redis Cluster架构优化 在<全面剖析Redis Cluster原理和应用>中,我们已经详细剖析了现阶段Redis Cluster的缺点: 无中心化架构 Gossip消息的开销 ...

  5. SQL Server 2016 Failover Cluster + ALwaysOn

    SQL Server 2016 Failover Cluster + ALwaysOn 环境的搭建 近期公司为了提高服务的可用性,就想到了部署AlwaysOn,之前的环境只是部署了SQL Server ...

  6. <Spark><Running on a Cluster>

    Introduction 之前学习的时候都是通过使用spark-shell或者是在local模式运行spark 这边我们首先介绍Spark分布式应用的架构,然后讨论在分布式clusters中运行Spa ...

  7. Spark运行模式_基于YARN的Resource Manager的Client模式(集群)

    现在越来越多的场景,都是Spark跑在Hadoop集群中,所以为了做到资源能够均衡调度,会使用YARN来做为Spark的Cluster Manager,来为Spark的应用程序分配资源. 在执行Spa ...

  8. spark第三篇:Cluster Mode Overview 集群模式预览

    Spark applications run as independent sets of processes on a cluster, coordinated by the SparkContex ...

  9. The evolution of cluster scheduler architectures--转

    原文地址:http://www.firmament.io/blog/scheduler-architectures.html cluster schedulers are an important c ...

  10. Redis 5.0 redis-cli --cluster help说明

    背景: Redis Cluster 在5.0之后取消了ruby脚本 redis-trib.rb的支持(手动命令行添加集群的方式不变),集合到redis-cli里,避免了再安装ruby的相关环境.直接使 ...

随机推荐

  1. Java 线程通信的应用:经典例题:生产者/消费者问题

    1 package bytezero.threadcommunication; 2 3 /** 4 * 线程通信的应用:经典例题:生产者/消费者问题 5 * 6 * 7 * 8 * @author B ...

  2. 2、dubbo原理

    图例说明: 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口. 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖 ...

  3. Zabbix“专家坐诊”第192期问答汇总

    问题一 Q:请问下,客户机snmptrap发告警为啥server web收不到,关键是snmptrap日志已经收到,zabbix server配置以及开启snmptrap=1 snmptrap=var ...

  4. MYSQL 是如何保证binlog 和redo log同时提交的?

    MYSQL 一个事务在提交的时候能够保证binlog和redo log是同时提交的,并且能在宕机恢复后保持binlog 和redo log的一致性. 先来看看什么是redo log 和binlog,以 ...

  5. System.out.print重定向到文件实例

    该代码可以实现让System.out.print输出内容不再打印到控制台,而是输出到指定的文件中 <strong><span style="font-size:24px;& ...

  6. 应用层01-HTTP

    2.1 应用层协议原理 2.1.1 网络应用程序体系结构 研发网络应用的程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序. 例如: Web应用程序 客户:浏览器程序(进程) 服务:Web ...

  7. | [0/8] Installing jquery@3.x[npminstall:get] retry GET https://registry.npm.taobao.org/jwebdriver after 100ms, retry left 4, error: Error: certificate has expired ClientRequest.<anonymous>

    昨天用开源项目UIRecorder初始化时报错,查看日志发现是淘宝的源证书过期,如下: PS E:\20231213\uirecorder\uirecorder_test> PS E:\2023 ...

  8. 记录--h5调用手机摄像头踩坑

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 背景 一般业务也很少接触摄像头,有也是现成的工具库扫个二维码.难得用一次,记录下踩坑. 2.调用摄像头的方法 2.1. input ...

  9. 鸿蒙HarmonyOS实战-ArkTS语言(状态管理)

    前言 状态管理是指在应用程序中维护和更新应用程序状态的过程.在一个程序中,可能有很多不同的组件和模块,它们需要共享和相互作用的状态.如果没有一个明确的方式来管理这些状态,就会导致代码混乱.不易维护和难 ...

  10. Docker网络模型以及容器通信

    本篇接着上篇:[Docker0网络及原理探究],继续深入探究容器网络通信原理,通过学习Docker网路驱动模型,更好地解决容器间的通信问题 1.Docker的网络驱动模型 1.1.Docker的网络驱 ...