在ARM平台部署PolarDB-X

作者: Ju4t

学到什么

  • 如何在ARM平台部署PolarDB-X。
  • 如何使用Sysbench模拟业务流量。
$ uname -a

Linux iZbp1gjcq5giipy5jzde7aZ 5.10.134-12.2.al8.aarch64 #1 SMP Thu Oct 27 02:19:04 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux

# aarch64

环境

# 安装 docker

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

systemctl start docker


# 安装 kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/arm64/kubectl

chmod +x ./kubectl

mv ./kubectl /usr/local/bin/kubectl

# 安装 minikube

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64
sudo install minikube-linux-arm64 /usr/local/bin/minikube

# 安装 helm3
wget https://labfileapp.oss-cn-hangzhou.aliyuncs.com/PolarDB-X/helm-v3.5.1-linux-arm64.tar.gz

tar -zxvf helm-v3.5.1-linux-arm64.tar.gz

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

# 安装 mysql

yum install -y mysql

非arm则 将arm64 换成 amd64,helm 到 https://github.com/helm/helm/releases 下载对应版本

安装 PolarDB-x

# 新建账号galaxykube,并将galaxykube加入docker组中。minikube要求使用非root账号进行部署,所以您需要新建一个账号。

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

su galaxykube

cd

# 安装
minikube start --cpus 4 --memory 12288 --nodes=2 --image-mirror-country cn --registry-mirror=https://docker.mirrors.sjtug.sjtu.edu.cn --kubernetes-version 1.23.3

# 查看集群状态
kubectl cluster-info

# 部署 PolarDB-X Operator
kubectl create namespace polardbx-operator-system
helm repo add polardbx https://polardbx-charts.oss-cn-beijing.aliyuncs.com
helm install --namespace polardbx-operator-system polardbx-operator polardbx/polardbx-operator

kubectl get pods --namespace polardbx-operator-system

# 部署 PolarDB-X 集群
vim polardb-x.yaml

apiVersion: polardbx.aliyun.com/v1
kind: PolarDBXCluster
metadata:
  name: polardb-x
spec:
  topology:
    nodes:
      cdc:
        replicas: 1
        template:
          resources:
            limits:
              cpu: "1"
              memory: 1Gi
            requests:
              cpu: 100m
              memory: 500Mi
      cn:
        replicas: 1
        template:
          resources:
            limits:
              cpu: "2"
              memory: 4Gi
            requests:
              cpu: 100m
              memory: 1Gi
      dn:
        replicas: 1
        template:
          engine: galaxy
          resources:
            limits:
              cpu: "2"
              memory: 4Gi
            requests:
              cpu: 100m
              memory: 500Mi
      gms:
        template:
          engine: galaxy
          resources:
            limits:
              cpu: "1"
              memory: 1Gi
            requests:
              cpu: 100m
              memory: 500Mi

kubectl apply -f polardb-x.yaml

kubectl get polardbxCluster polardb-x -o wide -w

连接PolarDB-X 集群

# 查看密码
kubectl get secret polardb-x -o jsonpath="{.data['polardbx_root']}" | base64 -d - | xargs echo "Password: "

# 转发端口
kubectl port-forward svc/polardb-x 3306

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

启动业务

create database sysbench_test;

su galaxykube

cd


vim sysbench-prepare.yaml


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: minirplus/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

kubectl apply -f sysbench-prepare.yaml

kubectl get jobs

vim sysbench-oltp.yaml


apiVersion: batch/v1
kind: Job
metadata:
  name: sysbench-oltp-test
  namespace: default
spec:
  backoffLimit: 0
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: sysbench-oltp
          image: minirplus/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=32
            - --time=3600
            - /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua
            - run

kubectl apply -f sysbench-oltp.yaml

kubectl get pods

kubectl logs -f 目标POD

结果

[galaxykube@iZbp1gjcq5giipy5jzde7aZ ~]$ kubectl logs -f sysbench-oltp-test-vl86b
WARNING: --num-threads is deprecated, use --threads instead
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options:
Number of threads: 32
Report intermediate results every 5 second(s)
Initializing random number generator from current time


Initializing worker threads...

Threads started!

[ 5s ] thds: 32 tps: 16.99 qps: 373.49 (r/w/o: 300.91/71.98/0.60) lat (ms,95%): 3208.88 err/s: 0.00 reconn/s: 0.00
[ 10s ] thds: 32 tps: 55.40 qps: 989.86 (r/w/o: 769.45/220.41/0.00) lat (ms,95%): 831.46 err/s: 0.00 reconn/s: 0.00
[ 15s ] thds: 32 tps: 62.80 qps: 1127.83 (r/w/o: 877.43/250.41/0.00) lat (ms,95%): 669.89 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 32 tps: 83.80 qps: 1521.20 (r/w/o: 1184.00/337.00/0.20) lat (ms,95%): 520.62 err/s: 0.00 reconn/s: 0.00
[ 25s ] thds: 32 tps: 82.20 qps: 1483.12 (r/w/o: 1157.54/324.98/0.60) lat (ms,95%): 549.52 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 32 tps: 92.80 qps: 1657.84 (r/w/o: 1286.83/370.81/0.20) lat (ms,95%): 502.20 err/s: 0.00 reconn/s: 0.00
[ 35s ] thds: 32 tps: 102.00 qps: 1860.43 (r/w/o: 1443.42/416.21/0.80) lat (ms,95%): 419.45 err/s: 0.00 reconn/s: 0.00
[ 40s ] thds: 32 tps: 104.40 qps: 1867.20 (r/w/o: 1455.00/412.00/0.20) lat (ms,95%): 404.61 err/s: 0.00 reconn/s: 0.00
[ 45s ] thds: 32 tps: 107.60 qps: 1945.43 (r/w/o: 1513.82/430.81/0.80) lat (ms,95%): 467.30 err/s: 0.00 reconn/s: 0.00
[ 50s ] thds: 32 tps: 116.20 qps: 2085.41 (r/w/o: 1621.81/463.20/0.40) lat (ms,95%): 356.70 err/s: 0.00 reconn/s: 0.00
[ 55s ] thds: 32 tps: 106.00 qps: 1901.77 (r/w/o: 1479.78/421.79/0.20) lat (ms,95%): 450.77 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 32 tps: 115.20 qps: 2071.83 (r/w/o: 1612.02/459.41/0.40) lat (ms,95%): 369.77 err/s: 0.00 reconn/s: 0.00
[ 65s ] thds: 32 tps: 116.00 qps: 2107.41 (r/w/o: 1639.00/467.60/0.80) lat (ms,95%): 344.08 err/s: 0.00 reconn/s: 0.00
[ 70s ] thds: 32 tps: 106.20 qps: 1893.80 (r/w/o: 1470.80/422.20/0.80) lat (ms,95%): 411.96 err/s: 0.00 reconn/s: 0.00
[ 75s ] thds: 32 tps: 112.20 qps: 1998.96 (r/w/o: 1552.37/445.79/0.80) lat (ms,95%): 404.61 err/s: 0.00 reconn/s: 0.00
[ 80s ] thds: 32 tps: 113.40 qps: 2049.22 (r/w/o: 1595.02/453.80/0.40) lat (ms,95%): 344.08 err/s: 0.00 reconn/s: 0.00
[ 85s ] thds: 32 tps: 100.80 qps: 1823.82 (r/w/o: 1420.21/402.40/1.20) lat (ms,95%): 404.61 err/s: 0.00 reconn/s: 0.00
[ 90s ] thds: 32 tps: 114.18 qps: 2054.59 (r/w/o: 1595.88/457.71/1.00) lat (ms,95%): 369.77 err/s: 0.00 reconn/s: 0.00