簡體   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