我在https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/ 处遵循了有关如何将 MySQL 部署为 statefulset 的官方演练

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

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

这是我的连接代码:

func NewMysqlClient() *sqlx.DB {//username:password@protocol(address)/dbname?param=valuedataSourceName := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true&multiStatements=true", username, password, host, schema,)log.Println(dataSourceName)var mysqlClient *sqlx.DBvar err errorconnected := falselog.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 等)中读取。如果无法连接到所有副本,您会如何建议我从从属读取并写入主控。

谢谢!