我遵循了關于如何在此處將 MySQL 部署為 statefulset 的官方演練https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/
我已經啟動并運行良好,但指南說:
稱為 mysql-read 的客戶端服務是一個普通的服務,它有自己的集群 IP,它在所有報告就緒的 MySQL Pod 之間分配連接。潛在端點集包括主 MySQL 服務器和所有副本。請注意,只有讀取查詢才能使用負載平衡的客戶端服務。因為只有一個主 MySQL 服務器,客戶端應該直接連接到主 MySQL Pod(通過它在 Headless 服務中的 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 等)讀取。如果無法連接到所有副本,你會怎么做建議我從奴隸讀取并寫入主人。
謝謝!
uj5u.com熱心網友回復:
您必須使用服務名稱從 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 控制器為屬于該集合的每個 Pod 創建的 DNS 條目提供了一個 home。因為 Headless Service 被命名為 mysql,所以 Pod 可以通過從同一個 Kubernetes 集群和命名空間中的任何其他 Pod 中決議 .mysql 來訪問。
uj5u.com熱心網友回復:
另一種合適的方法可能是您的應用程式代碼忽略主實體、副本實體等,并像連接到單個主實體一樣運行,并且讀取、寫入查詢拆分在功能強大的代理中被抽象出來。該代理負責將寫入查詢路由到主實體并將讀取查詢路由到副本實體。示例代理 - https://proxysql.com/
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/401728.html
標籤:mysql 去 Kubernetes 迷你酷 kubernetes-statefulset
上一篇:KEDA-沒有Pod正在擴展
