开发者学堂课程【PolarDB-X 动手实践:快速学习如何一键部署 polardb-x】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/944/detail/14747
如何一键部署 polardb-x
内容介绍
一、课程简介
二、一键部署 PolarDB-X
三、环境准备
四、演示内容
五、实际操作
一、课程简介
这节课的目的是如何在电脑本地上拉起 polardb-x 的集群或者说是实例,这节课也是 polardb-x 系列的第一篇,之前讲的是偏一些理论实践,根据反馈,我们做一个调整,以后会更偏于动手实践。
动手实践是完全围绕 polardb-x 社区版这个版本来讲解,来感受一些功能或者特性。这个开源的 polardb-x 对应的版本是 2.0,在功能上二者是一致的。
动手实践面向的群体主要是应用开发者,架构师,DBA,DevOps,SRE,学生。主要内容是 polardb-x 使用的整个过程当中的一些场景。
这个系列的分享是按照在它的生命周期的过程中,比如从安装过程到如何使用、怎么往里面导数据、怎么扩容、以及后面使用比较多的优化来解决热点分布不均、以及平时一些业务的管理,比如如何去做恢复,如果不小心删除了数据,来看怎样找回,以及其他一些管理的功能。
二、一键部署 PolarDB-X
首先打开文档地址:https://doc.polardbx.com,然后进入到安装部署的页面。
先了解一下它的结构:
它由四部分组成,第一部分是 CN,也就是组件层;第二部分是 GMS 源数据中心,同时负责事件处理算法;第三部分是 DN,也就是存储界面;最后一个是 CDC,也就是全局的节点。
可以把这四个组件想象成四个进程,可以单独的运行,相互之间有协作,组合起来就是一个完整的 polardb-x 的一个实例,我们最终目的是将这四个组件拉起来。
三、环境准备
一些基本的准备工作是把目前 polardb-x 支持的操作系统列出来:CentOS7\8、macOS、Ubumtu18\20\21\22、windows10+(测试需要)。
配置:>=4C8G
环境:
Docker>=1.19.3
Python>=3
Minikube 1.18.0
Helm3
MySQL Client
通常这些在电脑里会有,没有的话安装也很快。
四、演示内容
今天演示的内容将覆盖这三个方面:PXD 一键安装,在你的本地把 polardb-x 的实例安装起来。我会在 mac 去操作,如果你是其他的也一样的。
还有两个开发模式:K8S Operater(阿里云 ECS)、源码编译。这两个时间充足的话会演示,也可以自己动手进行。
五、实际操作
1、准备工作
我们今天参考文档里安装的步骤,来尝试使用工具来安装。
在本地安装,需要有两个依赖物,一个是 python3,第二是需要安装 Doctor.
装完之后开始跳到 PXD 的安装,这里推荐下载一个 python 的虚拟环境。
像这样的话已经到了 python 的虚拟环境。
PXD 安装好了以后,就可以来体验 polardb-x 的一键拉起的命令,这个命令会把 polardb-x 需要的镜像从挡话板给拉到本地,因为目前镜像加起来是比较大的,大概有两点五个 G,所以如果网络不太好的会很费时。
镜像拉好之后就会逐个在本地去建那四个组件,这个过程首先将一些源数据进行初始化。
现在已经在本地创建好了 polardb-x 的实例,因为它分布式的系统,所以它里面的四个组件都可以进行一个扩展。
可以看到默认状态下创建的实例,它包含了 DN\CN\CDC\GMS 这四个组件,它目前的状态是 running ,说明你已经在本地创建好了可以用于测试的 polardb-x 的一个实例,因为它是分布式的系统,它里面的四个组件都可以水平地进行扩展。它的连接方式是这里的密码 mysql -h127.0.0.1 -P8329 -upolardbx_root -pXurTiJSH 需要记好了,因为它只会在这里显示一次。如果打算长期使用这个实例,一定要把密码记下来。
2、实际操作
接下来连到这个实例里去,学习一些操作。
第一个就是元数据的一些表示是否存在,可以看出是存在的。
第二个是一个数据库,这里是对语法的一些扩展
Mysql> create database polarx_example partition_mode=’parttioning’:
Query OK,1 row offected(0.26 sec)
接下来到里面去建个表,可以看出这里也是建表的一个扩展,还可以显式地指出是通过 id 进行分区,现在有八个分区,从 0 到 7,分别分布在八个分户上,可以看出这张表特殊的结构。
接下来看 CDC ,polardb-x 支持全局的特性,这个特性使 polardb-x 有着跟 mysql 一样的兼容地增量获取的办法,也就是说原来用的类似于 cancel ,或者是其他的阿里云上的数据导出工具,直接用 mysql 去定义增量是没有问题的。
看以看到这里有一个 binlog 文件,我们可以看一下里面的事件,这里也是用的 MySQL 查看 binlog 的一个指令,可以看到有一些时间在里面,这样我们就完成了一个 polardb-x 的实例的本地拉起。
Mysql> exit
Bye
(venv)free60free60m m/1venv Did list
目前它的名字叫做 pxc-tryout .
第二个如果不在本地用它,他的数据也已经删除了,所以你之前做过一些测试用过 clean up 这个指令的话,数据会被清掉,所以这个命令要慎用。
可以看到四个容器在运行,第一个是 CDC 容器,第二个是 CN 容器,第三个是 DN 容器,最后一个是 GMS ,可以看到 GMS 和 DN 共用一个容器,也就是可以把 GMS 看成特殊的 DN 。
当然也可以用 DOCKER 的一些操作内容,连到一些容器里面,容器里面内置了一个 mysql 直接连到 GMS 库里,
去看下结构:
这个就是我们的源数据库,里面会有一堆表,USER 这张表存的就是我们的账号,不要忘记这个密码,它本身是加密过的,也可以尝试将字符串替换掉来进行恢复,我在这里就退出容器了。
以上便是第一种安装方式,PXD 这样一键安装的工具,以及 polardb-x 的实例。
大家在安装的时候可能会遇到 DOCKER 没有权限问题,如果用非 root 账号直接执行的话,可能因为没有权限而报错。另外就是 polardb-x 的每一个组件都会占端口,这个端口是随机分配的。如果之前查一次 PXD 失败了,可能把当前用户加到组里面。
PXD 首先是个 python 脚本,它从 DOCKER 上把它的镜像拉下来,然后再在本地创建四个容器,再把相关参数用默认值进行替换,这就是大概过程。
polardb-x 里也有几个仓库,第一个对应 CN 这个组件,第二个对应 DN 这个组件,它是 MySQL 的一个分支,相对官方的 mysql 8.0 我们做了几个改进,第一是实物模型进行改进,让它在多线程的条件下效率更高。第二个是 CN 和 DN 进行更高效的通讯,并拓展了一些能力,比如说增强分布式的能力,第三个是开发三副本的能力,目前正在开发中。
在实例里,一个 mysql 其实就是一个 DN ,他们在能力上一致,只不过因为扮演不同的角色,在最后提供功能的时候会提供不同的功能,只有 GMS 会提供全局获取。那 PXD 这个工具说得差不多了。
接下来看一下 polardb-x 另外的两个安装方式,其实 PXD 这个工具可以拉起多个,比如拉起两个 CN,两个 DN 这样的集群,也可以用 PXD 工具来进行,快速入门里也提到过一个文档,叫做通过 PXD 部署集群,它前面的准备工作都是一样的,唯一的差别是比如说你现在有三台机器,第二个你要指定在机器上研究几个 CN 几个 DN,就这几个关系给写好,最后再通过 PXD create 就可以把分布式的集群给拉起,大家可以参考这个文档。
接下来看一下如果通过 K8S 部署,我演示的是直接在阿里云上买了一个 escis,是一个 64 G 的配置,现在我们先连上去。
K8S 会依赖几个东西,一个是 Kubernetes,对它的生态比较了解的应该知道这个工具。第二个是 DOCKER ,第三个是 helm,我已经在本地安装过了,所以后期大家可以参考这个教程把这个安装好,他们的安装相对也很简单,helm 是直接参考官方的文档,里面会给你一个将二进制文件转化了,DOCKER 也是直接参考官方的,我这里是直接参考系统的,就算完成了,这就是三个依赖的工具就建好了。
我这边没用这个名字,但都要把创建的账号加到组里,目前我这边已经加好了,准备工作做好以后,首先就可以在机器上启动一个这样的集群,这个指令直接复制,可以看到是指定了四个 CPU,八个 G 的内存,初始化过程需要稍微等一下。
看到 down 这个符号就是好了;这里看本地有没有装 kubectl 这个命名,如果没有安装,它也是自带的。
接下来部署 polardb-x Operator,部署的时候内存至少分配四个 G 的内存空间,同时本地也要有个 helm3 这个工具,有了这个之后,在本地建一个它的空间。
建好之后就可以来安装 polardb-x Operater,我们的 operater 目前是直接打包在仓库里,operater 对应的仓库名称叫做 glacekube。如果能看到这样一段话说明已经安装好了。
可以进一步看一下里面如果是 eunning 状态,说明 operater 已经安装好了。
接下来就可以建一个 polardb-x 的集群了,接下来开始围绕文档来看一下 polardb-x 集群创建的过程,我们先来看一下这个参数。
第一个是 quick-start,它有四个组件,CN,DN,以及 CDC 也是出于创建过程中,测试过程大概需要两分半。这部过程要是完成了,就意味着集群实例就创建好了,做的一些初级操作就看一参考那些文档。同时这些文档也给了一个原路返回的过程,也就是说你可以将刚才创建的集群的资源释放掉,同时也可以 operater 也释放掉,你可以进一步将 minikube 创建的集群再进一步删除掉,目前看来是可以顺利进行的:
以上便是通过 K8S 来部署 polardb-x 集群的实例。
可以看一下 K8S 里面的文档,刚才我们复制了一段话,布置集群一开始就是最简单的文件,一个文件里面默认一个 CN 一个 DN 一个 CDC,后面可以了解一下配置完整版本的写法,那里面就有说明几个 CN DN,
有一个特步结构,这时就可以创建不止一个 CN DN。可以看到现在实例已经创建好了。
这几天我对文档里的安装尝试了好几次,确实会有值得改进的地方,有的地方是文档本身的叙述描述不够清楚,会导致操作失误。目前比较大的问题是镜像比较大,导致下载比较慢,后面可以尝试一下对镜像大小进行删减。本地安装一个 PXD,让这个过程更快,我们会进一步优化安装过程。
DOCKER 这个网站是开源的版本的文档,后面也会作为产品网站一个维度,当前是只包含文档自身的内容,阿里云里面是商业版的文档,两者不管是商业版还是开源,目标都是把内核能力做到完全一致,也就是涉及到内核的相关能力的时候,他们的内容会几乎一模一样,可能就是格式会有一点不一样,其它的也有一点不同,一些生态工具因为在云上可以很好的和数据库的其它一些工具,比如说 GMS 很好地配合,在开源版本里面配合是不太可能的,所以会有其他的一些跟开源工具里面的交互方式,这时它们的文档会有所不同,也就是内核文档相同,其他的周边的一些生态工具会基本不同,两边都会维护对应的版本最新的动态,是这样的关系。
接下来我们来看最后一步:
如何通过源码来安装 polardb-x,要是安装需要下载三个仓库:第一个是 GalaxyEngine,也就是对应四个组件里面的 CN 和 GMS,第二页也是对应 CN,分布在计算层,第三个是 GalaxyGlue,可以忽略,它是一个前两者之间通讯的私有协议的客户端。最后一个是 GalaxCDC,它是对应 CDC 组件一个仓库代码。
大家把代码下载到本地就可以开始编译的过程,同样地,可以看到这四个代码已经下载下来了:
下载完以后,就进行了一个编译的过程。因为 GalaxyEngine 是一个分支,也就是说它是用 C++ 来写的,它的编译过程就是 C++ 里面的一些编译链,也就是 cmake 一些工具进行编译,目前我们已经测试过的在 centerOS 都进行过一些测试,其他的性能还没有进行过测试。
现在来看一下下一个文档,首先它这需要安装一些依赖,比如说 Gcc7 和 G++7,然后一些其他的比如说 alternatives 这些库,这些直接复制去执行就好了。
这个文档我体验的时候,我发现有个不太完善的地方,就是以来 cmake 这样一个命令,这里并没有写,所以后面我会把它更新一下。而且也没有写 libaiscl 这个库,还有个 packge 这个库也没有,我后面会把缺的部分补上,这样后面大家看文档的时候直接就可以复制执行,并且不会出现任何错误。
因为我的 ecs 命令已经执行好了,接下来我们直接进行编译过程。编译其实跟编译一个 MysQl 是一模一样的,因此也可以参考官方的。这个 boost 库先可以下载下来,放在本地做一个指定。这些过程我就不再做了,编译过程相对来说比较久,大概需要九分钟。最后是 install,这样 GalaxyEngine 就安装好了,它最终跟 MysOl 的一些外部结构以及一些可执行文件的命名是一致的,也就是机器上面多了一个 MysQl,这就是 GalaxyEngine 的两个组件的编译过程。
接下来是 CN 也就是 Galaxysql 这个仓库,它的安装依赖于 mvn3 这样一个工具,或者说依赖 gtk8。这个文档也有两个地方不太合适,比如说 mvn 不要用下载的方式,可以直接用 installer mvn 的方式装在本地里,只要它是版本 3 就行。装好之后,第二步是直接把 GalaxyGlue 这个工程移动到 Galaxysql 这个目录下面,把名字改为 polardbx-rbc。最后就可以开始 Galaxysql 的编译了,编译好之后会最终生成一个包。这个编译的过程如果是第一次安装的话,可能需要半个小时。这是 CN 的编译过程。
最后一部分就是 CDC 的安装过程,CDC 也是用 Java 写的,所以跟前面的 Galaxysql 差不多,也是在本地进行编译,编译好之后在本地生成包,这个组件的编译过程相对来说比较快,两分钟以内就能搞定,编译好之后我们得到三个部分:GalaxyEngine,Galaxysql,GalaxyCDC,也就是我们得到了四个组件的安装包,之后就可以启动了,启动的时候也是直接按照这个脚本进行操作。最终启动 DN 的时候,会在文档里将和 GMS 共用一个进程,也就是一个 GalaxyEngine 的进程,它同时也扮演了 GMS 和 DN 两种角色,在启动 GalaxyEngine 的时候,不要用 root 账号启动,用 root 启动会报错,这个启动完以后就可以启动 CN 了,CN 需要对文件进行一个简单的修改,修改的话是修改 conf/server 这个文件,再改的时候注意不要把这段代码直接复制,这种方式是不可以的,我试的时候发现了问题,因为这里可能说这几个参数是要去修改的,而不是直接复制。把配置改掉就行了,正常情况下只需要改 server-port,其它情况是一样的。
CN 的参数改好后就可以直接进行初始化了,赋值后直接运行,运行后会出现:
这说明初始化已经好了,好了之后需要找到类似于这行的每个配置,也就是将下面这个配置写到 server.properties,这样 CN 的配置文件就写好了,然后就可以启动实例了,就可进行一个验证,验证的时候用 MysQl 直接可以了。
我已经按照这个过程安装好了,可以看到直接连接到上面。
最后一步就是启动 CDC,他跟前面的 CN 也差不多,是将前面的关键的配置进行修改,修改的文件叫做 config.properties,然后找他让你修改的配置,改好之后直接进行启动,启动的命令是 bin/demon.shstart,这样就可以了。现在从源码编译 PXD 的过程就讲完了。
最后附的是 mysql 的配置文件,在体验的时候可以直接复制,这就是从源码来安装的过程。
GalaxyEngine 的副本是阿里里面自研的一个协议的库,目前在商业版里面已经有具备副本的能力,在开源版本里还没有正在开发,如果进度可以的话应该在三四个月后会放到开源的仓库里面,也就是 GalaxyEngine 的库里面。
PXD 里面做的是 MysQl 的生态,大家可以看到 GalaxyEngine 本身就是 MysQl 的一个分支,其实 GalaxyEngine 也可以当作功能更强大的 MysQl ,去替换原来的 MysQl 也没有任何问题,而且我们的目标也会做到跟 MysQl 一样的地位,不仅仅是 MysQl 的一个通信协议,也会去做一些兼容,所以如果喜欢用 MysQl ,也可以尝试换用 PXD,这也是 PXD 为什么号称兼容 MysQl ,所以它不仅是 MysQl 的通信协议。
在后面使用 K8S 部署的时候,使用 minikube 可能会报错,就类似与现在的画面:
其实错的原因还是权限的问题,它的解法在文档里面给出来了,需要加到 DOCKER 的组里面,退出去重新进一下就好了。
GalaxyEngine 目前的版本是 8.0。