暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

go驱动连接opengauss配置多IP测试

原创 qi_yu 2023-06-25
557

主库 172.11.0.101
备库 172.11.0.102

  1. 配置完go环境
    image.png

  2. 设置环境变量

export GOPROXY=https://goproxy.io
export GO111MODULE=on
  1. 下载 https://gitee.com/opengauss/openGauss-connector-go-pq
    上传并解压
    或执行
go get gitee.com/opengauss/openGauss-connector-go-pq
  1. 清理模块中不需要的依赖项
go mod tidy
  1. 编译文件
cd /openGauss-connector-go-pq-master
go build -o multi_ip example/multi_ip/multi_ip.go
  1. multi_ip.go中添加连接信息
  • import模块添加
    _ “gitee.com/opengauss/openGauss-connector-go-pq”
    image.png
  • main函数添加
os.Setenv("DSN", "postgres://oguser:Cmbcinit123@172.11.0.101:5432,172.11.0.102:6432/postgres?"+
"sslmode=disable&loggerLevel=debug&target_session_attrs=read-write&connect_timeout=1")

image.png

user=oguser password=Cmbcinit123 host=172.11.0.101,172,11,0.102 port=5432,6432 dbname=postgres

参数说明:

  • sslmode
    启用SSL加密的方式:
    disable:不使用SSL安全连接。
    allow:如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。
    prefer:如果数据库支持,那么首选使用SSL安全加密连接,但不验证数据库服务器的真实性。
    require:必须使用SSL安全连接,但是只做了数据加密,而并不验证数据库服务器的真实性。
    verify-ca:必须使用SSL安全连接,当前windows odbc不支持cert方式认证。
    verify-full:必须使用SSL安全连接,当前windows odbc不支持cert方式认证。

  • target_session_attrs
    如果这个参数被设置为read-write,只有默认接受读写事务的连接才是可接受的。在任何成功的连接上将发出查询SHOW transaction_read_only,如果它返回on则连接将被关闭。如果在连接字符串中指定了多个主机,只要连接尝试失败就会尝试剩余的服务器。这个参数的默认值any认为所有连接都可接受。
    设定连接的主机的类型。主机的类型和设定的值一致时才能连接成功。target_session_attrs的设置规则如下:
    any(默认值):可以对所有类型的主机进行连接。
    read-write:当连接的主机允许可读可写时,才进行连接。
    read-only:仅对可读的主机进行连接。
    primary:仅对主备系统中的主机能进行连接。
    standby: 仅对主备系统中的备机进行连接。
    prefer-standby:首先尝试找到一个备机进行连接。如果对hosts列表的所有机器都连接失败,那么尝试“any”模式进行连接。
    连接字符中target_session_attrs参数暂时只能定义read-write(默认配置)

  • connect_timeout
    链接的最大等待时间,以秒计(用十进制整数字符串书写),0或者不声明表示无穷。不建议把链接超时的值设置得小于2秒。

multi_ip.go文件示例


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 (
	/*
		target_session_attrs 	--> Set the connection database properties
		connect_timeout			--> Set connect timeout. unit second
	*/
	dsnExample = `DSN="postgres://gaussdb:secret@foo,bar,baz/mydb?sslmode=disable&target_session_attrs=primary&connect_timeout=1"
DSN="postgres://gaussdb:secret@foo:1,bar:2,baz:3/mydb?sslmode=disable&target_session_attrs=primary&connect_timeout=1"
DSN="user=gaussdb password=secret host=foo,bar,baz port=5432 dbname=mydb sslmode=disable target_session_attrs=primary connect_timeout=1"
DSN="user=gaussdb password=secret host=foo,bar,baz port=5432,5432,5433 dbname=mydb sslmode=disable target_session_attrs=primary connect_timeout=1"`
)

func main() {
	os.Setenv("DSN", "postgres://oguser:Cmbcinit123@172.11.0.101:5432,172.11.0.102:6432/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(500 * time.Millisecond)
		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
	var sysdate string
	var pgIsInRecovery bool
	var nodeName string
	var version string
	err = db.QueryRow("select sysdate,pg_is_in_recovery(),version();").
		Scan(&sysdate, &pgIsInRecovery,&version)
	if err != nil {
		return err
	}
	var channel string
	fmt.Println(sysdate, nodeName, pgIsInRecovery, channel,version)
	return nil
}

  1. 运行go文件
go run multi_ip.go

image.png

此时连接的是101主库

主备切换后执行go文件
image.png

连接到新主库102上
image.png

最后修改时间:2023-06-30 15:16:24
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论