主库 172.11.0.101
备库 172.11.0.102
-
配置完go环境

-
设置环境变量
export GOPROXY=https://goproxy.io
export GO111MODULE=on
- 下载 https://gitee.com/opengauss/openGauss-connector-go-pq
上传并解压
或执行
go get gitee.com/opengauss/openGauss-connector-go-pq
- 清理模块中不需要的依赖项
go mod tidy
- 编译文件
cd /openGauss-connector-go-pq-master
go build -o multi_ip example/multi_ip/multi_ip.go
- multi_ip.go中添加连接信息
- import模块添加
_ “gitee.com/opengauss/openGauss-connector-go-pq”

- 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")

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
}
- 运行go文件
go run multi_ip.go

此时连接的是101主库
主备切换后执行go文件

连接到新主库102上





