开发者学堂课程【如何对 PolarDB-X集群做动态扩缩容:如何对 PolarDB-X 集群做动态扩缩容】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/985/detail/14935
如何对 PolarDB-X 集群做动态扩缩容
内容介绍:
一、动手实践系列介绍
二、环境准备
三、演示内容
一、动手实践系列介绍
首先是 PolarDB-X 的社区版也就是开源的版本使用过程中按照场景化的方式进行介绍,社区版对应的是阿里云上商业2.0版本,它所面向的群体站在使用的视角是应用开发者、架构师、 DBA 或者是 DevOps 、SRE、学生等等。主要内容围绕PolarDB-X使用的全过程场景化介绍。
按照使用 PolarDB-X 的整个过程当中,一开始会有一个安装部署,安装部署完之后开始去连接它,比如连接池怎么配置,然后会有一个数据的导入,导入之后就可能进行一个业务来测试,业务使用一段时间之后,可能会有扩缩容,这就是本节课要讲的扩缩容的 topic 后续还会讲如何做用 online 方式做 DDL ,还有可能会有些慢查询怎么定位它们怎么解决它们以及后续的一些比如数据不小心被误删了,通过什么样的方式来把它们找回等等。后续的 topic 会根据具体的情况来做一个增加或者调整。
二、环境准备
1、系统
CentOS 7、8
macOS
Ubuntu 18、20、21、22
Windows 10+
2、配置
>= 4C8G
3、环境
Docker&K8S
PolarDB-X Release-20220127
PolarDB-X 于1月27日发布新版,新增读写能力、集群扩缩容能力,同时支持 debezium 和 maxwell 增量订阅。
首先得有一个系统,系统是Linux也行是 mac 也可以,Windows测试的比较少理论上也可以。配置的话最好是稍微高一点,留给 PolarDB-X 测试的配置要大于 4C8G ,本次实践需要系统当中已经有 Docker&K8S 它是基于 PolarDB-X 刚发出的最新的版本,就是说这里会插播一个广告,PolarDB-X 于年前发了一个新的版本,新的版本里面新增加了两个比较重要的能力,第一个是读写分离,第二个是集群的扩缩容,原来的版本是没有扩缩容能力的,现在最新的版本里面已经支持扩缩容,同时也支持了 debezium 和 maxwell 的增量订阅的工具。
PolarDB-X 逻辑的架构图:
有四个重要的组成部分,第一个是跟应用端直接交互的称之为计算节点,也叫做 CN,它会负责处理发过来的 SQL 解析、分布式的计算等等。第二个节点是DN,如果出去 mysql 可以简单粗暴地把这个 DN 看成是 mysql 只不过是经过深度定制的 mysql 。第三个是GMS ,GMS 是源数据中心或者存储 information schema信息,同时也会部署全局时间的一个颁发,还有其他的一些功能等等,这是一个全局的中心的一个点,它其实也是一个 DN 也就是 mysql 也可以理解成扮演了特殊角色的 mysql 。最后一个是 CDC 组件,也是全局的增量日志生成的组件,这个组件会把系统当中所有产生的增加日志也就是物理电路进行一个汇聚以及处理,最终生成一个全局的有序的与 mysql 完全兼容的这样一个增长日志,下游的一些系统就可以跟它进行无缝的对接,比如刚才提到的 debezium、Maxwell 、dts、canal 等等可以进行无缝的对接。这是 PolarDB-X 系统的架构,因为在架构里面 CN、DN 都具备了水平扩展能力,所以当系统的容量说不足的时候,可以通过简单的来增加 CN 和 DN 这样的资源来对信息系统达到扩容的一个目的。
三、演示内容
1、PolarDB-X 水平扩展 Demo
在转账测试场景下进行动态扩容(CN+DN)
第一个是 PolarDB-X 的水平扩展会做一个演示,这里写的是转账测试场景后来稍微调整一下,改成就是用 Sysbench 来做压测,比如对 PolarDB-X 集群上面的业务流量就是压测的流量,在有压测流量的场景下面对它进行一个动态的添加了计算键存储键 CN 和 DN 。来观察整个资源从一开始添加到千亿添加的过程以及添加的完成之后压测流量的变化过程,一个好的预期是整个压测不受影响,并且增加新的资源之后压测的数据变得更好,所以这是期望的结果。
Demo 用的是阿里云上面购买的 ECS 里面装了一个one two 20的系统。
(1)首先登陆上去
free6om@free6om ~> ssh polardb-x-demo
Welcome to Ubuntu 20.04.3 LTS(GNU/Linux 5.4.0-91-generic x86_64)
*Documentation: https://help.ubuntu.com
*Management: https:///landscape.canonical.com
*Support: https://ubuntu.com/advantage
Welcome to Alibaba Cloud Elastic Compute Service!
Last login: Fri Feb 11 15:13:18 2022 from 42120.75.252 Welcome to fish the friendly interactive shell
Type help`for instructions on how to use fish
adminepolardb-x-demo ~>alias kubecti_~minikube kubectl --”
adminepolardb-x-demo ~>
PolarDB-X 的 K8S 集群搭建在 github 的仓库里面有一些文档的说明,首先仓库地址是 galaxyku 的一个仓库,其实是 PolarDB-X 的一个kuberest operator。
RWADME.md 有一个文档,用中文的文档来进行一个展示。
中文文档里面点开之后会有一个快速部署。这个文章首先教大家怎么样在本机或者在远程的一台机器上面快速的用 K8S 拉起一个 PolarDB-X 集群。展示一下集群如何进行扩容,所以依然是 follow 文档,这个文档推荐大家用 minikube 来建一个 Kubernetes 集群,下面去启动 PolarDB-X 集群也就是部署一个 PolarDB-X 集群。
快速上手
本文介绍了如何创建一个简单的Kubernetes集群,部署 PolarDB-XOperator,并使用operator部署一个完整的 PolarDB-X集群。
注:本文中的部署说明仅用于测试目的。不要直接用于生产环境。本文主要包含以下内容:
1.创建 Kubernetes 测试集群
2.部署 PolarDB-X Operator
3. 部署 PolarDB-X 集群
4.连接 PolarDB-X 集群
5.销毁 PolarDB-X 集群
6.知载 PolarDB-X Operator
创建 Kubernetes测试集群
本节主要介绍如何使用 minikube 创建 Kubernetes 测试集群,您也可以使用阿里云的容器服务 ACK 来创建一个 Kubernetes 集群。并遵循教程部署 PolarDB-X Operator 和 PolarDB-X 集群。
使用 minikube 创建 Kubernetes 集群
minikube 是由社区维护的用于快速创建 Kubernetes 测试集群的工具,适合测试和学习 Kubernetes。使用minikube 创建的 Kubernetes 集群可以运行在容器或是虚拟机中,本节中以 CentOS 8.2 上创建 Kubernetes 为例。
注:如在其他操作系统例如 macOS 或 Windows 上部署 minikube,部分步强可能略有不同。
部署前,请确保已经安装 minikube 和 Docker,并符合以下要求:
·机器规格不小于 4c8g· minikube >= 1.18.0·docker >= 1.19.3
minikube 要求使用非root 账号进行部署,如果你试用root 账号访问机器,需要新建一个账号。
$ useradd -as /bin/bash galaxykube$ usernod -aG docker galaxykube
如果你使用其他账号,请和上面一样将它加入 docker 组中,以确保它能够直接访问 docker。
使用su 切换到账号 galaxykube,
$ su galaxykube
执行下面的命令启动一个minikube,
minikube start--cpus4 -nemory 7960 --inage-mirror-country cn --registry-mirrorshttps://docker,mirrors.ustc.edu.cn
注:这里我们使用了阿里云的minikube 镜像源以及USTC提供的 docker 镜像源来加速镜像的拉取。
如果一切运行正常,你将会看到类似下面的输出。
minikube v1.23.2 on Centos 8.2.2004 (and64)
Using the docker driver based on existing profile
Your cgroup does not allow setting memary.
*More information :https://docs.docker.com /engine/install/ Linux-postinstall/#your-kernel-does-nat Your Fgroup does not allow setting memory.
*More information :https://docs.docker.com/engine/install /linux-postinstall/*your-kernel- Starting control plane node minikube in cluster minikube Pulling base inage ...
docker "minikube" container is missing, will recreate. Creating docker container (CPUs=4, Memary=796eMB) ...
>kubeadm.sha256:64 8/648[-- -】100.0e%2p/s es
>kubelet.sha256:648/6481- 】1ee.eex7p/ses
>kubectl.sha256:64 B/64B[-- ]100.00x7 p/s es
>kubeadm:43.71 MiB / 43.71 MiB [-____】100.0041.01 MiB p/s 44s>kubectl:44.73 MiB / 44.73 MiB [-______ ---】 10e.00% 910.41 KiB p/s 51s>kubelet:146.25 M1B /146.25 M18[-__]100.00\2.71 Mi8 p/s 54s
. Generating certificates and keys .... Booting up control plane ....Configuring RBAC rules...
Verifying Kubernetes components...
*Using image reaistry.cn-hangzhou.aliyuncs.com/googlecon tainers/storace-provisioner:v5 (alobal inage repository)
Enabled addons:storage-provisioner.default-storaceclass
kubectl not found. If you need it, try: "minikube kubectl - get pods -A"
Done! kubectl is now configured to use "minikube" cluster and “default” namespace by default
此时 minikube 已经正常运行。minikube 将自动设置 kubectl 的配置文件,如果之前已经安装过 kubectl,现在可以使用 kubectl 来访问集群:
$ kubectl cluster-info kubectl cluster-info
Kubernetes control plane is running athttps://192.1 68.49.2:8443
CareDNS is running at
https://192.168.49.2:8443/api/v1
/namespaces/kube-system/services/kube-dns:dns/proxy
To furthzr debug and diagnose cluster problens, use "kubectl cluster-infe dump".
如果没有安装kubectl 的,minikube也提供了子命令来使用kubectl:
$ minikube kubectl - cluster-info
Kubernetes control plane is running athttps://192.168.49.2:8443
CareDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use "kubectl cluster-info dump'.
注意:miniloube kubectl 子命令需要在 kubectl 的参数前加"--”,如使用 bash shell 可以用 alias kubectl="minikube kubectl -*来设置快捷指令,下文都将使用 kubect 命令进行操作。
现在我们可以开始部署PolarDB-X Operator了!测试完成后,执行 minikube delete 来销毁集群。
部署PolarDB-XOperator
开始之前,请确保满足以下前置要求:
。已经准备了一个运行中的 Kubenetes 集群,并确保
。集群版本>= 1.18.0
。至少有2个可分配的CPU。至少有 4GB 的可分配内存至少有30GB 以上的磁盘空间
。已经安装了 kubectl 可以访问 Kubernetes集群。已经安装了Helm 3
首先创建一个叫 polardbx-operator-systen的命名空间。
$ kubectl create nanespace polardbx-operator-systen
执行以下命令安装PolarDB-X Operator
$ helm install --nanespace polardbx-operator-systen polardbx-operater
https://github.com/Apsara0B/galaxykube/releases/de
期望看到如下输出:
NAME:polardbx-operator
LAST DEPLOYED: Sun 0ct 17 15:17:29 2021 NAMESPACEpolardbx-operator-systen STATUS:deployed REVISTON:1
TEST SUITE: None NOTES:
polardbx-operator is installed. Please check the status of components:
kubectl get pods --namespace polardbx-operater-systen
Now have fun with your first PolarDe-X cluster.
Here's the manifest for quick start:
.**yant
apiversion:polardbx.aliyun.con/v1
kind:PolarDBXCluster netadata:
name: quick-start annotations:
polardbx/topology-mode-guide: quick-start
查看PolarDB-XOperator组件的运行情况,等待它们都进入Running 状态:
$ kubecti get pods -namespace polardbx-operator-systen
NAME READY STATUS RESTARTS AGE
polardbx-hpfs-d44zd polardbx-controller-nanager-6c858fc5b9-zrhx91/11/1 Running Running66s
66g
polardbx-tools-updater-459lc 1/1 Running 66s
恭喜!PolarDB-XOperator已经安装完成,现在可以开始部署PolarDB-X集群了!
部署 PolarDB-X集群
是把 yarm 的配置文件发给了 kubectl ,kubectl 会创建出一个叫做 quick-start 的集群。
现在我们来快速部署一个PolarDB-X集群。它包含1个GMS 节点、1个CN节点、1个DN节点和1个CDC节点。执行以下命令创建一个这样的集群:
echo "apiVersion:polardbx.aliyun.com/v1 kind:PolarDBXClus ter metadata:
name:quick-start annotations:
polardbx/topology-node-quide: quick-start”i kubectl apply -f -
你将看到以下输出:
polardbxcluster.polardbx.aliyun.com/quick-start created
使用如下命令查看创建状态:
$ kubectl get polardbxcluster-
NAME GHS ON ON CDC PHASE DISK AGE
quick-start 0/1 0/1 0/1 0/1 Creating 35s 93s
quick-start 1/1 8/1 1/1 1/1 e/1 Creating
quick-start 1/1 8/1 1/1 Creating 4n43s
quick-start 1/1 1/1 1/1 1/1 Running 2.4 G1B 4m44s
当 PHASE 显示为Running 时,PolarDB-X 集育已经规要完成!热喜化,现在可以开始连接并体验 PolarDB-X分布式数据库了!
(2)操作
admin@polardb-x-demo ~> kubectl get pods
NAME READY STATUS RESTARTS AGE
sysbench-prepare-data-test--1-zzl4z 0/1 Completed 128m
admin@polardb-x-demo ~> kubectl delete job sysbench-point -select-test
Error from server (NotFound):jobs.batch"sysbench-point -select-test" not found
admin@polardb-x-demo ~ [1]> ubectt delete job sysbench- prepare-data-test
job.batch “sysbench-prepare-data-test" deleted
admin@pol ardb-x-demo ~>
admin@polardb-x-demo ~> kubectl get pods
No resources found in default namespace.
admin@polardb-x-demo ~>
admin@polardb-x-demo ~> acho apiVersion: polardbx.aliyun. com/v1
kind:PolarDBXCluster
metadata:
name:quick-start
annotations:
polardbx/topology-mode-guide: quick-start” I kubectl apply -f -
//这个命令就是文档里面写的命令,执行之后会在本地创建出一个CN,一个 DN,一个 CDC 的状态,看一下 PolarDB-X 集群的创建过程,过程大概需要两分钟稍微等待一下。
//可以看到集群叫做 quick start 里面会有一个 GMS,一个 CN,一个 DN一个 CDC,当前的状态还是处于一个创建的状态。现在可以看到 GMS 和 DN 已经创建好了,接下来会创建 CDC 和 CN。这次比较顺利, PolarDB-X quick start 集群已经创建好了。polardbxcluster.polardbx.aliyun.com/quick-start created
admin@polardb-x-demo ~> kubectl get polardbxCluster qui ck-start -w
NAME GMS CN DN CDC PHASE DISK AGE
quick-start 0/1 0/1 0/1 0/1 Creating 11s
quick-start 0/1 0/1 1/1 0/1 Creating 33s
quick-start 1/1 0/1 1/1 0/1 Creating 35s
quick-start 1/1 1/1 1/1 0/1 Creating 50s
quick-start 1/1 1/1 1/1 1/1 Running 2.4 GiB 55s
//创建好了之后,连上去来简单的看一下,断后转发将获得里面的3306转到本地,在本地可以用 mysql client 连上 PolarDB-X 集群。
^C
admin@polardb-x-demo ~ [SIGINT]>kubectl part-forward svc/quick-start 3306
Forwarding from 127.0.0.1:3306 -> 3306
Forwarding from [::1]:3306 -> 3306
开第二个 Shell 来远程登录 ECS的机器,同时连到刚刚创建的 PolarDB-X 的集群里面。首先来获取。 PolarDB-X root账号的密码。“kubectl get secret quick-start -o jsonpath="{.data ['polardbx_root']}”I base64 -d - 1 xargs echo "Password:"”
是比较长的一个指令,不用去记,文档里面有,课后可以去看一下。
free6om@free6om ~> ssh polardb-x-demo
Welcome to Ubuntu 20.04.3 LTS(GNU/Linux5.4.0-91-gen eric*86_64)
*Documentation:
https://help.ubuntu.com
*Management:
https://landscape.canonical.com
*Support:
https://ubuntu.com/advantage
Welcome to Alibaba Cloud Elastic Compute Service!
Last login: Fri Feb 11 16:10:13 2022 from 42.120.75.252 Welcome to fish, the friendly interactive shell
Type `help` for instructions on how to use fish adminepolardb-x-demo ~> cd class-4
admin@polardb-x-demo ~/class-4> alias kubectl-"minikube kubectl …- "
admin@polardb-x-demo~/class-4> kubectl get secret quick-start -o jsonpath="{.data['polardbx_root']}”I base64 -d - 1 xargs echo "Password:"
Password: 29rdjd4l
admin@polardb-x-demo ~/class-4> admin@polardb-x-demo ~/class-4>
admin@polardb-x-demo ~/class-4> mysql -h127.0.0.1 -P3306 -upolardbx_root - 29rdjd4l
//获取某密码之后登录,成功连接到 quick start PolarDB-X 的集群
mysql:[Warning] Using a password on the command line interface can be insecure
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 25
Server version: 5.6.29 Tddl Server(ALIBABA)
Copyright (c) 2000, 2021, 0racle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;'or '\h’ for help. Type '\c’to clear the current input statement.
//首先看一下 PolarDB-X 的版本
mysql> select version();
+----------------------------------+
| VERSION() |
+----------------------------------+
| 5.6.29-PXC-5.4.12-20220127 |
+----------------------------------+
1 row in set (0.00 sec)
//版本信息为20220127
//接下来做 sysbench 的压测,第一步要准备一些数据,先建出来 sysbench_test
mysql> create database sysbench_test;
Query OK, 1 row affected (0.15 sec)
mysql>
建好之后开启里另外一个 Shell
free6om@free6om ~> ssh polardb-x-demo
Welcome to Ubuntu 20.04.3 LTS(GNU/Linux5.4.0-91-gen eric*86_64)
*Documentation:
https://help.ubuntu.com
*Management:
https://landscape.canonical.com
*Support:
https://ubuntu.com/advantage
Welcome to Alibaba Cloud Elastic Compute Service!
Last login: Fri Feb 11 16:14:25 2022 from 42.120.75.252 Welcome to fish, the friendly interactive shell
Type `help` for instructions on how to use fish adminepolardb-x-demo ~> alias kubectl-"minikube kubectl
admin@polardb-x-demo ~> cd class-4
admin@polardb-x-demo ~/class-4> ls
sysbench-prepare.yaml sysbench-run.yaml
admin@polardb-x-demo ~/class-4>view sysbench-prepar e.yaml
Shell 里面会先把 sysbench 压测所需要的数据灌到PolarDB-X 的集群里面,要注意一下当前PolarDB-X 集群,还是一个 CN,一个 DN 的状态。可以简单来看一下 sysbench 做了什么。用了第三方打包的镜像,连上PolarDB-X quick start 集群之后呢,会往里面创建一个压测的表,往表里面写入16万行数据。这就是prepare配置所干的事情。
spec:
restartPolicy: Never
containers:
-name: sysbench-prepare
image:severalnines/sysbench
env:
-name:QUICK_START_USER
value: polardbx_root
-name:QUICK_START_PASSWD
valueFrom:
secretKeyRef:
name:quick-start
key: polardbx_root
command:['sysbench']
args:
- --db-driver=mysql
- --mysql-host=$(QUICK_START_SERVICE_HOST)
- --mysql-port=$(QUICK_START_SERVICE_PORT)
- --mysql-user=$(QUICK_START_USER)
- --mysql_password=$(QUICK_START_PASSWD)
- --mysql-db=sysbench_test
- --mysql-table-engine=innodb
- --rand-init=on ---max-requests
- --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`) tbpartition by hash(id) tbpartitions 2
- --num-threads=1
- --time=3600
-/usr/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua
-run
接下来我们将配置应用到 PolarDB-X 集群里面
admin@polardb-x-demo ~/class-4>kubectl apply -f sysbench -prepare.yaml
job.batch/sysbench-prepare-data-test created
admin@polardb-x-demo ~/class-4> kubectl get pods
//灌数据运行的状态,可以看见已经跑起来了
NAME READY STATUS RESTARTS AGE
quick-start-965c-cdc-default-dcfffd454-642fb 2/2 Running 0 3m49s
quick-start-965c-cn-default-6d5c7b46d8-lpkwg 3/3 Runnin g 0 3m49s
quick-start-965c-gms-single-0 3/3 Running 0 4m24s
Sysbench-prepare-data-test--1-txllr 1/1 Running 0 9s
admin@polardb-x-demo ~/class-4>tail-f^C
admin@polardb-x-demo ~/class-4>kubectl logs -f sysbench -prepare -data-test--1-txllr
//灌数据的过程
thread prepare0
Creating table 'sbtestl'...
Inserting 160000 records into 'sbtestl'
[5s]thds:1tps:0.00 qps:1.00(r/w/o:0.00/0.80/0.20)lat (ms95%: 0.00 err/s:0.00 reconn/s:0.00
[10s]thds:1tps:0.00 qps:1.60(r/w/o:0.00/1.60/0.00) lat (ms, 95%): 0.00 err/s:0.00 reconn/s:0.00
[15s]thds:1tps:0.00qps:1.80(r/w/o:0.00/1.80/0.00)lat(ms,95%):0.00 err/s: 0.00 reconn/s:0.00
[20s]thds:1tps:0.00qps:2.40(r/w/o:0.00/2.40/0.00)lat(ms.95%):0.00 err/s:0.00 reconn/s: 0.00
//创建了一张表叫 sbtest1 插入了16万行的数据,现在是正在插入。
[25s] thds:1 tps:0.00qps:2.40(r/w/o:0.00/2.40/0.00)lat(ms,95%):0.00 err/s: 0.00 reconn/s:0.00
[30s]thds:1tps:0.00qpsy2.80(r/w/o:0.00/2.80/0.00)lat(ms95%):0.00 err/s:0.00 reconn/s:0.00
Creating secondary indexes on 'sbtest1'...
SQL statistics:
queries performed:
read: 0
write:62
other: 2
total: 64
transactions: I 64 (0.03 per sec.)
queries:64(1.98 per sec.)
ignored errors: (0.00 per sec.)
General statistics:
total time: 32.2587s
total number of events: 1
Latency (ms):
min: 32258.33
avg: 32258.33
max: 32258.33
95th percentile: 32161.14
sum: 32258.33
Threads fairness:
events(avg/stddev): 1.0000/0.00
execution time (avg/stddey): 32.2583/0.00
admin@polardb-x-demo ~/class-4>
创建完成。