开发者学堂课程【PostgreSQL 快速入门:PostgreSQL 表级复制-Londiste3安装以及使用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/16/detail/70
PostgreSQL 表级复制-Londiste3安装以及使用
londiste3是一个模块,它的原代码,一个是在 git.postgresql.org 这个网站里面。
可以去看到它的源代码,另外一个就是在 Pgfoundry.org 里面。
去搜索 skytool 这个 project 就可以搜到他的那个源代码,还有一个在 skytool.got 网站里面,以 git.postgresql.org 和 Pgfoundry.org 这两份为准。
它的安装首先是要把它的源代码下载。可以从 SkyTools3.1.5这里下载,这个地方下载的是一个 release 的版本,然后如果是在 git.postgresql.org 这个地方下载它,可以下载最新的版本,就是下这个 APP 就可以点这个 student,它就会有个下载图标,下载 snapshou 就可以。
我们这里以 git.postgresql.org 这个为例来进行安装,如果是从这里安装,看一下 INSTALL 这个文件,它需要有一些依赖包,比如 postgresql 是从源代码安装的话
包括 postgresql libpq-postgresql-server-dev 和 python python-dev。
如果是通过 GIT 安装的话,需要 git autoconf automake asciidoc xmlto libtool 这些包,如果需要用到 python,则需要用到 psycopg2这个模块和 rsync,
因为只使用到它的 londiste3这个模块,所以就不需要安装 rsync,其他的都是需要的,通过$ git submodule init 和$ git submodule updata 去安装两个 git 模块,然后再通过/autogen 自动产生一个配件,就是 configure 这个文件,然后通过这个文件的时候 make 就可以了。
那么如果是从 SkyTools3.1.5这里下载来的,只需要执行:
$/configure --prefix=...
$make
$make install
这是一个简单的安装的一个说明,比如说 python 如果不用默认路径的话,我们需要指定一个路径。
还有 pgconfig 指的是 postgresql 安装完之后,pgconfig 二进制文件的一个路径,也是全路径,然后另外安装 asciidoc这样一个包的话,就是也可以去指定他,之后需要建立两个 python 的文件安装,然后就可以去看 documentation,这就算全部安装完。
其实 skytools 这个软件里的 README 它包含了三个部分:PgQ、Londiste、walmgr。
先看 PgQ 模块,
它主要的话是产生一些表的一个记录变更的一些信息,然后把它存到一个队列里面,它是通过 PL/pgSQL Python and C code 代码写的,然后他的思想来源于 slony -1的 snapshot-based event handing ideas 这样一个思想,
然后候 PgQ 提供有效的基于事物的队列系统,这个队列支持多节点,也就是说它支持一个队列拆分成多个消费者,并且支持一个队列拆分成多个部分,分发到不同的这个消费者去,同时还支持 favors and failover 和可以有多个消费者,一个消费者也对多个队列,那比如说这个规则是这样子的,在一个数据库当中可以创建多个对应点,还有就是队列消息的产生者可以插入到任何一个队列当中,一个队列可以有多个消费者,同时消费者下面还可以挂子消费者,子消费者也可以把队列消息复制过来,这些消息可以分发给下面的消费者。
PgQ 的话,其实它分了三个层次,一个是 product,也就是消息队列的那些消息的产生者,然后一个是 ticket,就是说把这些产生的消息,按照事务的最小力度,可以把它做一些切分。
比如说 ticket 里面包含三个事物,连续的三个事物产生的一些消息,然后这些消息作为一个大包,批量的生成消费者需要的那个数据。
也就是消费者从 ticket 生成出来的一些大包里面去取数据的。
然后这些取出来的大包是以单个事务,也就是说合并了多个事务,它就转换成单个事务在消费者里面去执行。也就是说 skytools PgQ 是支持事务的,同时它还有一个 ticket 可以把多个数合并成一个大的包,然后去让这个消费者去执行。
然后这里所说的文档包含:ticker deemon、admin tool。admin tool 管理工具名为 qadm,这个 PgQ 对应的那个应用程序接口,就是说 londiste 其实是是一个已经写好的应用程序,去调用 PgQ 的应用程序接口,来完成了一个数据复制的功能。
我们自己开发人员也可以去自己去调用这些 API,去完成你自己的一些二次开发。然后第二个模块是 Londiste,它是一个 replication 的工具,复制工具,它使用 Python 写的。
然后他是使用 PgQ 这样一个消息队列管理作为一个事件的传输。它的特点是表可以一对一的添加进去。比如说我可以一个一个的往里面添加表,添加到这个复制队列里。
然后初始化的 copy 是当一个表再做初始化数据的 copy 的时候,其他的这些表格就跟他没有关系,他们的这些事件是可以同时被 reply 到消费者,然后数据的比较是可以任何一端去做数据比较,就是说我在复制的时候,比如说从a库的 table one 复制到 B 库 table one,那么我可以去比较这两个这个复制的数据是不是一致。那个文档是在doc/londiste3,txt 里面。
然后 walmgr 是我们自己不需要用到的,它其实是一个 WAL 的一个管理工具。
然后后面是源代码的一个结构,比如说 doc/里面是包含了一些文档,python/这个目录里面是包含了这个 python 的一些模块,以及主要的可执行文件。就比如说这个 londiste、qadmin、pgqadm,这些都是 Python 写的 Python 脚本。
然后这个 Python/pgq 这个目录里面就包含了这个 pgq 的 python 的一个框架,然后 Python/londiste 这个目录里面包含这个 londiste 的一个复制的一些源代码。
然后 Python/skytools 这个工具里面包含了一些比较低级的底层的一些工具,就是说对于维护人员来说是不需要直接去使用它的。
sql 里面包含了数据库的一些模块,然后 sql/pgq 里面的这个目录里面包含了表的定义及函数。就是说被 PgQ 它用于做这个消息产生的一些函数,pgq_node 是作为这个级联的消费者的一些这个 SQL 的一些函数。
然后 sql/pgq_coop 这个是指消费者协作的一些函数。然后还有这个 sql/londiste 目录里面是包含了这个表的定义以及函数的定义,就是 londiste replication 这个复制框架里面的一些所需要用到的表的定义和函数的定义。
sql/ticker 使用 C 语言写的,就是对多个事物做这种合并,然后组成大的数块。然后脚本里面包含 python 的一些脚本,然后 lib 目录里面是包含了 PGQ 用到的 C 库,然后 debian 这个目录里面是包含 debian 的东西。
我们在做这个复制的时候。比如从3.150的数据库上复制到3.330数据库上。
那么安装的话,只需要在 skytools 任意一个节点,不需要在这两个库同时安装,现在我进行重复安装软件,进行演示。
python 是已经安装了一个2.6.6,那么如果我们要先安装一个2.7.6这版本,我们可以去 python 的官方网站去下载。
在安装的时候,去下载这个源代码 source source,然后再去编译安装,解压完了,会解压成一个目录。然后我们看一下它这个配置是什么样的,比如说我要安装到
$./configure-enable-shared-prefix=/opt/python2.7.6,然后允许 shared,的是因为 status 要用到 Python-dev,也就是说要用到它的一些库,来看一下我们怎么安装 Python,然后解压然后 CD 到 Python-2.7.6这里去配置。
就说我要安装这里,然后这里指定去生成一些共享的动态链接库。配置完了之后就 make install,我们还要把 Python的这个 lib 目录加进来,安装完到这个安装目录里面,
把 lib 目录就加到 vi/etc/id.so.conf 那里面去就可以了,
然后在执行 config-p 去看一下。Python 就安装完成了。
接下来,我们要看一下他还依赖一些什么东西,比如说我是从 git 里面安装的
那么我需要这些东西可以使用 yam 来安装那种,因为 Python 的话,rsync 可能已经有了。只使用到它的 londiste3这个模块,所以就不需要安装 rsync,然后接下来要安装的是 psycopg2,在 Python 的一个库里面可以下载,
现在这个 git 依赖的一些东西已经安装好了。
接下来我们看一下就是安装 psycopg2
它的安装很简单。使用这个版本去安装 Python setup-py build,然后 Install。
模块安装好了之后,在目录里执行$ git submodule init 和$ git submodule updata 执行这两条命令。
但是这里必须用$ git clone 去执行,把它 skycools 直接克隆下来,
然后再执行$ git submodule init 和$ git submodule updata 执行这两条命令,然后再去产生这个配置文件脚本去指定一些东西。
这个 londiste 安装到 skytoolsdev 目录下,然后去指定 python 的全路径和 pgconfig,安装到 pg93,这样就可以完成配置,
之后去 build 的 pkgloader 和 skytools,可以加入到
/opt/Python2.7.6/bin路径里,
现在 skytools 就安装完了,看一下 shared dev 里面,它就包含一些需要里面有一些文档,然后 londiste 里面就是可执行文件。
其实他比如说执行 londiste3.2的,就能看到它的版本是3.1.5,
使用 replication case
第一个 replication 来看一下要复制哪些表。
比如说要从3.150复制到3.33,环境安装好,来到 pg93,这里面会涉及到一些我们要复制的东西,
复制的话,因为表是放在 schema 里面,所以说表和 schema 尽量去做到一致,比如说这里有个 digoal 库,
但是不打算放到这个 digoal 库里去,复制到3.39,这是一台 sender 主库,比如说创建一个库,用一些用户去做复制数据库的用户 pg93这样的数据库,我们用 digoal 这个区域复制。
然后是这里面是通过 digoal 用户的 digoal 数据库里面有个 schema,把这个 schema 赋给 digoal,否则不能用。
要复制的表叫做 user info、user session、user_logout_rec、user_login_rec。
然后创建在 test 下面这个下。把这个 test 用数据库赋给他,权限赋给它。
当环境从一个节点到另外一个节点,schema 不一样的时候,我们在做 out table 去执行那些 sql 的时候,你会发现在消费节点的话,它可能不会执行成功,比如说 alegal.table 去增加一个列,然后他在 controller 去执行的时候,他也是 alegal.table,但是 controller 里面用的是另外一个 name,可能会复制不成功。
为了体现这个问题我们还是来使用不一样的 schema,比较好体现这个问题,包括这表明也其实也是可以不一样。
这里其实从一个库复制到两个库,那我们这里的话,也可以从一个库这两个库,
比如说我在这里创建两个库,一个在 db1,另一个在 db2,是从 digoal 这里复制出来的,复制的时候一定要有主见,他也会报仇,就是不让复制。
主环境要创建,之后要去创建数据库,连到/c digoal_01 digoal_01这里面去创建一个密码,创建好之后,去创建这些测试了,测试了相当于是会创建在这个 schema 下面,schema 和用户名是一样的话就能直接看到。然后生成一些初始化数据,初始化数据总共是20万,然后之后我们去把这个 Primary key 加上 user info、user session,现在数据已经弄好了,这个 PK 已经有了,
现在要模拟用户登录一个函数,创建用户退出的函数。这两个函数一个是用于登录,一个是用于退出,登录是一个查询语句,然后是创建测试用户和测试库,准备目标库1,在 pg39创建这个数据库,第一个消费者跟主库一样,去创建那些测试表,要负责那些表,就先把这些数据库创建好,
之后准备目标库2,名为 digoal 2这个数据库,
在做 DDR 复制的时候会有一些问题,这个问题可以暴露出来,能知道这些问题,
看到这这两个 user info、user session 表名也不一样,同时 schema 也不一样,就是跟主库的都完全不一样。
接下来要安装 skytools 节点的配置文件,这个配置文件安装在 pg93这个文件下面,配置放 londiste 配置文件的目录以及日志目录和 pid 文件目录,首先要创建一个这个源节点,也就是 master 节点的一个 londiste3的配置文件,把它创建在 pg93这个文件下面,
然后把这个面料稍微修改一下。这个源数据库是3.150,端口是1921,用户的话,我们使用 digoal_01。
另外一个大家注意用户就不能用了,因为超级用户去到里面去创建一些东西。就是我们在启动的时候可能会报错,启动这个我们都用超级用户,因为它库里面创建密码,包括 schema,还有这个 PgQ 的一些东西,普通用户是创建不了的。那我们先看一下这个密码是什么,把密码改掉。
这样的话,就比较轻松了,就直接超级用户,然后库名,这是原库的库名,然后这里面是我们的一个 pid 文件。还有一个问题放在什么地方告诉他?队列的名称就是相当于生成数据放到这个里面,这个源节点是一个 product 决定的,
他把数据生成数据在这个队列,消费节点的名字要和它一样,比如说我去队列去消费消息。然后这个时候的话,创建根节点的话就直接这些命令,里面包含的配置。
比如说我连这个数据库的用户名密码,3.150这个数据库。然后我创建这个节点名称,指定是在 pg93。LONGEST3,这个时候节点创建完成,
他会告诉你它里面地安装了 PgQ。
然后他还安装了一些 PgQ 里面的函数,这些脚本都制定好了,刚刚我们在执行完之后,我们可以看到它里面会多出几个 schema,包括 londiste、pgq、pgq_ext、pgq_node,这些都是 PgQLONGEST3这个东西帮你创建。同时还在这些 schema 下面。
我们可以看到创建的一些东西,比如说这些是一些序列、索引、序列、表,以及消费者的一些相关信息存储,比如说有几个消费者正在查看表,事件表是三个表做轮询。
相当于我生成的事件,然后这个事件会去 ticked,是把这个事件里面的一些事物,就是说 londiste 他要用 txid,txid在数据库里面是真的,比如说 txid 是316733436,然后通过控制文件里面有一个叫 timeline,
当你的时间线,比如说你要把一个数据库到另外一个数据库里面,同时数据库要有一些队列,有一些队列还要继续使用的话,我们导完之后,其实这个 txid 可能变小了,londiste3是不允许出现 txid 变小的情况,就是你的消息队列其实包含了这个信息,就是每一笔事物号都包含在里面了,当你把一个数据库到另一个数据之后,你这个 londiste 就没法使用。
怎样才能让他重新使用权,必须要把你的当前数据库的一些 txid 要设置成大于 londiste3里面已经存储的那些记录的上面 txid,怎么改?
通过改这个 londiste3就可以,这样的话相当于强制把你的 txid 就改掉,改完之后的话,那么你在那个新的导过去的那份数据就能够使用那些 londiste。否则不能使用。
接下来要启动一个 worker 进程,这个 worker 进程是跟随 londiste3的那个进程去一起使用。根据配置文件然后启动这个文件。这个 worker 进程算是启动了。
然后接下来的话,就要创建消费节点相关的一些数据,比如说第一个消费节点叫 DST1,启动的时候注意指定的配置文件是 dst1,这个叫创建叶子,叶子节点的名称就是 dst1_digoal_01.log,叶子节点的主机是放在3.39,端口是54325432,然后数据库名,用户名,密码,Provider,就是在这个叶子节点它的 provide 就是他的这个 provide 的连接配置。
错误:
那么 provider 配置是这样,现在看一下他在创建,这个的时候发生了一个错误,我们看一下为什么会发生这个错误,它说连接这个数据库的时候出现错误,我们看一下是不是不能连。
这个库是可以连过去的,我们看一下是不是有地方写错了。Provide 是301501,这里都没有错,然后再回到这里来看一下,然后看一下这个报错,Read from area on connect could not access fire,不能够访问这个文件。
不能访问这个 pgq lower level 这个文件,原因是因为这台没有 londiste 库文件,需要我们在这个家节点要去安装 skytools,这个 level从skytools 来的,也就是说这个文件3.39上面没有,因为它安装这个函数的时候,这个函数它是需要用到这个文件,我们可以去看看他这个函数的一个结构,我们可以看到,
这里面我们可以去看到它创建这个函数的时候,肯定是调用那个库,所以说在3.39这个节点上面也要去安装skytools,其实主要目就是要安装 level 库,我们这里3.39上也去也安装一下,
python2.7.3的这个可能装的时候没有加也是需要的,那么就需要重新编译一下。
既然要重新定义的话,因为在叶子节点和主节点都安装 skytools,在初始化的时候需要去依赖到哪些东西。然后去安装,这里我们也把环境变量改掉。把/opy/python2.7.6/bin加到路径里去,然后现在把$ git clone git 的路径也加去,python 已经安装完成了,在 idconfig 一下。我们安装的2.7.6的版本,现在要做的是安装 psycopg2,输入 python setup.py build,安装好了,rsync 不用安装,看一下 git 克隆,克隆完了,直接进入到克隆的目录里去,然后执行这个 git update,然后继续执行 autogen.sh,之后执行 configure,。
那 Postgre 安装在/opy/python2.7.6/bin/psql在这个节点3.39,skytools 需要一个改动。然后 make install,之后3.39就算安装完了,之后到 lib 库就能看到爆出来的缺少的库文件,这里有个错误,缺少 y asciidoc,从网上下载版本centos 5.6 asciidoc,是一个64位的,3.39安装完,skytools 安装完,我们就要重新回到30150这个节点上面去执行londiste 这个这条命令,现在要等 skytools 安装完,再执行这个命令,就不会出现 asciidoc 报错了。
执行:
skytools3.39安装完了,因为新安装的这个 lib 文件,要重新启动一下这个数据库,lib 数据库才会继续加载,
这里是安装有一处问题,就是3.39就是配置 pg configure 的时候,把它配置到另外一个 pg home 里面,里面有很多pgsql,pgsql 这个用户下面其实他用的是 pgsql19.3.2这个目录,这里重新装一下这个 skytools。
重新安装,然后指定 pgsql19.3.2即可。然后重新 make install,来看一下这个 lib 文件是不是已经安装到了19.3.2目录里面,再到这个3.150上面进行添加创建这个节点,
刚刚的话是因为3.39指定的这个 pg configure 路径错了,重新安装一下,文件就有了。
接下来,就是启动这个 word 的节点,也就是第一个 destination 的这个文件,把它解开,接下来配置 pgq 的文件,这个文件放到 londiste,pgqd 指定到3.150上面,然后这个端口和用户以及密码,初始化数据库连接事 template1,后面是 lodfile /home/pg93和pidfile /home/pg93,
通过 pgqd-d/home/postgres/londiste3/pgqd ini 命令启动这个 pgqd,我们来看一下,库是 digoal_01,里面新建了4个schema,
需要做添加一些表。来看一下状态,我们把这个 londiste3添加到 pg93的录进去。在 path 里面添加下,接下来我们来看这个状态,制定配置文件。
能看到根节点 src_digoal_01和叶子节点 dst1_digoal_01,看一下 londiste3里面的帮助,可以通过 status,列出本地节点状态,如果是使用了复制管理,添加表 queue 表名,然后移除已经添加的表和序列,table 是列出所有的表,missing 是列出 subscribe 只在里面有这个表,但是在 provide 里面,就是没有 subscribe 订阅的一些表,resync TBL 指的是做全拷贝,
接下来我们要做一些复制。复制之前通过这个 members ,members 其实他是常看这个所有的一些成员的状态,他现在的状态是 dead,接下来的话我们往里面添加表,也是指定配置文件,之后往里面添加这两个 user info、user session 表,
添加表的时候执行了 exec_query 语句命令,replika 是配置文件指定的队列,获得队列的名称和位置,获得节点的信息,就是这个队列有哪些节点,其实数据库执行sql也可以获得这些,连接到这个 provider 数据库,设置statement_timeout=10000,还有就是 select 添加表,其实是通过 londiets.local_add_table 这个函数去添加的,第一个函数是队列的名称,第二个函数是表的名称,第二个表也是通过这个方式添加的,在主节点添加完表之后,还要通过订阅节点也要去添加这两个表,
订阅节点的配置文件也添加好了,这个是连接到订阅节点,前面是连接到 provider 节点,通过 tables,就可以看到dst_1目标库的状态位 none,当前就可以进行 copy 了,就可以比较两个表的状态,在londiets拷贝是一个一个拷贝的,是因为没有配置 max_parallel_copy 这个参数,在添加表的时候名字,可以指定 max_parallel_copy 的值,写在参数文件里,可以看一下有一些序列的话,一些遗失的参数是什么序列,我们有两个序列还没添加,通过 missing,
可以看见
digoal_01.user_login_rec和digoal_01.user_logout_rec
这两个文件,如果添加这两个表,就会报错,如果把这两个表添加到 provider 里去,它会保缺少东西的报错,我们这里可以来看一下。
他告诉你这个表缺失了一个组件,缺失组件是不能够把表给拖过去,就是我们需要去添加这个组件,连接到这个主节点上面,这两个表的组件添加一下,然后对于这个目标节点也要添加,就是 pg39这里,这个时候就有组件了,就可以在主节点添加,就看见 missing digoal_01.user_login_rec 和 digoal_01.user_logout_rec 两个序列没添加,
这两个序列也可以添加,输入 table,四个文件都有,接下来就是添加这个序列,我们看一下在主节点和备结点的序列是不是登录创建。这个序列就来自于 seria18,现在的话把这个序列加进去。
先加 provider,再加 subscribe ,然后现在来看一下这个原的表已经里面加 dst_1,主节点和备节点已经添加,现在要在备节点把添加 record,
digoal_01.user_login_rec和digoal_01.user_logout_rec 这两个文件一会要同步,
接下来我们可以去测试一下这些数据,对于刚刚的那个 copy 的话,把 parallel_opies 添加到 dsti_digoal_01,我们允许16个表同时 copy,
然后 reload,reload 一下
/home/postgres/londiste3/src_digoal_01.ini 和 dst_1配置文件,同时 resync TBL,指定表名4个表,我们看一下他能不能做到,输入 user_login_rec,digoal_01.user_logout_rec,通过 tables 去查看,
注意这个是指定的 situation 这个重点。是主组节点配置,所以说在制定的时候要这个选择,我们刚刚配置的那个参数,看一下它的里面对应的参数的话,再看一下 document 里的 londiets 这个参数,看一下 Repair 这个参数里面有什么需要我们看看有什么。
这个参数其实是 ADD ARGUMENTS,就是添加表的时候指定的一个参数,但是在配置文件里面就没有这个选项。
先 remove table,然后 add table,再输入 max-parallel-copy-4来试一下,
再查看 tables,这个时候table_attrs是4,按我们的理解跟并不是说四个表去做这个并行,我们再重新看一下,其实max-parallel-copy 指的是最大的拷贝进程是4,27这个地方。
所以说 max-parallel-copy 这个东西在这里的作用就不是非常明显。现在的话就是单节点的 copy,就是从一个provider 另外一个 subscribe 就结束了,第一个节点已经 copy 完了。
开始第二个表了。如果要比较的话,就是 compare,会告诉你这些是不是已经同步了,
等 copy 完之后,比较一下是否一致。
第一个表 info 已经 copy 完成,另外有三个警告是因为它还没有被同步完,当所有表同步完,再进行 compare,我们这里的话,把前后 v 参数去掉,然后 compare,compare 的结果就是 copy 的结果是一致的。
其实调用 sql 语句可以看到,DEBUG 可以看见这个 SQL 语句,DEBUG 调用的是 select count<1>as cnt,hashtext就是所有的字段生成 text 转化成数字,能看到我们所有的数据都一样,这就是一个比较,
主节点和 provider、subscribe 数据已经完全一致,这是一个简单的搭建。