在CentOS 7.9测试部署PolarDB-X 分布式与集中式
1. 前言
为什么要使用Polardb-x?
开源组件的稳定性和备选方案:
CentOS已经改变了发行方式,MySQL被Oracle收购,以及MariaDB在某些情况下的稳定性问题确实引起了关注。PolarDB-X作为一个经过阿里云深度优化和验证的分布式数据库,其稳定性和可靠性得到了广泛的认可。PolarDB-X在继承了MySQL生态优势的同时,针对分布式场景进行了大量的优化和改进,确保了在各种复杂环境下的稳定运行。
作为备选方案,PolarDB-X不仅提供了与MySQL高度兼容的语法和接口,还提供了强大的分布式功能和性能,使得用户可以在无需大规模修改代码的情况下,轻松实现数据库的升级和迁移。单体数据库的局限性和分布式解决方案:
对于不断增长的业务来说,单体数据库如MySQL、MariaDB等确实存在扩展性和性能瓶颈。虽然存在如MHA、分表分库、MyCat等解决方案,但这些方案往往需要在多个组件之间进行复杂的配置和管理,增加了维护和使用的难度。
PolarDB-X作为一个原生的分布式数据库,内置了数据切分、分布式事务、全局二级索引等核心功能,无需用户额外配置和管理多个组件。同时,PolarDB-X还提供了丰富的企业级特性和工具,如SQL限流、三权分立等,使得用户可以更加轻松地管理和使用分布式数据库。
- 国产化的需求:
随着国产化的不断推进,政企单位对于使用国产数据库的需求也在不断增加。PolarDB-X作为一款国产的分布式数据库,不仅具有强大的功能和性能,还得到了国家相关部门的认证和支持。使用PolarDB-X可以满足政企单位对于国产数据库的需求,同时也有助于推动国内数据库产业的发展。
这些都不展开细说了,下面介绍最近我在部署测试Polardb-x的步骤、一些问题与思考。
2. 部署环境准备
下面的部署都是在CentOS 7.9环境下进行的。
当然我也在Anolis OS 8.9、openEuler 22.03 (LTS-SP3)这两个系统上做了测试。分布式、集中式、使用PXD部署、使用k8s集群在Rancher 2.7控制台下部署,都测试过了。
下面只介绍在单机环境
下的测试部署,这个更简单易上手一些。
2.1 环境设置
安装配置之前,为了排除干扰因素,先把防火墙和selinux关闭
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
系统默认语言英文环境,防止有乱码
export LC_ALL=en_US.utf-8
export LANG=en_US.utf-8
系统参数设置
cat << EOF >> /etc/security/limits.conf
* soft nproc 102400
* hard nproc 102400
* soft nofile 102400
* hard nofile 102400
EOF
sysctl -p
ulimit -n
完成上面的设置后,最好
重启一下系统
,或者是退出重新登录
reboot
2.2 Python3安装
在CentOS 7.9环境下默认是没有python3的,需要yum安装
yum -y install python3-pip python3
配置pip源,使用国内源,速度更快
mkdir ~/.pip
cat <<EOF > ~/.pip/pip.conf
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
timeout = 120
EOF
2.3 Docker安装配置
执行如下命令,安装docker
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache
# 查看最新的Docker版本:
yum list docker-ce.x86_64 --showduplicates |sort -r
# 指定版本安装
yum install -y docker-ce-20.10.24-3.el8
# 也可以直接安装最新版本
yum install -y docker-ce
查看docker版本
# docker --version
Docker version 26.1.2, build 211e74b
配置开机启动
systemctl enable docker
修改docker-ce配置
mkdir /etc/docker/
touch /etc/docker/daemon.json
cat > /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 10,
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF
systemctl daemon-reload && systemctl restart docker
测试拉取一个小镜像
docker pull busybox
docker images
注意:集群模式下,docker engine 版本需要大于等于18.04。
2.4 安装 MySQL 客户端命令行工具
在CentOS 7.9默认的仓库里面有mysql客户端的安装包,是MariaDB 5.5的,在本次测试用,也能用,直接安装即可
yum -y install mysql mysql-devel
# mysql --version
mysql Ver 15.1 Distrib 5.5.68-MariaDB, for Linux (x86_64) using readline 5.1
2. 部署集群
2.1 下载pxd
PXD 是 PolarDB-X 的部署工具,除了支持在本地一键快速拉起测试环境外,也支持在 Linux 集群中通过指定的拓扑的方式部署 PolarDB-X 分布式数据库。
安装好python3、pip3以后,使用virtual environment 安装 PXD 工具,方便测试。
Python虚拟环境是一种用于隔离和管理项目所需的Python解释器及其依赖库的工具。它可以让我们在同一台机器上同时运行多个项目,并且每个项目都可以有不同的依赖库和Python版本。虚拟环境可以为每个项目提供独立的运行环境,避免各项目之间的依赖冲突。创建Python虚拟环境可以使用Python自带的venv模块或者第三方工具virtualenv来完成。
# 执行如下命令,生成一个测试环境
mkdir /home/polardb-test/
cd /home/polardb-test/
python3 -m venv venv
source venv/bin/activate
# 升级pip
pip3 install --upgrade pip
# 下载安装pxd
pip3 install pxd
验证 pxd 是否安装成功:
# pxd version
pxd version: 0.7.0
commit id: 697d126
2.2 使用pxd部署集中式(标准版)版本
PolarDB-X 标准版采用一主一备一日志的三节点架构,性价比高,通过多副本同步复制,确保数据的强一致性。面向具备超高并发、复杂查询及轻量分析的在线业务场景。
执行如下命令会创建一个最新版本的 PolarDB-X 标准版集群,其中 GMS, CN, CDC 个数为0,仅包含一个DN节点。
pxd tryout -t standard -leader_only false -name test01
部署流程如下图,如果是第一次部署,会拉取相关的docker镜像,镜像比较大,时间可能比较慢,估计30分钟左右
部署完成后会启动3个容器,如下图:
此时可以通过mysql客户端来访问了:
mysql -h127.0.0.1 -P15376 -uadmin -p12345678
注意:PolarDB-X 管理员账号的密码随机生成,仅出现这一次,请注意保存。丢了就不好找了。
在测试中还发现,这个生成的端口,主从容器角色不知道是不是因为压力测试的原因,自动换了一次,导致我连接的时候,刚开始是主节点,后来变成了从节点只读,更换了端口号(15376换成14746),写入(新建库表)才正常。如果是正式环境使用的时候会有这种自动切换吗?后面还需要再看看客户端连接的文档。
通过 MySQL Client连接,执行如下 SQL 体验PolarDB-X 标准版三节点架构的特性:
# 查询三节点的拓扑信息与状态
select * from information_schema.alisql_cluster_global;
# 查询三节点的延迟信息
select * from information_schema.alisql_cluster_health;
用navicat访问集中式的polardb-x,能发现跟mysql的初始库结构很像
基本操作跟mysql完全一样。
查看集群状态:
pxd list
清理 PolarDB-X
pxd cleanup
2.3 使用pxd部署分布式(企业版)版本
PolarDB-X 企业版是分布式架构集群,支持更大数据量,面向具备企业级超高并发、大规模数据复杂查询、加速分析的业务场景。 直接运行 pxd tryout 命令会创建一个最新版本的 PolarDB-X 企业版集群,其中 GMS, CN, DN, CDC 节点各 1 个:
pxd tryout
tryout 模式创建的 GMS 和 DN 默认采用单副本模式,如果您想创建基于 Paxos 的三副本的集群,使用如下命令:
pxd tryout -leader_only false
我用的是下面的命令启动的集群
pxd tryout -t enterprise -leader_only false -name test02
集群启动流程如下:
官方文档里面介绍的还有指定版本安装的,但是我在实际操作后,发现不可行!应该是我用的pxd版本比较新的原因。
pxd version: 0.7.0
commit id: 697d126
部署完成后会启动8个容器,如下图:
此时可以通过mysql客户端来访问了:
mysql -h127.0.0.1 -P63383 -upolardbx_root -p12345678
可以看到这次启动用的管理员账号也变了。区分集中式还是分布式,一个比较方便的办法,就是看默认的管理员账号。
通过 MySQL Client连接,执行如下 SQL 体验PolarDB-X集群版架构的特性,如下:
用navicat访问集中式的polardb-x,能发现跟mysql的初始库结构就不太一样了。
新建库、表,基本操作跟mysql一样。
在新建库表操作中,能明显感觉到分布式的比集中式的要慢。
在用sysbench压力测试的时候,也能感觉到分布式的读写性能比集中式的要低很多,不知道是不是默认设置的原因。
在分布式环境中,新建了一个库,用了1.89s。
2.4 部署中的一些问题
1. 阿里云镜像源异常
特别注意:绝对不要使用阿里云的镜像源!!!
例如:
"registry-mirrors": ["https://rsk59qvc.mirror.aliyuncs.com"]
这个镜像源,会导致下面的镜像拉取过程中:
polardbx/xstore-tools:latest
拉取到两年前的,导致pxd部署集群的时候一直报错,第一步就启动不起来。
刚开始的时候,我有一台机器能启动,另外新加的虚拟机都不能启动,部署的时候一直卡到这一步,报如下错误:
create gms node
然后进度直接卡主,进行不下去
查看容器的信息,显示是mysql的服务没启动成功,报错如下:
subprocess.CalledProcessError: Command '['/opt/galaxy_engine/bin/mysqld', '--defaults-file=/data/mysql/conf/my.cnf', '--loose-pod-name=pxc-tryout-gms-Cand-17823', '--initialize-insecure']' returned non-zero exit status 1.
我还以为是操作系统版本、内核、docker版本、镜像版本的错误,新建了好几台虚拟机进行对比,还是报错,一直卡了好几天,我还以为是pxd部署有问题了,都想放弃了,到最后仔细对比才发现这个大坑。这个bug很难遇到、遇到了也很难发现。还是用docker官方源,或者大学的镜像源吧。
国内镜像源站参考:
Docker国内镜像源:https://registry.docker-cn.com 中科大源:https://docker.mirrors.ustc.edu.cn 网易源:https://hub-mirror.c.163.com 百度源:https://mirror.baidubce.com 腾讯源:https://ccr.ccs.tencentyun.com
上面的阿里云镜像源的问题,已经通过Polardb-X的官方钉钉沟通群反馈了,后面文档更新的时候加上。
2. 指定版本安装的问题
在官方文档中,提到了可以指定版本安装,但是到hub.docker.com看官方镜像标签,因为polardb-x有好几个组件,这几个组件的版本还不一致,如果我换了其中一个组件的版本,另一个是不是也要换?但是换成哪个版本呢?这几个组件,各版本适配关系是什么样的?文档中也没写清楚,我也不敢随便试。
在使用pxd tryout进行测试部署的时候,最新的0.7.0版本,指定版本安装也会报错。命令如下:
pxd tryout -cn_replica 1 -cn_version v2.4.0_5.4.19 -dn_replica 1 -dn_version v2.4.0_8.4.19 -cdc_replica 1 -cdc_version v2.4.0_5.4.19
报错如下:
我找了一下docker hub的官方仓库,发现根本就找不到 polardbx/polardbx-engine-2.0:v2.4.0_8.4.19 这个镜像标签,实际的镜像应该是polardbx/polardbx-engine:v2.4.0_8.4.19。但是在pxd tryout这个命令里面,应该是把镜像写死了,只能改标签,而用
curl -s "https://polardbx-opensource.oss-cn-hangzhou.aliyuncs.com/scripts/get-version.sh" | sh
这个命令获取的镜像标签又是错的!
所以,使用pxd tryout命令进行指定版本安装,还是不太行。想要指定版本按照,还是用pxd create这个命令吧。
3. 压力测试情况
使用pxd tryout命令部署完集群之后,我对集中式和分布式、还有单机mysql 5.7,尝试了几次sysbench压力测试,但是不知道是不是我配置参数的问题,一直试不出来官方的效果。
压力测试参考:
阿里云 云原生数据库PolarDB-MySQL 性能测试方法(OLTP)
4. 总结和一些建议
按照官方文档走完部署和测试流程中,虽然碰到了好几个问题,但也算是解决了,最后在不同的环境下成功部署了PolarDB-X,完成了如下的测试
- 在Anolis OS 8.9、openEuler 22.03、CentOS 7.9环境下都成功部署了PolarDB-X集群的分布式、集中式
- 在Rancher 2.7所管理的k8s集群中,用containerd而非docker,成功部署了PolarDB-X集群的分布式、集中式
- 对比测试了PolarDB-X集群的分布式、集中式的功能,并用Sysbench对比压测。
再次总结一下再测试中出现的问题:
- 使用pxd tryout部署的时候,不要配置docker镜像源使用阿里云的,要不然会导致部署失败
- 使用pxd tryout部署的时候,不要使用指定版本部署。如果要指定版本部署,要用pxd create指定配置文件的方式。
一些需要注意的地方:
使用pxd tryout部署的时候,因为是测试性质,所以默认启动的docker容器资源是有限制的,内存限制的是2G,使用pxd create的时候可以自定义资源限制。生产环境中一定不要用这个部署方式。
希望官方做出的一些改进:
1. 文档更加完善,及时更新
比如压力测试那一部分,那个工具Benchmark Boot,连接不了mysql 5.7/8.0,没办法对比进行测试。
我看了一下其它开源分布式数据库的文档,再对比一下PolarDB-x的,只能说,还不够完善,更不用说跟MySQL官方的比了。
不能只管商业版,开源版的就放羊了吧。只有把文档写好,写完善,及时答疑解惑,打消大家的顾虑,开源和商业才能相辅相成,用的人越来越多。
2. 生态工具更加完善
比如备份与恢复的工具、UI管理平台等等。现在能看到的生态工具只有两个工具,一个是数据导入导出的,一个是压测平台的。还是太少了
3. 有更多使用案例
什么样的情况下,应该用什么样的部署方式和架构?
比如说1000万数据、一亿数据、10亿数据,这些情况下适合用PolarDB-X吗?
如果适合,应该用什么样的架构?
对于大数据,PolarDB-X有什么优势?有哪些优化方式?
只有更多使用案例,使用方案,才能匹配更多用户场景,让生态更繁荣,让更多人用起来,开源反哺商业。
以上是我的这次评测,希望PolarDB-X开源生态原来越完善,国产开源数据库越来越好,用户越来越多。