繁体   English   中英

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

[英]How to Connect Golang application to mysql statefulset in Kubernetes

我按照官方演练如何将 MySQL 部署为状态集 https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/

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

名为 mysql-read 的客户端服务是一个普通的服务,它有自己的集群 IP,它在所有报告就绪的 MySQL Pod 之间分配连接。 潜在端点集包括主 MySQL 服务器和所有副本。 请注意,只有读取查询才能使用负载平衡的客户端服务。 因为只有一个主 MySQL 服务器,客户端应该直接连接到主 MySQL Pod(通过其在无头服务中的 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作为主机名进行连接。

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

或者

您也可以使用尝试连接

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

选项-2

如果您只是连接特定的 POD 或编写副本,您可以使用

<pod-name>.mysql

Headless Service 为 StatefulSet controller 为集合中的每个 Pod 创建的 DNS 条目提供了一个主页。 因为 Headless Service 被命名为 mysql,所以 Pod 可以通过从同一 Kubernetes 集群和命名空间中的任何其他 Pod 中解析来访问。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM