openGauss Cluster Manager RTO Test

目录

一、环境介绍

1. 软件环境

2. 硬件环境

3. 架构图

二、测试场景

1. go程序多IP连接测试RTO

2. BenchmarkSQL多IP连接测试RTO

3. 数据库端观测时间

总结

 


 

一、环境介绍

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 Download BenchmarkSQL from SourceForge.net
驱动版本: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 
example/multi_ip/multi_ip.go · openGauss/openGauss-connector-go-pq - Gitee.com 
openGauss-connector-go-pq 标签 - Gitee.com
模拟应用连接的程序
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=secret host=foo,bar,baz port=5432 dbname=mydb sslmode=disable"
DSN="user=gaussdb password=secret host=foo,bar,baz port=5432,5432,5433 dbname=mydb sslmode=disable"`
)

func main() {
 os.Setenv("DSN", "postgres://gaussdb:Enmo12345@172.16.0.65:26000,172.16.0.202:26000,172.16.0.193: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 172.16.0.65 port 26000 
2022/04/11 16:02:20.683716 connector.go:145: debug find instance host 172.16.0.202 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左右

作者:lihongda

优秀的个人博客,低调大师

微信关注我们

原文链接:https://my.oschina.net/gaussdb/blog/5987507

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。