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

2022-07-04 12:00:57

體驗簡介

場景將提供一臺設定了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 https://get.docker.com | bash -s docker --mirror Aliyun

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

systemctl start docker
  1. 安裝kubectl。

a.執行如下命令,下載kubectl檔案。

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://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 https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
  1. 安裝Helm3。

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

wget https://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=https://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 https://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高可用知識,詳情請參見如下內容。

恭喜完成