主讲人:燧木,阿里云 PolarDB-X 云原生分布式数据库技术负责人之一,毕业于浙江大学计算机学院,兴趣广泛,对操作系统、密码学、分布式系统等均有涉猎。2017 年加入 PolarDB-X 团队进行高并发低延迟的 MySQL 分布式相关系统开发工作,目前负责 PolarDB-X 的云原生底座打造、生态系统连接、开源等开放生态构建工作。
视频回放链接:https://developer.aliyun.com/live/248029
系列介绍
PolarDB-X 动手实践系列围绕PolarDB-X社区版进行,内容覆盖PolarDB-X使用过程中的使用场景进行教学,培养操作实践能力。该系列内容将围绕使用 PolarDB-X 全周期过程,涵盖安装部署、开始使用、诊断优化、运维管理等几个方面。
准备工作:
在部署之前可以参考PolarDB-X的文档地址:https://doc.polardbx.com
在正式部署前先来了解一下系统架构,PolarDB-X 采用 Shared-nothing 与存储计算分离架构进行设计,系统由4个核心组件组成。
- 计算节点(CN, Compute Node)
计算节点是系统的入口,采用无状态设计,包括 SQL 解析器、优化器、执行器等模块。负责数据分布式路由、计算及动态调度,负责分布式事务 2PC 协调、全局二级索引维护等,同时提供 SQL 限流、三权分立等企业级特性。
- 存储节点(DN, Data Node)
存储节点负责数据的持久化,基于多数派 Paxos 协议提供数据高可靠、强一致保障,同时通过 MVCC 维护分布式事务可见性。
- 元数据服务(GMS, Global Meta Service)
元数据服务负责维护全局强一致的 Table/Schema, Statistics 等系统 Meta 信息,维护账号、权限等安全信息,同时提供全局授时服务(即 TSO)。
- 日志节点(CDC, Change Data Capture)
日志节点提供完全兼容 MySQL Binlog 格式和协议的增量订阅能力,提供兼容 MySQL Replication 协议的主从复制能力。
在本次部署中,可以把四个组件想象成四个 docker 容器或者是四个进程,相互之间协作,组合拉起完整的 PolarDB-X。
环境准备
本次部署所需的系统、配置、测试环境可参考下图:
通过PXD部署集群
准备工作
通过 PXD 工具部署 PolarDB-X 数据库需要先安装 Python3 和 Docker。
安装 PXD
注意: 推荐使用 virtual environment 安装 PXD 工具
python3 -m venv venv
source venv/bin/activate
安装前建议先执行如下命令升级 pip
pip install --upgrade pip
执行如下命令安装 pxd:
pip install pxd
注: 部分国内用户从 pypi 下载包的速度较慢, 可以使用如下命令从阿里云的镜像安装:
pip install -i https://mirrors.aliyun.com/pypi/simple/ pxd
部署 PolarDB-X
- 直接运行 pxd tryout 命令会创建一个最新版本的 PolarDB-X 数据库,其中 GMS, CN, DN, CDC 节点各 1 个:
pxd tryout
- 您也可以指定 CN,DN, CDC 节点的个数以及版本,命令如下:
pxd tryout -cn_replica 1 -cn_version latest -dn_replica 1 -dn_version latest -cdc_replica 1 -cdc_version latest
PolarDB-X 数据库创建完成后,会输出对应的连接信息:
注意:PolarDB-X 管理员账号的密码随机生成,仅出现这一次,请注意保存。
通过 MySQL Client 即可连接,执行如下 SQL 初步体验 PolarDB-X 的分布式特性。
# 检查GMS select * from information_schema.schemata; # 创建分区表 create database polarx_example partition_mode='partitioning'; use polarx_example; create table example ( `id` bigint(11) auto_increment NOT NULL, `name` varchar(255) DEFAULT NULL, `score` bigint(11) DEFAULT NULL, primary key (`id`) ) engine=InnoDB default charset=utf8 partition by hash(id) partitions 8; insert into example values(null,'lily',375),(null,'lisa',400),(null,'ljh',500); select * from example; show topology from example; # 检查CDC show master status ; show binlog events in 'binlog.000001' from 4; # 检查DN和CN show storage ; show mpp ;
查看 PolarDB-X 状态
执行如下命令,查看当前环境的 PolarDB-X 列表:
pxd list
清理 PolarDB-X
执行如下命令,即可清理本地环境所有的 PolarDB-X:
pxd cleanup
以上就是用PXD在本地部署PolarDB-X 集群的过程。
通过 K8S 部署
使用 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 -ms /bin/bash galaxykube $ usermod -aG docker galaxykube
如果你使用其他账号,请和上面一样将它加入 docker 组中,以确保它能够直接访问 docker。
使用 su 切换到账号 galaxykube,
$ su galaxykube
执行下面的命令启动一个 minikube,
minikube start --cpus 4 --memory 7960 --image-mirror-country cn --registry-mirror=https://docker.mirrors.ustc.edu.cn
注:这里我们使用了阿里云的 minikube 镜像源以及 USTC 提供的 docker 镜像源来加速镜像的拉取。
此时 minikube 已经正常运行。minikube 将自动设置 kubectl 的配置文件,如果之前已经安装过 kubectl,现在可以使用 kubectl 来访问集群:
$ kubectl cluster-info kubectl cluster-info Kubernetes control plane is running at https://192.168.49.2:8443 CoreDNS 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'.
注意:minikube kubectl 子命令需要在 kubectl 的参数前加 "--",如使用 bash shell 可以用 alias kubectl="minikube kubectl -- " 来设置快捷指令。下文都将使用 kubectl 命令进行操作。
现在我们可以开始部署 PolarDB-X Operator 了!
部署 PolarDB-X Operator
开始之前,请确保满足以下前置要求:
- 已经准备了一个运行中的 Kubernetes 集群,并确保
- 集群版本 >= 1.18.0
- 至少有 2 个可分配的 CPU
- 至少有 4GB 的可分配内存
- 至少有 30GB 以上的磁盘空间
- 已经安装了 kubectl 可以访问 Kubernetes 集群
- 已经安装了 Helm 3
首先创建一个叫 polardbx-operator-system 的命名空间,
$ kubectl create namespace polardbx-operator-system
执行以下命令安装 PolarDB-X Operator。
$ helm install --namespace polardbx-operator-system polardbx-operator https://github.com/ApsaraDB/galaxy
查看 PolarDB-X Operator 组件的运行情况,等待它们都进入 Running 状态:
$ kubectl get pods --namespace polardbx-operator-system NAME READY STATUS RESTARTS AGE polardbx-controller-manager-6c858fc5b9-zrhx9 1/1 Running 0 66s polardbx-hpfs-d44zd 1/1 Running 0 66s polardbx-tools-updater-459lc 1/1 Running 0 66s
恭喜!PolarDB-X Operator 已经安装完成,现在可以开始部署 PolarDB-X 集群了!
部署 PolarDB-X 集群
现在我们来快速部署一个 PolarDB-X 集群,它包含 1 个 GMS 节点、1 个 CN 节点、1 个 DN 节点和 1 个 CDC 节点。执行以下命令创建一个这样的集群:
echo "apiVersion: polardbx.aliyun.com/v1 kind: PolarDBXCluster metadata: name: quick-start annotations: polardbx/topology-mode-guide: quick-start" | kubectl apply -f -
你将看到以下输出:
polardbxcluster.polardbx.aliyun.com/quick-start created
使用如下命令查看创建状态:
$ kubectl get polardbxcluster -w NAME GMS CN DN CDC PHASE DISK AGE quick-start 0/1 0/1 0/1 0/1 Creating 35s quick-start 1/1 0/1 1/1 0/1 Creating 93s quick-start 1/1 0/1 1/1 1/1 Creating 4m43s quick-start 1/1 1/1 1/1 1/1 Running 2.4 GiB 4m44s
当 PHASE 显示为 Running 时,PolarDB-X 集群已经部署完成!恭喜你,现在可以开始连接并体验 PolarDB-X 分布式数据库了!
通过编译安装
准备工作
- 下载 GalaxyEngine 代码,main分支
- 下载 GalaxySQL 代码,main分支
- 下载 GalaxyGlue 代码,main分支
- 下载 GalaxyCDC 代码,main分支
编译 PolarDB-X DN (存储节点,代号GalaxyEngine)
此步骤编译和安装GalaxyEngine(mysql)
安装依赖(CentOS7)
yum install cmake3 ln -s /usr/bin/cmake3 /usr/bin/cmake # 安装GCC7 yum install centos-release-scl yum install devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils echo "source /opt/rh/devtoolset-7/enable" >>/etc/profile # 安装依赖 yum install make automake git openssl-devel ncurses-devel bison libaio-devel
安装依赖(Ubuntu20)
# 安装GCC7 apt install -y gcc-7 g++-7 update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 \ --slave /usr/bin/g++ g++ /usr/bin/g++-7 update-alternatives --config gcc gcc --version g++ --version # 安装依赖 apt install make automake cmake git bison libaio-dev libncurses-dev libsasl2-dev libldap2-dev libssl-dev pkg-config
编译
# 进入 galaxyengine 代码路径 cd galaxyengine # 安装boost1.70 (注:把boost放到仓库里避免下载) wget https://boostorg.jfrog.io/artifactory/main/release/1.70.0/source/boost_1_70_0.tar.gz mkdir extra/boost cp boost_1_70_0.tar.gz extra/boost/ # 编译安装 # 详细参数请参考 https://dev.mysql.com/doc/refman/8.0/en/source-configuration-options.html cmake . \ -DFORCE_INSOURCE_BUILD=ON \ -DCMAKE_BUILD_TYPE="Debug" \ -DSYSCONFDIR="/u01/mysql" \ -DCMAKE_INSTALL_PREFIX="/u01/mysql" \ -DMYSQL_DATADIR="/u01/mysql/data" \ -DWITH_BOOST="./extra/boost/boost_1_70_0.tar.gz" make -j8 make install
编译 PolarDB-X CN (计算节点,代号GalaxySQL)
# 进入CDC代码 # 编译打包 mvn install -D maven.test.skip=true -D env=release # 包在/polardbx-cdc-assemble/target/ # 解压运行 tar zxvf polardbx-binlog.tar.gz
编译 PolarDB-X CDC(日志节点,代号GalaxyCDC)
此步骤编译和安装 galaxycdc 代码。
# 进入CDC代码 # 编译打包 mvn install -D maven.test.skip=true -D env=release # 包在/polardbx-cdc-assemble/target/ # 解压运行 tar zxvf polardbx-binlog.tar.gz
启动PolarDB-X DN
- 此步骤启动一个mysql进程,作为metadb和dn
- 参考附录中的mysql配置文件(my.cnf),可进行相应修改,默认使用 4886 作为 mysql端口,32886 作为私有协议端口
- 默认使用 /u01/my3306 作为mysql数据目录,可以修改成其他目录
注意:启动 DN 需要使用非 root 账号完成
启动mysql:
/
mkdir -p /u01/my3306/{data,log,run,tmp,mysql} /u01/mysql/bin/mysqld --defaults-file=my.cnf --initialize-insecure /u01/mysql/bin/mysqld --defaults-file=my.cnf
启动PolarDB-X CN
启动mysql进程之后,便可以初始化PolarDB-X,需要准备以下几个配置:
- metadb user:以下采用
my_polarx
- metadb database:创建metadb库,以下采用
polardbx_meta_db_polardbx
- 密码加密key(dnPasswordKey):以下采用
asdf1234ghjk5678
- PolarDB-X默认用户名:默认为
polarx_root
- PolarDB-X默认用户密码:默认为
123456
,可通过-S
参数修改
注意:启动 CN 需要使用非 root 账号完成
修改配置文件 conf/server.properties,逐个替换以下配置项:
/
# PolarDB-X 服务端口 serverPort=8527 # PolarDB-X RPC 端口 rpcPort=9090 # MetaDB地址 metaDbAddr=127.0.0.1:4886 # MetaDB私有协议端口 metaDbXprotoPort=32886 # MetaDB用户 metaDbUser=my_polarx metaDbName=polardbx_meta_db_polardbx # PolarDB-X实例名 instanceId=polardbx-polardbx
初始化PolarDB-X:
- -I: 进入初始化模式
- -P: 之前准备的dnPasswordKey
- -d: DataNode的地址列表,单机模式下就是之前启动的mysql进程的端口和地址
- -r: 连接metadb的密码
- -u: 为PolarDB-X创建的根用户
- -S: 为PolarDB-X创建的根用户密码
bin/startup.sh \ -I \ -P asdf1234ghjk5678 \ -d 127.0.0.1:4886:32886 \ -r "" \ -u polardbx_root \ -S "123456"
此步骤中会生成内部密码及加密密码,需要将其填写配置文件 conf/server.properties 中,用于后续访问:
Generate password for user: my_polarx && M8%V5%K9^$5%oY0%yC0+&1!J7@8+R6) Encrypted password: DB84u4UkU/OYlMzu3aj9NFdknvxYgedFiW9z59bVnoc= Root user for polarx with password: polardbx_root && 123456 Encrypted password for polarx: H1AzXc2NmCs61dNjH5nMvA== ======== Paste following configurations to conf/server.properties ! ======= metaDbPasswd=HMqvkvXZtT7XedA6t2IWY8+D7fJWIJir/mIY1Nf1b58=
最后一步,启动PolarDB-X:
bin/startup.sh -P asdf1234ghjk5678
连接PolarDB-X验证,如果能连上,说明数据库启动成功啦,可以愉快地运行各种SQL啦:
mysql -h127.1 -P8527 -upolardbx_root
启动PolarDB-X CDC
启动PolarDB-X进程之后,便可以初始化PolarDB-X CDC组件,需要准备以下几个配置:
- metadb user:和启动PolarDB-X时设置的值保持一致,以下采用
my_polarx
- metadb database:和启动PolarDB-X时设置的值保持一致,以下采用
polardbx_meta_db_polardbx
- metadb password:和启动PolarDB-X时设置的值保持一致,需使用密文,以下采用
HMqvkvXZtT7XedA6t2IWY8+D7fJWIJir/mIY1Nf1b58=
- metadb port:和启动MySQL时设置的值保持一致,以下采用
4886
- 密码加密key(dnPasswordKey):和启动PolarDB-X时设置的值保持一致,以下采用
asdf1234ghjk5678
- PolarDB-X用户名:和启动PolarDB-X时设置的值保持一致,以下采用默认值
polardbx_root
- PolarDB-X用户密码:和启动PolarDB-X时设置的值保持一致,需使用密文,以下采用默认值
H1AzXc2NmCs61dNjH5nMvA==
- PolarDB-X端口:和启动PolarDB-X时设置的值保持一致,以下采用默认值
8527
- 当前机器分配给CDC使用的内存大小:以下采用16000代指,单位为M,实际配置值请替换为真实值
注意:启动 CDC 需要使用非 root 账号完成
useEncryptedPassword=true polardbx.instance.id=polardbx-polardbx mem_size=16000 metaDb_url=jdbc:mysql://127.0.0.1:4886/polardbx_meta_db_polardbx?useSSL=false metaDb_username=my_polarx metaDbPasswd=HMqvkvXZtT7XedA6t2IWY8+D7fJWIJir/mIY1Nf1b58= polarx_url=jdbc:mysql://127.0.0.1:8527/__cdc__ polarx_username=polardbx_root polarx_password=H1AzXc2NmCs61dNjH5nMvA== dnPasswordKey=asdf1234ghjk5678 storage.persistBasePath=${HOME}/logs/rocksdb binlog.dir.path=${HOME}/binlog/
接下来,即可启动CDC daemon进程,命令如下所示。启动之后,通过jps命令查看进程状态,CDC会有3个附属进程,分别是DaemonBootStrap、TaskBootStrap和DumperBootStrap,CDC的系统日志会输出到${HOME}/logs目录下,全局binlog日志会输出到binlog.dir.path参数配置的目录下,TaskBootStrap进程和DumperBootStrap进程被kill后,会被Daemon进程自动拉起。
bin/daemon.sh start
登录PolarDB-X,执行一些DDL或DML操作,然后执行show binary logs 和show binlog events命令,验证全局binlog 的生成状态,enjoy it!
以上就是部署PolarDB-X的三种方法,希望大家都能在本地成功部署体验,后续也会陆续为大家带来更多的PolarDB-X的使用教程,欢迎对PolarDB-X开源感兴趣的小伙伴加入我们的钉钉交流群,共建社区!