[英]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.