0

阿里云有奖体验:用PolarDB-X搭建一个高可用系统 - 阿里云云起实验室

 1 year ago
source link: https://www.cnblogs.com/bainana/p/16442058.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

体验简介

场景将提供一台配置了CentOS 8.5操作系统和安装部署PolarDB-X集群的ECS实例(云服务器)。通过本教程的操作,带您体验如何使用PolarDB-X搭建一个高可用系统,通过直接kill容器模拟节点故障,以观察PolarDB-X 的自动恢复情况。立即前往

up-6aa5e3f2995ed70ba27fb3b1660483fb9b0.jpg

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的配置文件。

up-d5f649412b88f765fad4935ea534a709422.png

e.执行如下命令,使用kubectl查看集群信息。

kubectl cluster-info

返回如下结果,您可以查看到集群相关信息。

up-778a80d943921c1a3f843dc8867c6bf2fbf.png

  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已经安装完成。

up-0a7f5a05a9e8491402f86c69533b4173b24.png

  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集群已经部署完成。

up-33db821e0a87a939856077bad0cbc2041cf.png

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集群登录密码。

up-1af163ec948a93d0b07bd9fe9504f2bf70a.png

  1. 执行如下命令,将PolarDB-X集群端口转发到3306端口。

说明:使用MySQL Client方式登录通过k8s部署的PolarDB-X集群前,您需要进行获取PolarDB-X集群登录密码和端口转发。

kubectl port-forward svc/polardb-x 3306
  1. 在实验页面,单击右上角的ec75663aa0204147aa642d96343647b6.png图标,创建新的终端二。

up-c7df07db8e1e1a496be0b90480e603d3b00.png

  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退出数据库。

up-1f0238ec1ba80f1f9de96300cf5b01eba37.png

  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时,表示数据已经初始化完成。

up-63ee4870a38e80c1dcb0d26de2417d6e3da.png

  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。

up-9a9fb7c91d671be794f4b7f197508e12998.png
  1. 执行如下命令,查看QPS等流量数据。

说明:您需要将命令中的目标POD替换为以‘sysbench-oltp-test-’开头的POD。

kubectl logs -f 目标POD

6. 体验PolarDB-X高可用能力

经过前面的准备工作,我们已经用PolarDB-X+Sysbench OLTP搭建了一个正在运行的业务系统。本步骤将指导您通过使用kill POD的方式,模拟物理机宕机、断网等导致的节点不可用场景,并观察业务QPS的变化情况。

  1. 在实验页面,单击右上角的fd8f9871eff543b087e964fde60d87b3.png图标,创建新的终端三。

up-e9a43aeb2c3bd3da7b7e5e08773b30e302f.png

  1. kill CN。

    1. 执行如下命令,切换到账号galaxykube。
su galaxykube
  1. 执行如下命令,获取CN POD的名字。
kubectl get pods

返回结果如下,以‘polardb-x-xxxx-cn-default’开头的是CN POD的名字。

up-34027842b7c322de6db6b64e43d78025359.png
  1. 执行如下命令,删除任意一个CN POD。说明:您需要将命令中的替换为任意一个以‘polardb-x-xxxx-cn-default’开头的CN POD的名字。
kubectl delete pod <CN POD>
  1. 执行如下命令,查看CN POD自动创建情况。
kubectl get pods

返回结果如下,您可查看到CN POD已经处于自动创建中。

up-f672527988298fb71919fe335feb0d6ec28.png

经过几十秒后,被kill的CN POD自动恢复正常。

up-f00e7e9bcff8150e9fbe5e1c01c1943d48b.png
  1. 切换至终端二,您可查看kill CN之后业务QPS的情况。
up-25efd0a4d81ac7b0009e4e3c923cdfbffb4.png
  1. kill DN。

    1. 切换至终端三,执行如下命令,获取DN POD的名字。
kubectl get pods

返回结果如下,以‘polardb-x-xxxx-dn’开头的是DN POD的名字。

up-c133b4a943d0d815ec6266c2f6581cd46a5.png
  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已经处于自动创建中。

up-65ef2d12b85aa7b173fad0fd82df818006b.png

经过几十秒后,被kill的DN POD自动恢复正常。

up-4d011be8a8c2ef230acc7a47e9a791d5bc6.png
  1. 切换至终端二,您可查看kill DN之后业务QPS的情况。

up-3db891d58952cba5b33f6097891135e8db4.png

  1. kill CDC。

    1. 切换至终端三,执行如下命令,获取CDC POD的名字。
kubectl get pods

返回结果如下,以‘polardb-x-xxxx-cdc-defaul’开头的是CDC POD的名字。

up-6019b6db562112d27730a55e8df5738488f.png
  1. 执行如下命令,删除任意一个CDC POD。

说明:您需要将命令中的替换为任意一个以‘polardb-x-xxxx-cdc-defaul’开头的CDC POD的名字。

kubectl delete pod <CDC POD>
  1. 执行如下命令,查看CDC POD自动创建情况。
kubectl get pods

返回结果如下,您可查看到CDC POD已经处于自动创建中。

up-9b7159b8849d013a9d95ca89983078df115.png

经过几十秒后,被kill的CDC POD自动恢复正常。

up-f9f99934027697e816de0664ef47d237a99.png
  1. 切换至终端二,您可查看kill CDC之后业务QPS的情况。
up-6efded55995dc2af98867aa89afed9c68fd.png

7. 了解更多

如果您想了解更多有关PolarDB-X高可用知识,详情请参见如下内容。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK