如何将Golang应用程序连接到Kubernetes中的mysql statefulset



我在这里完成了关于如何将MySQL部署为状态集的官方演练https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/

我已经启动并运行良好,但指南上说:

客户端服务,称为mysql-read,是一种普通的服务,具有自己的集群IP,可以在所有报告已就绪的mysql Pod之间分发连接。潜在端点集包括主MySQL服务器和所有副本。请注意,只有读取查询才能使用负载平衡的客户端服务。因为只有一个主MySQL服务器,所以客户端应该直接连接到主MySQL Pod(通过其在Headless Service中的DNS条目(以执行写入。

这是我的连接代码:

func NewMysqlClient() *sqlx.DB {
//username:password@protocol(address)/dbname?param=value
dataSourceName := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true&multiStatements=true",
username, password, host, schema,
)
log.Println(dataSourceName)
var mysqlClient *sqlx.DB
var err error
connected := false
log.Println("trying to connect to db")
for i:=0; i<7; i++{
mysqlClient, err = sqlx.Connect("mysql", dataSourceName)
if err == nil {
connected = true
break
} else {
log.Println(err)
log.Println("failed will try again in 30 secs!")
time.Sleep(30*time.Second)
}
}
if (!connected){
log.Println(err)
log.Println("Couldn't connect to db will exit")
os.Exit(1)
}
log.Println("database successfully configured")
return mysqlClient

}

当我将应用程序连接到无头MySQL服务时,我得到:

Error 1290: The MySQL server is running with the --super-read-only option so it cannot execute this statement"

我猜它正在连接到一个从属副本,当我连接到mysql-0.mysql主机时,一切都很好,这就是主节点所期望的。

我的问题是,当我们只连接到主节点时,我的应用程序如何能够从从属节点读取数据,因为应用程序需要能够写入数据。

我试着使用mysql-0.mysql,mysql-1.mysql,mysql-2.mysql,但后来我得到了:

dial tcp: lookup mysql-0.mysql;mysql-1.mysql,mysql-2.mysql: no such host

所以我想知道是否有办法将三个副本连接在一起,这样我们就可以像mongo等其他数据库一样向主数据库写入并从中读取。如果没有办法连接到所有副本,你会建议我如何从从属服务器读取并向主服务器写入。

谢谢!

您必须使用服务名称连接Go应用程序中的MySQL

所以你的流量像

Go应用POD在与集装箱内的POD相同的K8s集群内运行

向MySQL服务发送请求->MySQL服务将流量转发到MySQL有状态集(POD或其他合并副本(

因此,如果您已经创建了服务,那么主机名将是服务名:mysql

例如,您可以参考以下内容:https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/

如果您注意到WordPress是如何连接mysql

containers:
- image: wordpress:4.8-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql

它使用MySQL服务名称wordpress-mysql作为主机名进行连接。

如果您只想连接ReadReplica,您可以使用服务名称mysql-read

你也可以使用尝试连接

kubectl run mysql-client --image=mysql:5.7 -i --rm --restart=Never -- mysql -h mysql-0.mysql

选项-2

如果你只是想连接特定的POD或写一个复制品,你可以使用

<pod-name>.mysql

无头服务为StatefulSet控制器为作为集合一部分的每个Pod创建。因为Headless Service的名称是mysql,所以Pods是可以访问的通过从相同的任何其他Pod中解析.mysqlKubernetes集群和命名空间。

另一种合适的方法是,应用程序代码忽略主实例、副本实例等,并像连接到单个主实例一样操作,读写查询拆分在一个有能力的代理中抽象。该代理负责将写查询路由到主实例,将读查询路由到副本实例。代理示例-https://proxysql.com/

最新更新