![](/img/trans.png)
[英]How to connect my application to 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.