天天看點

容器化 | 在 Kubernetes 上部署 RadonDB MySQL 叢集容器化 | 在 Kubernetes 上部署 RadonDB MySQL 叢集

容器化 | 在 Kubernetes 上部署 RadonDB MySQL 叢集

RadonDB MySQL 是一款基于 MySQL 的開源、高可用、雲原生叢集解決方案。支援一主多從高可用架構,并具備安全、自動備份、監控告警、自動擴容等全套管理功能。目前已經在生産環境中大規模的使用,包含銀行、保險、傳統大企業等。

RadonDB MySQL Kubernetes 支援在 Kubernetes 上安裝部署和管理,自動執行與運作 RadonDB MySQL 叢集有關的任務。

本教程主要示範如何使用 Git 和 Repo 指令行兩種方式在 Kubernetes 上部署 RadonDB MySQL 叢集。

部署準備

已準備可用 Kubernetes 叢集。

方式一:通過 Git 部署

執行如下指令,将 RadonDB MySQL Chart 克隆到 Kubernetes 中。

$ git clone https://github.com/radondb/radondb-mysql-kubernetes.git
           

在 radondb-mysql-kubernetes 目錄路徑下,選擇如下方式,部署 release 執行個體。

release 是運作在 Kubernetes 叢集中的 Chart 的執行個體。通過指令方式部署,需指定 release 名稱。

以下指令指定 release 名為

demo

,将建立一個名為

demo-radondb-mysql

的有狀态副本集。

  • 預設部署方式
<For Helm v3>
 cd charts/helm
 helm install demo .
           
  • 指定參數部署方式

helm install

時使用

--set key=value[,key=value]

,可指定參數部署。

以建立一個标準使用者,且建立指定可通路資料庫為例。使用者名為

my-user

、密碼為

my-password

、授權資料庫為

my-database

cd charts/helm
helm install demo \
 --set mysql.mysqlUser=my-user,mysql.mysqlPassword=my-password,mysql.database=my-database .
           
  • 配置 yaml 參數方式

執行如下指令,可通過 value.yaml 配置檔案,在安裝時指定參數配置。

cd charts/helm
helm install demo -f values.yaml .
           

方式二:通過 repo 部署

添加并更新 helm 倉庫。

$ helm repo add test https://charts.kubesphere.io/test
$ helm repo update
           

以下指令指定 release 名為

demo

,将建立一個名為

demo-radondb-mysql

的有狀态副本集。

$ helm install demo test/radondb-mysql
NAME: demo
LAST DEPLOYED: Wed Apr 28 08:08:15 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The cluster is comprised of 3 pods: 1 leader and 2 followers. Each instance is accessible within the cluster through:
    <pod-name>.demo-radondb-mysql
To connect to your database:
1. Get mysql user `qingcloud`s password:
    kubectl get secret -n default demo-radondb-mysql -o jsonpath="{.data.mysql-password}" | base64 --decode; echo
2. Run an Ubuntu pod that you can use as a client:
    kubectl run ubuntu -n default --image=ubuntu:focal -it --rm --restart='Never' -- bash -il
3. Install the mysql client:
    apt-get update && apt-get install mysql-client -y
4. To connect to leader service in the Ubuntu pod:
    mysql -h demo-radondb-mysql-leader -u qingcloud -p
5. To connect to follower service (read-only) in the Ubuntu pod:
    mysql -h demo-radondb-mysql-follower -u qingcloud -p    
           

部署校驗

叢集建立成功後,預設将建立一個有狀态副本集(StatefulSet ),以及三個用于通路節點的服務。

以預設部署為例,可擷取如下資源資訊,則叢集部署成功。

$ kubectl get statefulset,svc
NAME                                  READY   AGE
statefulset.apps/demo-radondb-mysql   3/3     45m
NAME                                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/demo-radondb-mysql            ClusterIP   None            <none>        3306/TCP   45m
service/demo-radondb-mysql-follower   ClusterIP   10.96.84.254    <none>        3306/TCP   45m
service/demo-radondb-mysql-leader     ClusterIP   10.96.178.195   <none>        3306/TCP   45m
           

連接配接 RadonDB MySQL

您需要準備一個用于連接配接 MySQL 的用戶端。

與用戶端在同一 NameSpace 中

當用戶端與 RadonDB MySQL 叢集在同一個 NameSpace 中時,可使用 leader/follower service 名稱代替具體的 IP 和端口。

  • 連接配接主節點 (讀寫節點)。
$ mysql -h <leader service 名稱> -u <使用者名> -p
使用者名為 `radondb_mysql`,release 名為 `demo` ,連接配接示例如下:
$ mysql -h demo-radondb-mysql-leader -u radondb_mysql -p
           
  • 連接配接從節點 (隻讀節點)。
$ mysql -h <follower service 名稱> -u <使用者名> -p
           

使用者名為

radondb_mysql

,release 名為

demo

,連接配接示例如下:

$ mysql -h demo-radondb-mysql-follower -u qradondb_mysql-p  
           

與用戶端不在同一 NameSpace 中

當用戶端與 RadonDB MySQL 叢集不在同一個 NameSpace 中時,可以通過 podIP 或服務 ClusterIP 來連接配接對應節點。

  • 查詢 pod 清單和服務清單,分别擷取需要連接配接的節點所在的 pod 名稱或對應的服務名稱。
$ kubectl get pod,svc
           
  • 檢視 pod / 服務的詳細資訊,擷取對應的 IP。
$ kubectl describe pod <pod 名稱>
$ kubectl describe svc <服務名稱>
           
注意:pod 重新開機後 pod IP 會更新,每次重新開機後需重新擷取 pod IP。
  • 連接配接節點。
$ mysql -h <pod IP/服務 ClusterIP> -u <使用者名> -p
           

使用者名為

radondb_mysql

,pod IP 為

10.10.128.136

,連接配接示例如下:

$ mysql -h 10.10.128.136 -u radondb_mysql -p
           

持久化

MySQL 鏡像在容器路徑

/var/lib/mysql

中存儲 MySQL 資料和配置。

預設情況下,會建立一個 PVC 并将其挂載到指定目錄中。 若想禁用此功能,您可以更改

values.yaml

禁用持久化,改用 emptyDir。

  • PVC 中可以使用不同特性的持久卷(PersistentVolume,PV),其 I/O 性能會影響資料庫的初始化性能。是以當使用 PVC 啟用持久化存儲時,可能需要調整

    livenessProbe.initialDelaySeconds

    的值。
  • 資料庫初始化的預設限制是 60 秒 (

    livenessProbe.initialDelaySeconds

    +

    livenessProbe.periodSeconds

    *

    livenessProbe.failureThreshold

    )。如果初始化時間超過限制,kubelet 将重新開機資料庫容器,資料庫初始化被中斷,會導緻持久資料不可用。

自定義 MySQL 配置

configFiles:
   node.cnf: |
    [mysqld]
    default_storage_engine=InnoDB
    max_connections=65535
    
    # custom mysql configuration.
    expire_logs_days=7