当前位置:   article > 正文

openGauss Cluster Manager RTO Test_jtpccterminal unexpected sqlexception on rollback

jtpccterminal unexpected sqlexception on rollback

目录

一、环境介绍

1. 软件环境

2. 硬件环境

3. 架构图

二、测试场景

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

2. BenchmarkSQL多IP连接测试RTO

3. 数据库端观测时间

总结


一、环境介绍

1. 软件环境

2. 硬件环境

主机CPU规格硬盘职责
node1Kunpeng-920虚拟机16c/64g通用型SSD主库
node2Kunpeng-920虚拟机16c/64g通用型SSD同步备库
go程序
node3Kunpeng-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程序代码
  1. [root@cloud001-0003 go]# cat 1.go
  2. // Copyright © 2021 Bin Liu <bin.liu@enmotech.com>
  3. package main
  4. import (
  5. "database/sql"
  6. "fmt"
  7. _ "gitee.com/opengauss/openGauss-connector-go-pq"
  8. "log"
  9. "os"
  10. "os/signal"
  11. "syscall"
  12. "time"
  13. )
  14. /*
  15. 需要有访问dbe_perf.global_instance_time的权限
  16. CREATE USER dbuser_monitor with login monadmin PASSWORD 'Mon@1234';
  17. grant usage on schema dbe_perf to dbuser_monitor;
  18. grant select on dbe_perf.global_instance_time to dbuser_monitor;
  19. CGO_ENABLED=0 GOOS=linux GOARCH=arm64
  20. */
  21. var (
  22. dsnExample = `DSN="postgres://gaussdb:secret@foo,bar,baz/mydb?sslmode=disable"
  23. DSN="postgres://gaussdb:secret@foo:1,bar:2,baz:3/mydb?sslmode=disable"
  24. DSN="user=gaussdb password=secret host=foo,bar,baz port=5432 dbname=mydb sslmode=disable"
  25. DSN="user=gaussdb password=secret host=foo,bar,baz port=5432,5432,5433 dbname=mydb sslmode=disable"`
  26. )
  27. func main() {
  28. os.Setenv("DSN", "postgres://gaussdb:Enmo12345@172.16.0.65:26000,172.16.0.202:26000,172.16.0.193:26000/postgres?"+
  29. "sslmode=disable&loggerLevel=debug&target_session_attrs=read-write")
  30. connStr := os.Getenv("DSN")
  31. if connStr == "" {
  32. fmt.Println("please define the env DSN. example:\n" + dsnExample)
  33. return
  34. }
  35. fmt.Println("DNS:", connStr)
  36. db, err := sql.Open("opengauss", connStr)
  37. if err != nil {
  38. log.Fatal(err)
  39. }
  40. var (
  41. newTimer = time.NewTicker(1 * time.Second)
  42. doClose = make(chan struct{}, 1)
  43. )
  44. go func() {
  45. for {
  46. select {
  47. case <-newTimer.C:
  48. if err := getNodeName(db); err != nil {
  49. fmt.Println(err)
  50. }
  51. case <-doClose:
  52. newTimer.Stop()
  53. return
  54. }
  55. }
  56. }()
  57. sigChan := make(chan os.Signal, 2)
  58. signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) //nolint:staticcheck
  59. defer signal.Stop(sigChan)
  60. <-sigChan
  61. doClose <- struct{}{}
  62. }
  63. func getNodeName(db *sql.DB) error {
  64. var err error
  65. // tx, err := db.Begin()
  66. // if err != nil {
  67. // return err
  68. // }
  69. // defer tx.Commit()
  70. var sysdate string
  71. var pgIsInRecovery bool
  72. var nodeName string
  73. err = db.QueryRow("select sysdate,pg_is_in_recovery();").
  74. Scan(&sysdate, &pgIsInRecovery)
  75. if err != nil {
  76. return err
  77. }
  78. var channel string
  79. // err = db.QueryRow("select channel from pg_stat_get_wal_senders() limit 1 ").
  80. // Scan(&channel)
  81. fmt.Println(sysdate, nodeName, pgIsInRecovery, channel)
  82. // if err != nil {
  83. // return err
  84. // }
  85. return nil
  86. }
  • 模拟数据库故障
[omm@cloud001-0002 data]$ mv db1/ db1.bak
  • go程序连接数据库及重连时间

  • 时间差
  1. 2022/04/11 16:02:13.614273 connector.go:222: info dialing server host 172.16.0.65 port 26000
  2. 2022/04/11 16:02:20.683716 connector.go:145: debug find instance host 172.16.0.202 port 26000
  3. RTO时间7s

2. BenchmarkSQL多IP连接测试RTO

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

BenchmarkSQL模拟负载及重连时间

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

3. 数据库端观测时间

  • 数据库日志

  • 时间差
  1. 2022-04-11 16:02:13.253 tid=1795056 StartAndStop ERROR: data path disc writable test failed, /opt/mogdb/data/data/db1.
  2. 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
  3. 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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/913555
推荐阅读
相关标签
  

闽ICP备14008679号