阿里雲有獎體驗:用PolarDB-X搭建一個高可用系統

體驗簡介

場景將提供一台配置了CentOS 8.5作業系統和安裝部署PolarDB-X集群的ECS實例(雲伺服器)。通過本教程的操作,帶您體驗如何使用PolarDB-X搭建一個高可用系統,通過直接kill容器模擬節點故障,以觀察PolarDB-X 的自動恢復情況。立即前往

實驗準備

1. 創建實驗資源

開始實驗之前,您需要先創建ECS實例資源。

  1. 在實驗室頁面,單擊創建資源

  2. (可選)在實驗室頁面左側導航欄中,單擊雲產品資源列表,可查看本次實驗資源相關資訊(例如IP地址、用戶資訊等)。

說明:資源創建過程需要1~3分鐘。

2. 安裝環境

本步驟將指導您如何安裝Docker、kubectl、minikube和Helm3。

  1. 安裝Docker。

a.執行如下命令,安裝Docker。

curl -fsSL //get.docker.com | bash -s docker --mirror Aliyun

b.執行如下命令,啟動Docker。

systemctl start docker
  1. 安裝kubectl。

a.執行如下命令,下載kubectl文件。

curl -LO //storage.googleapis.com/kubernetes-release/release/$(curl -s //storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl

b.執行如下命令,賦予可執行許可權。

chmod +x ./kubectl

c.執行如下命令,移動到系統目錄。

mv ./kubectl /usr/local/bin/kubectl
  1. 安裝minikube。

執行如下命令,下載並安裝minikube。

curl -LO //storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
  1. 安裝Helm3。

a.執行如下命令,下載Helm3。

wget //labfileapp.oss-cn-hangzhou.aliyuncs.com/helm-v3.9.0-linux-amd64.tar.gz

b.執行如下命令,解壓Helm3。

tar -zxvf helm-v3.9.0-linux-amd64.tar.gz

c.執行如下命令,移動到系統目錄。

mv linux-amd64/helm /usr/local/bin/helm

5.安裝MySQL。

yum install mysql -y

3. 使用PolarDB-X Operator安裝PolarDB-X

本步驟將指導您如何創建一個簡單的Kubernetes集群並部署PolarDB-X Operator ,使用Operator部署一個完整的PolarDB-X集群,詳細文檔請參考通過Kubernetes安裝PolarDB-X

  1. 使用minikube創建Kubernetes集群。

minikube是由社區維護的用於快速創建Kubernetes測試集群的工具,適合測試和學習Kubernetes。使用minikube創建的Kubernetes集群可以運行在容器或是虛擬機中,本實驗場景以CentOS 8.5上創建Kubernetes為例。

說明:如果您使用其他作業系統部署minikube,例如macOS或Windows,部分步驟可能略有不同。

a.執行如下命令,新建帳號galaxykube,並將galaxykube加入docker組中。minikube要求使用非root帳號進行部署,所有您需要新建一個帳號。

useradd -ms /bin/bash galaxykube
usermod -aG docker galaxykube

b.執行如下命令,切換到帳號galaxykube。

su galaxykube

c.執行如下命令,進入到home/galaxykube目錄。

cd

d.執行如下命令,啟動一個minikube。

說明:這裡我們使用了阿里雲的minikube鏡像源以及USTC提供的docker鏡像源來加速鏡像的拉取。

minikube start --cpus 4 --memory 12288 --image-mirror-country cn --registry-mirror=//docker.mirrors.sjtug.sjtu.edu.cn --kubernetes-version 1.23.3

返回結果如下,表示minikube已經正常運行,minikube將自動設置kubectl的配置文件。

e.執行如下命令,使用kubectl查看集群資訊。

kubectl cluster-info

返回如下結果,您可以查看到集群相關資訊。

  1. 部署 PolarDB-X Operator。

a.執行如下命令,創建一個名為polardbx-operator-system的命名空間。

kubectl create namespace polardbx-operator-system

b.執行如下命令,安裝PolarDB-X Operator。

helm repo add polardbx //polardbx-charts.oss-cn-beijing.aliyuncs.com
helm install --namespace polardbx-operator-system polardbx-operator polardbx/polardbx-operator

c.執行如下命令,查看PolarDB-X Operator組件的運行情況。

kubectl get pods --namespace polardbx-operator-system

返回結果如下,請您耐心等待2分鐘,等待所有組件都進入Running狀態,表示PolarDB-X Operator已經安裝完成。

  1. 部署 PolarDB-X 集群。

a.執行如下命令,創建polardb-x.yaml。

vim polardb-x.yaml

b.按i鍵進入編輯模式,將如下程式碼複製到文件中,然後按ECS退出編輯模式,輸入:wq後按下Enter鍵保存並退出。

apiVersion: polardbx.aliyun.com/v1
kind: PolarDBXCluster
metadata:
  name: polardb-x
spec:
  config:
    dn:
      mycnfOverwrite: |-
        print_gtid_info_during_recovery=1
        gtid_mode = ON
        enforce-gtid-consistency = 1
        recovery_apply_binlog=on
        slave_exec_mode=SMART
  topology:
    nodes:
      cdc:
        replicas: 1
        template:
          resources:
            limits:
              cpu: "1"
              memory: 1Gi
            requests:
              cpu: 100m
              memory: 500Mi
      cn:
        replicas: 2
        template:
          resources:
            limits:
              cpu: "2"
              memory: 4Gi
            requests:
              cpu: 100m
              memory: 1Gi
      dn:
        replicas: 1
        template:
          engine: galaxy
          hostNetwork: true
          resources:
            limits:
              cpu: "2"
              memory: 4Gi
            requests:
              cpu: 100m
              memory: 500Mi
      gms:
        template:
          engine: galaxy
          hostNetwork: true
          resources:
            limits:
              cpu: "1"
              memory: 1Gi
            requests:
              cpu: 100m
              memory: 500Mi
          serviceType: ClusterIP
  upgradeStrategy: RollingUpgrade

c.執行如下命令,創建PolarDB-X集群。

kubectl apply -f polardb-x.yaml

d.執行如下命令,查看PolarDB-X集群創建狀態。

kubectl get polardbxCluster polardb-x -o wide -w

返回結果如下,請您耐心等待七分鐘左右,當PHASE顯示為Running時,表示PolarDB-X集群已經部署完成。

e.按Ctrl+C鍵,退出查看PolarDB-X集群創建狀態。

4. 連接PolarDB-X集群

本步驟將指導您如何連接通過K8s部署的PolarDB-X集群。

  1. 執行如下命令,查看PolarDB-X集群登錄密碼。
kubectl get secret polardb-x -o jsonpath="{.data['polardbx_root']}" | base64 -d - | xargs echo "Password: "

返回結果如下,您可以查看到PolarDB-X集群登錄密碼。

  1. 執行如下命令,將PolarDB-X集群埠轉發到3306埠。

說明:使用MySQL Client方式登錄通過k8s部署的PolarDB-X集群前,您需要進行獲取PolarDB-X集群登錄密碼和埠轉發。

kubectl port-forward svc/polardb-x 3306
  1. 在實驗頁面,單擊右上角的圖標,創建新的終端二。

  1. 執行如下命令,連接PolarDB-X集群。

說明:

  • 您需要將<PolarDB-X集群登錄密碼>替換為實際獲取到的PolarDB-X集群登錄密碼。

  • 如遇到mysql: [Warning] Using a password on the command line interface can be insecure.ERROR 2013 (HY000): Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0報錯,請您稍等一分鐘,重新轉發埠並連接PolarDB-X集群即可。

mysql -h127.0.0.1 -P3306 -upolardbx_root -p<PolarDB-X集群登錄密碼>

5. 啟動業務

本步驟將指導您如何使用Sysbench OLTP場景模擬業務流量。

  1. 準備壓測數據。

    1. 執行如下SQL語句,創建壓測資料庫sysbench_test。
create database sysbench_test;
  1. 輸入exit退出資料庫。

  1. 執行如下命令,切換到帳號galaxykube。
su galaxykube
  1. 執行如下命令,進入到/home/galaxykube目錄。
cd
  1. 執行如下命令,創建準備壓測數據的sysbench-prepare.yaml文件。
vim sysbench-prepare.yaml
  1. 按i鍵進入編輯模式,將如下程式碼複製到文件中,然後按ECS退出編輯模式,輸入:wq後按下Enter鍵保存並退出。
apiVersion: batch/v1
kind: Job
metadata:
  name: sysbench-prepare-data-test
  namespace: default
spec:
  backoffLimit: 0
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: sysbench-prepare
          image: severalnines/sysbench
          env:
            - name: POLARDB_X_USER
              value: polardbx_root
            - name: POLARDB_X_PASSWD
              valueFrom:
                secretKeyRef:
                  name: polardb-x
                  key: polardbx_root
          command: [ 'sysbench' ]
          args:
            - --db-driver=mysql
            - --mysql-host=$(POLARDB_X_SERVICE_HOST)
            - --mysql-port=$(POLARDB_X_SERVICE_PORT)
            - --mysql-user=$(POLARDB_X_USER)
            - --mysql_password=$(POLARDB_X_PASSWD)
            - --mysql-db=sysbench_test
            - --mysql-table-engine=innodb
            - --rand-init=on
            - --max-requests=1
            - --oltp-tables-count=1
            - --report-interval=5
            - --oltp-table-size=160000
            - --oltp_skip_trx=on
            - --oltp_auto_inc=off
            - --oltp_secondary
            - --oltp_range_size=5
            - --mysql_table_options=dbpartition by hash(`id`)
            - --num-threads=1
            - --time=3600
            - /usr/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua
            - run
  1. 執行如下命令,運行準備壓測數據的sysbench-prepare.yaml文件,初始化測試數據。
kubectl apply -f sysbench-prepare.yaml
  1. 執行如下命令,獲取任務進行狀態。
kubectl get jobs

返回結果如下,請您耐心等待大約1分鐘,當任務狀態COMPLETIONS為1/1時,表示數據已經初始化完成。

  1. 啟動壓測流量。

    1. 執行如下命令,創建啟動壓測的sysbench-oltp.yaml文件。
vim sysbench-oltp.yaml
  1. 按i鍵進入編輯模式,將如下程式碼複製到文件中,然後按ECS退出編輯模式,輸入:wq後按下Enter鍵保存並退出。
apiVersion: batch/v1
kind: Job
metadata:
  name: sysbench-oltp-test
  namespace: default
spec:
  backoffLimit: 0
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: sysbench-oltp
          image: severalnines/sysbench
          env:
            - name: POLARDB_X_USER
              value: polardbx_root
            - name: POLARDB_X_PASSWD
              valueFrom:
                secretKeyRef:
                  name: polardb-x
                  key: polardbx_root
          command: [ 'sysbench' ]
          args:
            - --db-driver=mysql
            - --mysql-host=$(POLARDB_X_SERVICE_HOST)
            - --mysql-port=$(POLARDB_X_SERVICE_PORT)
            - --mysql-user=$(POLARDB_X_USER)
            - --mysql_password=$(POLARDB_X_PASSWD)
            - --mysql-db=sysbench_test
            - --mysql-table-engine=innodb
            - --rand-init=on
            - --max-requests=0
            - --oltp-tables-count=1
            - --report-interval=5
            - --oltp-table-size=160000
            - --oltp_skip_trx=on
            - --oltp_auto_inc=off
            - --oltp_secondary
            - --oltp_range_size=5
            - --mysql-ignore-errors=all
            - --num-threads=8
            - --time=3600
            - /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua
            - run
  1. 執行如下命令,運行啟動壓測的sysbench-oltp.yaml文件,開始壓測。
kubectl apply -f sysbench-oltp.yaml
  1. 執行如下命令,查找壓測腳本運行的POD。
kubectl get pods

返回結果如下, 以『sysbench-oltp-test-』開頭的POD即為目標POD。

  1. 執行如下命令,查看QPS等流量數據。

說明:您需要將命令中的目標POD替換為以『sysbench-oltp-test-』開頭的POD。

kubectl logs -f 目標POD

6. 體驗PolarDB-X高可用能力

經過前面的準備工作,我們已經用PolarDB-X+Sysbench OLTP搭建了一個正在運行的業務系統。本步驟將指導您通過使用kill POD的方式,模擬物理機宕機、斷網等導致的節點不可用場景,並觀察業務QPS的變化情況。

  1. 在實驗頁面,單擊右上角的圖標,創建新的終端三。

  1. kill CN。

    1. 執行如下命令,切換到帳號galaxykube。
su galaxykube
  1. 執行如下命令,獲取CN POD的名字。
kubectl get pods

返回結果如下,以『polardb-x-xxxx-cn-default』開頭的是CN POD的名字。

  1. 執行如下命令,刪除任意一個CN POD。說明:您需要將命令中的替換為任意一個以『polardb-x-xxxx-cn-default』開頭的CN POD的名字。
kubectl delete pod <CN POD>
  1. 執行如下命令,查看CN POD自動創建情況。
kubectl get pods

返回結果如下,您可查看到CN POD已經處於自動創建中。

經過幾十秒後,被kill的CN POD自動恢復正常。

  1. 切換至終端二,您可查看kill CN之後業務QPS的情況。

  1. kill DN。

    1. 切換至終端三,執行如下命令,獲取DN POD的名字。
kubectl get pods

返回結果如下,以『polardb-x-xxxx-dn』開頭的是DN POD的名字。

  1. 執行如下命令,刪除任意一個DN POD。

說明:

  • 您需要將命令中的替換為任意一個以『polardb-x-xxxx-dn』開頭的DN POD的名字。

  • DN每個邏輯節點為三副本架構,也就是說一個DN節點對應3個POD,可任意選擇一個進行刪除操作。此外,GMS節點是一個特殊角色的DN,同樣具備高可用能力,可選擇任一POD進行刪除。

kubectl delete pod <DN POD>
  1. 執行如下命令,查看DN POD自動創建情況。
kubectl get pods

返回結果如下,您可查看到DN POD已經處於自動創建中。

經過幾十秒後,被kill的DN POD自動恢復正常。

  1. 切換至終端二,您可查看kill DN之後業務QPS的情況。

  1. kill CDC。

    1. 切換至終端三,執行如下命令,獲取CDC POD的名字。
kubectl get pods

返回結果如下,以『polardb-x-xxxx-cdc-defaul』開頭的是CDC POD的名字。

  1. 執行如下命令,刪除任意一個CDC POD。

說明:您需要將命令中的替換為任意一個以『polardb-x-xxxx-cdc-defaul』開頭的CDC POD的名字。

kubectl delete pod <CDC POD>
  1. 執行如下命令,查看CDC POD自動創建情況。
kubectl get pods

返回結果如下,您可查看到CDC POD已經處於自動創建中。

經過幾十秒後,被kill的CDC POD自動恢復正常。

  1. 切換至終端二,您可查看kill CDC之後業務QPS的情況。

7. 了解更多

如果您想了解更多有關PolarDB-X高可用知識,詳情請參見如下內容。

恭喜完成