一、架构介绍
(一)分布式集群架构
首先介绍一下基本架构。
上图左边是PGXC的典型的架构图,PGXC是PG的一个分布式的版本,也是PG最重要的分布式版本之一,目前在国内的大型公司如阿里、腾讯等都是用类似这样的架构来做分布式。
它包含几个角色,分别是CN、DN和GTM。
CN接受用户的业务请求,包含了全局的Catalog,所以它可以根据业务请求到各个DN上去获取数据,把数据获取回来以后,它会把这个数据再返回给客户。我们虽然不是完全基于PGXC来开发我们的PolarDB分布式,但是我们会用到PGXC的很多组件和一些思想,所以可以看到上图的右边,我们的系统里面也包含了CN、DN、事物相关的、GTM相关的一些组件。
在这种情况下,整个集群的管理方面,我们采用了pgxc_ctl的组件来进行集群的管理,从运维和管理这个角度来看,我们就不需要自己来开发了。
另外,我们用pg_cron的组件来做集群的心跳的管理,所以它会定期调用pgxc_ctl进行主备切换,故障检测等类似的动作,至于底层的这种DN节点或者CN节点的控制,使用的是PG原生的initdb和pg_ctl相关的这些组件。为了便于用户使用,最外边我们开发了onekey这样的脚本。针对docker环境我们开发了一些脚本,便于用户更好地调用pgxc_ctl对整个集群进行控制。
虽然现在CN和DN都是存在的,但是可能后期我们会做CN、DN的合一,另外就是GTM和CN可能也会合一,因为我们的GTM使用的是逻辑时钟,它不需要像PGXC这种snapshot的方式传很多的数据,所以可能放到CN上会更合适。另外这一次我们主要是开源了DN组件,CN和GTM的很多功能是没有开源的,但是代码里面可能会少量的涉及到这部分的内容。
以上就是它的一个基本架构。
(二)高可用架构(流复制、Paxos三副本、Active-Active逻辑复制)
下面讲一下高可用架构。
可以看到图中左边和右边的两个分别是三套集群,这三套集群可能部署在不同的区域。左边这套集群是有了我们的CN、DN,首先它的CN和DN是支持主备的,而它主备的方式包含好几种,第一种就是PG原生的流复制的方式进行配置主备。另外,我们扩展了一个Paxos三副本方式的主备,除了这个之外,尤其是不同的区域的DN之间,我们可以配置双向逻辑复制这样的主备关系。
双向逻辑复制的特点是可以在任意的节点上写请求,并把这个企业请求同步到它的复制组上的任何一个节点。当然,现在不完善的地方可能还是在冲突情况下的检测方面,这方面可能需要客户自己来控制。另外,逻辑复制有一个更大更好的特点是可以很容易地过滤日志,这样在跨数据中心场景下,其实不需要所有的日志都同步到其它的数据中心,比方说有些比较不重要的,或者是一些类似于vacuum这样不是很重要的操作,其实可以不用同步其他数据中心。在这种情况下,它的数据量会减少,所以在做跨数据中心的场景下,这种部署其实是很有意义的,现在已经开源的就是流复制和Paxos三副本的这部分。
总结一下,现在主要DN角色里边的流复制和三副本已经开源出来了,后面会开源整个分布式集群的CN和GTM其他相关的分布式能力,另外,高可用或其他的一些功能会陆续开源,目前现在CN和DN都是支持高可用的。
二、编译、部署
(一)代码下载、编译
首先,大家如果要使用我们的PolarDB,可以到我们的开源网站上看一下。
这个就是我们的PolarDB开源网站,在里边可以看到,首先是有Code的界面,点Code里边的绿色图标就可以把我们的代码的路径给下载下来,就可以通过gitclone的方法把代码拷贝到我们的自己的服务器上,对它进行编译和修改。
另外可以看到,界面上包含Issues和其他的部分,上面是‘star’,希望大家也都帮我们去网站打星,收藏我们的地址,以后就可以更容易地找到我们的网站。
下面用gitclone命令加上刚才拷贝的代码路径,就可以下载这个程序了。
我们刚才用gitclone已经下载的code,可以看到我们的code目录的布局是这样的。为了方便大家进行编译,这里只要调用build.sh就可以进行源码的编译,一键式的编译让大家可以更容易的编译。
现在我们可以演示一下编译脚本做了什么事情。
首先可以看到它包含了Deploy、verify、debug相关的一些参数,这里面比较重要的就是它的安装路径,按照这种编译之后,它会把我们的程序放到当前的路径下,之后这里面可以选择在build.sh后面增加Deploy、verify、debug参数,默认是Deploy这种方式,它其实就是编译的一个Release的版本,如果大家想编译debug版本就在build后面加一个debug就可以了。
编译的时候其实都是大家熟悉的,调用就是一个config的过程,另外就是make和cmake的过程就是进行相关的编译,另外会有其它组件的一些编译。
编译完成后,我们切到目录下来看一看它的数据有没有更新,到这一步可以看到现在这边[enjoy coding]了。
这种情况下说明已经编译成功了。
可以看到它整个的二进制已经更新了,并且放到了我们指定的编译目录下。
(二)三种部署方式
下面再介绍一下部署,包含三种方式。
第一种是一键式的部署,为了便于用户使用,用户只要调用OneKey.sh脚本就可以完成部署,它会默认地在单机上生成一个有三副本的一套环境,但前提是需要安装系统的一些配置。
第二种是Docker部署,我们有很多Docker的使用者,他们可以用Docker的命令来生成这一套,这种环境在Docker里面生成。另外,它也是使用默认的三副本的环境。
如果大家想自定义安装,安装一个不是三副本的,比方说安装流复制或者安装不同的机器,就可以用第三种这种方式。
下面我们分别介绍一下这几种方式的使用。
(三)环境依赖设置
首先是安装整个OS系统依赖包相关的一些配置,这里面包含依赖的软件包的安装,另外需要安装系统的环境变量,要为系统增加互信,互信增加了之后,在某个节点执行命令之后,因为这两个机器建立了互信,所以不需要再输入密码了,这样便于进行后面的一些操作。
这个过程我们也可以做一个简单的演示依赖。
首先可以下看一下这个命令,刚才的点了之后它会让我们输入ROOT密码,因为这些包已经都安装完成了,之后可以看一下我们环境变量的配置。
看到这个环境变量的文件,其实我已经把信息加进来了,要改的主要就是PASS和LIBRARY PASS相关的这两个路径要让它设置上来,便于它在敲命令的时候,自动到我们的安装目录下去找这个程序,否则可能找不到。
上面有其他的路径,比方说这套系统里面我们有多套PG环境,可以通过这种方式来切换环境,这里面的用户名大家可以换成自己的用户名。
接下来我们看一下运行的互信命令,它会把你的Key拷贝过来,这样多个机器上就可以建立了互信。
在建立互信时,本机的IP也要输入一下,本机也要建立互信,这样才能全都打通。另外因为现在这个已经安装过一次了,执行过命令了,所以这里面提示已经安装过了,否则跟大家一样就会执行成功。
互信相关的一些配置完以后,系统的环境就部署完了,之后就可以调用我们的脚本了。
(四)一键式部署
onekey脚本可以在这个界面来看一下。
onekey在程序的顶层目录下,首先我们去执行这个脚本,加一个参数‘all’,就是一键式把所有的信息都装上。首先可以看到,它其实是做了一个编译的过程,所以如果你要调用onekey,其实前面编译都是不用关心的,它会自动实现。
这里简单介绍一下onekey脚本的工作原理,其实很简单,它里面包含了很多个跟安装部署有关的步骤,这个all相当于就是所有的步骤的一个集合,如果大家对整个集群相关的一些命令不是很了解的话,也可以通过这个文件去查看它的一些用法。
首先路径我们是指定了刚才的安装路径,就是polardb下面的polardb home目录,这个目录就相当于是我们编辑以后程序会安装到这里。在这里我们首先会去调用它的build命令来进行编译,编译好以后就创建了一个目录用来存我们的配置文件,之后调用pg_ctl底下提供了一个命令,有一个prepare的参数会生成各种各样的配置模板,standalone就是单机的模板。我们现在生成的单机模板具有三个副本,它会把模板生成到这个文件里,所以等下可以打开这个文件,看一下它参数的使用情况。
下面的这些步骤分别使用了它的模板来进行部署,部署相当于把刚才编译好的程序安装到各个机器上,因为你可能有多台机器,‘all’是会把它部署到各个机器上,之后就会把这个系统的环境进行一个clean,它其实是一个相对比较危险的动作,会删除数据,所以大家在用之前需要小心一点。
这个init相当于就是调用init DB来创建整个数据库,并且启动整个集群。之后是Deploy,相当于可以deploy all也可以deploy cm,cm就是我们的经营管理。最后我们调用了一个monitor,查看一下集群的部署是否成功,它的状态怎样。
执行完后,相当于刚才就调用了这样的一条命令,onekey.all做的事情刚才已经讲了,先编译之后进行初始化,初始化的时候创建了DB,之后创建了它需要的一些扩展,并且server也启动起来了。
从monitor看,目前这三个节点也都已经启动起来。可以认为这个环境是执行成功的,接下来我们看一下进程。
可以看到这几个进程都是存在的,第一个是dn.master,相当于主节点的进程,下面这个是它的备节点,再下面是它的第二个备节点。可以看到这几个节点都是启动的,包括它们内部的一些程序都是存在的,之后我们调用一条命令。
这条命令主要是调用psql连接到数据库‘_c’执行一条命令,查看一下我们集群的状态。
而pg_stat_reputation命令这个视图是PG原生提供的,它主要是用来查看 PG的流复制的状态,主要看WAL Sender和WAL Receiver之间如何传递数据,传递数据的位置是怎样的,所以这里可以看到它的数据,包括它数据的回放传输位置,Flash的位置都是一致的,相当于两个节点是同步的,这个状态是正常的。
针对三副本,我们有三副本视图,这个视图叫polar_dma_cluster_status,通过这个视图我们可以看到整个三副本的状态。这里最重要的是role,现在我们默认这套集群有一个主节点,另外两个是follower,当然我们的三副本还有leaner、logger角色,但是这里现在默认我们就是建了一个组,两个follower集群,这就是一键式的部署方式。
(五)Docker 部署
下面我们讲第二种部署方式,Docker方式部署。
这里可以看到,首先我们用docker build的来创建一个docker的镜像,它的参数f指的是我们自己写了一个docker的配置文件,因为配置文件来build我们的环境,现在的镜像的名字就是我的名字。
之后我们可以查看一下镜像它的构建情况,之后会演示一下如何运行Docker,运行这个Docker之后可以看一下容器的一个情况,包括我们在运行Docker的时候,Docker内部的端口和外部的端口情况。
另外看一下我们从外边连接Docker,看怎么去访问Docker,里面已经安装好了这套实例。另外我们会演示一下,进入到Docker去看一下它进程的各方面是否跟原来在外边部署的情况是不一样的。
接下来看一下Docker的部署演示。
这个我是准备的另一台机器,为了防止之前的有干扰,运行之后大家可以看到,这个过程包含了14个步骤。首先下载centOS之后,安装相关的依赖软件包,之后进行相关的系统里边用户的创建,包括cmake的一些配置,最后是调用一些类似ssh keygen来产生互信相关的一些key,最后会调用onekey来进行整个的集群的安装。调用了这个之后,整个的Docker里就安装了三副本的环境,用的也是onekey的默认参数配置来实现的,后面我们就可以连接进行一些查看。
这里面可以看到14个步骤都成功以后,会告诉我们创建成功。
之后我们可以查看一下它的建好Image,之后我们就可以把docker的Image给它run起来。docker Image启动起来之后,我们还是用刚才的这条命令,通过PSQL来访问Docker的环境,之后我们用命令可以看到Docker的启动状态,现在也是用PSQL连Docker,连接的用户使用我们默认给Docker里面创建的PostgresSQL的用户来连接,连接的时候也是访问了这条查询语句去查询Docker里的主备状态,之后我们再登录到Docker里面去看一下。
可以看到已经进入到Docker这个机器里了,看到我们刚才的程序,还有我们安装的数据都是在的。可以看到进程包括 dn_master、dn_slave,还有dn_leaner都是存在的,这意味着Docker环境已经成功。
(六)自定义部署 - 多主机流复制环境部署示例
接下来我们介绍自定义的方式的部署。
这种方式部署就可以自己来定义想要的相关部署参数,生成一个自己想要的集群。下面我们演示的是在多台机器上生成一个流复制的环境,而不是这种Python默认的环境该怎么做。
第一步还是用我们的模板生成跟刚才一样的文件,复用刚才那个也可以,名字我们就叫它streaming,之后我们对streaming文件进行修改。
如果搭建一个两台机器的环境,我们需要分别指定这两台机器的IP,也就是Master节点和流复制的Slave节点的IP地址。另外,这里RepNum需要修改,因为默认是三副本,这里的副本数应该是两个,而我们现在流复制只有一个副本,所以它的改成一个即可。SlaveType默认是3,改成1就可以了。
另外,加一下dePgHba的信息,保证它们之间这两台机器的连通性。改了配置文件以后,我们就用配置文件调用它的init,就可以把整个集群部署起来了。部署起来之后通过 monitor这个方法查看一下这套系统的部署情况。另外看一下它的进程情况,再看一下它主备状态的情况。
之后我们看一下,首先把原来那个删掉,要不然可能会有影响。之后我们来touch文件,此时可以看到这个文件是存在的。
我们调用这条命令把我们默认的参数模板信息加到这个文件里面来。
可以看到它执行成功了,此时可以打开这个文件来查看一下。
这就是我们默认生成的文件,默认生成文件刚才提到了这里边要改的是几个信息。
第一个是 datanodemasterserver,因为我们是都是在本机上来执行的,所以用的都是localhost的本机信息,我们要改成远程的IP。把它的IP改一下,改成这台机器,主机我们准备装在这台机器上。
第二个是datanodeslaveserver,它会装到这台机器上,之后会改datanodeRepNum和SlaveType,我们接着往下看。
可以看到这后边有一些注释,现在我们要改流复制,SlaveType这块是1,1就是流复制的这种方式,最后我们再加一条信息,这条信息为增加一个hb的配置信息,datanodePgHbaEntries就是用来加这个信息的。这个信息支持加多条,所以你如果有其他需要的话,可以通过这种方式加多条。信息加完了,配置文件就配置好了,配置好了以后我们就用配置文件来尝试启动集群。因为刚才我们启动了一个三副本的集群,后来把它给删掉了,所以可以看到这里现在没有在副本的集群相关的进程信息了,它是一个全新的环境。
在全新的环境,我们准备装一个流复制的环境,刚才用的是83这台机器,还有92.86这台机器,可以看到在86的机器上,其实它也是没有 PG进程了。
安装之后我们再看一下它的结果,正常来说在83上应该有它主机的相关信息,而在86上安装的是备机的相关信息,这样它俩就形成了一套流复制的环境,这个过程就是在对这个节点进行初始化,看到Master、slave,并且最终启动。
接着我们再查看一下进程,可以看到master进程已经安装好了,是在这台机器上的,它已经启动起来了。
同样再看一下86这个机器的进程,它的进程也已经部署好了,这台机器用的是slave进程。
这就是它的过程,可以简单看一下它的一些状态,比方说monitor是不是成功了,另外可以看一下进程,流复制的状态也是没问题的。
以上就是三种部署方式的大概流程,简单回顾一下,首先需要建依赖,之后可以一键式部署一个三副本,用Docker建一个Docker下的环境。另外,如果你让自己复制流复制和其他的配置,那么你自己来建。
三、集群配置
接下来介绍集群相关的一些配置。
集群配置里包含几个部分,第一个部分是公共配置,这里比较重要的是安装路径是怎样的,另外Standalone控制单机版还是集群版,包括备份目录的设置,还有角色的设置。
还有一些DN相关,包括DN的公共部分,DN主备,可以看到跟主相关的都是Master,备相关的都是slave参数,包括IP地址、端口、同步状态,还有相关路径,包括数据路径、日志路径、开发日志等路径。第三个节点名字叫learner,但是这个learner就是第二个备,它有可能配置成follower,也可能配成learner。
另外就是我们为了分布式,扩展了CN和GTM相关的一些配置,另外多个CN的配置,当然如果有集群,我们一套机器里面可能有多个CN,也可能有更多的DN,这种情况下该如何配置。
简单来看一下配置文件。
这个配置文件是生成的配置文件在这个目录下了。先看一下默认单机的模板,可以看到这里面刚才看到它的公共的部分,跟datanode相关的几个节点的路径,刚才可以看到刚才那几个进程显示的它的路径在这个位置。之后他它的Master相关的一些IP地址的配置,slave相关的一些地址的配置,learned的一些配置。还有比方说我们配置好以后,我们的每个DN节点,其实它是类似于一个PG的节点的角色,PG本身它内部也要配置很多参数,所以我们可以简单的在这里边追加一些对于PG的一些设置,比方说我们的内存使用多大,或者连接数什么的,这些配置都可以在这里面进行配置。包括hba还有配置文件,我们可以使用自己的配置文件来进行配置,在这里面进行一个设置。这个就是一个单机版的一个情况。
下面看一下集群版,虽然现在还不支持集群版,但是它的配置基本上如图所示,这里可以看到有很多东西比较类似,属于公共的部分。
但是这里面会用到GTM相关的一些东西,还有coord这些是我们没有开源的部分。
这里配置的是三个datanode,可以看到写法是这样的,用空格把它们隔开,三个datanote的名字也在上面,部署的机器、IP地址、分别的端口都有。
这套三个DN都是的Master配置,之后我们还需要配置对应的这三个Masters的slave的配置,就是它的备机。可以看到备机也是三个,前两个配了,我不想让第三个有备机,所以我就设置成None,这样的话可以看到它有多个DN的情况下的一些配置,其他跟单机配置是类似的。
以上就是集群相关参数配置的讲解。
四、运维管理
下面来看一下集群的运维管理。
运维管理包括系统启动,用stop all或者start all来进行启动和停止。
另外就是部署,刚才已经简单提到了,包括init初始化集群,包括查看它的相关状态,查看状态可以通过指定某一个DN来查看。目前只有一个DN,现在inti all就可以了,一个DN的三副本都可以查看到。以后有多个DN或者有CN的场景,我们可以在这个地方指定,只查看某一个时间点,前面这些start命令也都是这种情况,可以指定只启动或停止一个DN节点,包括failover的命令,也都是可以单独指定某个节点。
还有查看系统的参数配置,PG的参数配置等操作,下面简单演示一下。
这里面先看一下它的Monitor,所有节点的状态会打印出来,这里面datanode1已经打印出来。
还可以看到它的一些集群的配置参数,包括CN和GTM其实都是空着的。这里包括它的一些log参数,还有一些其它的配置信息。
这就是所有跟配置和运维相关的命令。
五、获取帮助
最后介绍一下,如果大家在使用PolarDB的时候出现了某些问题,如何来获取帮助。
如上所示,主要有三种途径。
第一种,在Readme文档里面有各个架构文档,还有其他文档的导航,大家可以去这些文档查看帮助。
第二种,可以在我们的网站上提一些Issues,另外也可以查看一些别人的发起的问题,并且这里面有回复,具有一定的借鉴意义。
第三种,扫码钉钉群,目前我们钉钉群里已经有将近五千个PG爱好者,也包含阿里内部很多技术专家,所以如果大家这个在里面提问,很快就会得到回复,这也是很好的学习途径。
现在我们看一下网站画面。
其实在Code的主页里下显示的就是Readme的信息了,这里面可以看到Reamme的基本介绍,包括导航安装,可以导航到架构里面去。
如果没有上文刚才提到的部署相关的东西,在这里边也可以看到,在Docker情况下我们怎么部署;怎么去部署几个系统环境的三个准备;怎么调用一键式的命令;怎么去查看我们的这个系统部署是否是成功了;最后在这种源码部署的场景下,怎么去修改配置,怎么产生配置,怎么去启动,这些运维的命令也都在里边。
后面有架构相关的一些文档,包括Roadmap,包括其它相关技术点的介绍。除此之外,刚才演示的Issues这边可以看到大量的issue,这里很多大家原先出现的问题已经得到了解决,从这里也可以获取一些帮助。