Londiste3:搭建简单的基于表的复制

londiste3(后面简称 Londiste ) 是 skype 公司开发的一款异步模式的复制工具,用的是触发器模式,适用于一个库中部分表的同步,可以跨 PostgreSQL 大版本实现表复制,接下来先安装,随后做些测试。

Londiste 组件

  1. PgQ
    用来处理队列消息的机制,在 skytool 安装包中,关于 PgQ 更详细的介绍请参考 PGQ Tutorial
  2. Londiste
    用 Python 写的复制工具,使用 PgQ 事件处理器。关于 Londiste 详细介绍请参考 Londiste Tutorial
  3. Psycopg2
    Python-Postgres driver ,可以在这个链接下载:( http://initd.org/psycopg/ )

环境信息

节点IPPORTDATNAMEVERSION
源库192.168.1.361921skytfPostgreSQL 9.2.1
目标库192.168.1.351923skyttPostgreSQL 9.1.2

测试样例: 一张表。
备注: 实验环境为两台虚拟机。

Londisite 安装

3.1 下载
在 pgfoundry 中下载 skytools 3.1.3,链接为:http://pgfoundry.org/frs/?group_id=1000206

3.2 解压

1
[root@redhatB soft_bak]# tar zxvf skytools-3.1.3.tar.gz

3.3 编译并安装 (源库)

1
2
3
./configure --prefix=/opt/skytools-3.1.3 --with-pgconfig=/opt/pgsql9.2.1/bin/pg_config 
make 
make install

备注:安装成功后,目录 /opt/skytools-3.1.3 会生成相应文件。

3.4 安装其它模块

1
2
3
4
5
[root@redhat6 skytools-3.1.3]# python setup_pkgloader.py build
[root@redhat6 skytools-3.1.3]# python setup_pkgloader.py install

[root@redhat6 skytools-3.1.3]# python setup_skytools.py build
[root@redhat6 skytools-3.1.3]# python setup_skytools.py install

3.5 创建 londiste 相关目录

1
2
3
[pg92@redhatB pgdata]$ mkdir -p /database/pg92/pgdata/londiste
[pg92@redhatB pgdata]$ mkdir -p /database/pg92/pgdata/londiste/log
[pg92@redhatB pgdata]$ mkdir -p /database/pg92/pgdata/londiste/pid

3.6 配置 p_skytf.ini (源库)

1
2
3
4
5
6
[londiste3]
job_name = job_skytf
db = dbname=skytf user=postgres port=1921 host=127.0.0.1
pgq_queue_name = testing
logfile = ./log/p_skytf.log
pidfile = ./pid/p_fskytf.pid

3.7 初始化 Londiste 源库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[pg92@redhatB londiste]$ londiste3 p_skytf.ini create-root node_p 'host=192.168.1.36 port=1921 user=postgres password=postgres123 dbname=skytf'  
2013-03-28 20:26:03,109 4162 INFO plpgsql is installed
2013-03-28 20:26:03,113 4162 INFO Installing pgq
2013-03-28 20:26:03,115 4162 INFO   Reading from /usr/share/skytools3/pgq.sql
2013-03-28 20:26:03,378 4162 INFO pgq.get_batch_cursor is installed
2013-03-28 20:26:03,380 4162 INFO Installing pgq_ext
2013-03-28 20:26:03,381 4162 INFO   Reading from /usr/share/skytools3/pgq_ext.sql
2013-03-28 20:26:03,487 4162 INFO Installing pgq_node
2013-03-28 20:26:03,487 4162 INFO   Reading from /usr/share/skytools3/pgq_node.sql
2013-03-28 20:26:03,622 4162 INFO Installing londiste
2013-03-28 20:26:03,622 4162 INFO   Reading from /usr/share/skytools3/londiste.sql
2013-03-28 20:26:03,831 4162 INFO londiste.global_add_table is installed
2013-03-28 20:26:03,843 4162 INFO Initializing node
2013-03-28 20:26:03,850 4162 INFO Location registered
2013-03-28 20:26:03,987 4162 INFO Node "node_p" initialized for queue "testing" with type "root"
2013-03-28 20:26:03,993 4162 INFO Done

备注:这步会在对应数据库中安装模式 londiste,pgq,pgq_ext,pgq_node 和相关系统表,出于权限问题,推荐使用数据库超级用户安装组件。

3.8 开启源库节点的 worker 进程

1
 [pg92@redhatB londiste]$ londiste3 -d p_skytf.ini worker

查看进程

1
2
3
[pg92@redhatB londiste]$ ps -ef | grep londiste
pg92      8773     1  0 15:38 ?        00:00:00 /usr/bin/python /opt/skytools-3.1.3/bin/londiste3 -d p_skytf.ini worker
pg92      8799 17600  0 15:38 pts/1    00:00:00 grep londiste

3.9 创建 PgQ ticker 配置文件 pgqd.ini

1
2
3
 [pgqd]
logfile = ./log/pgqd.log
pidfile = ./pid/pgqd.pid

3.10 启动 ticker daemon:

1
 [pg92@redhatB londiste]$ pgqd -d /database/pg92/pgdata/londiste/pgqd.ini

3.11 编译并安装 (目标库)

1
2
3
 ./configure --prefix=/opt/skytools-3.1.3 with-pgconfig=/opt/pgsql9.1/bin/pg_config 
make 
make install

备注:在目标库创建相同目录,解压介质步步骤参考之前的 3.1- 3.5 小节,这里注意参数 “–with-pgconfig” 的不同。

3.12 配置 s_skytf.ini 文件

1
2
3
4
5
6
[londiste3]
job_name = job_skytf
db = dbname=skytf user=postgres port=1923 host=127.0.0.1
pgq_queue_name = testing
logfile = ./log/s_skytf.log
pidfile = ./pid/s_skytf.pid

3.13 初始化 Londiste 目标库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[pg91@redhat6 londiste]$ londiste3 s_skytf.ini create-leaf node_s 'host=192.168.1.35 port=1923 user=postgres password=postgres123 dbname=skytf' --provider='host=192.168.1.36 port=1921 user=postgres dbname=skytf password=postgres123'  
2013-03-28 20:28:11,294 3233 INFO plpgsql is installed
2013-03-28 20:28:11,302 3233 INFO Installing pgq
2013-03-28 20:28:11,304 3233 INFO   Reading from /usr/share/skytools3/pgq.sql
2013-03-28 20:28:11,612 3233 INFO pgq.get_batch_cursor is installed
2013-03-28 20:28:11,617 3233 INFO Installing pgq_ext
2013-03-28 20:28:11,618 3233 INFO   Reading from /usr/share/skytools3/pgq_ext.sql
2013-03-28 20:28:11,774 3233 INFO Installing pgq_node
2013-03-28 20:28:11,775 3233 INFO   Reading from /usr/share/skytools3/pgq_node.sql
2013-03-28 20:28:11,906 3233 INFO Installing londiste
2013-03-28 20:28:11,907 3233 INFO   Reading from /usr/share/skytools3/londiste.sql
2013-03-28 20:28:12,078 3233 INFO londiste.global_add_table is installed
2013-03-28 20:28:12,094 3233 INFO Initializing node
2013-03-28 20:28:12,195 3233 INFO Location registered
2013-03-28 20:28:12,210 3233 INFO Location registered
2013-03-28 20:28:12,227 3233 INFO Subscriber registered: node_s
2013-03-28 20:28:12,232 3233 INFO Location registered
2013-03-28 20:28:12,239 3233 INFO Location registered
2013-03-28 20:28:12,248 3233 INFO Node "node_s" initialized for queue "testing" with type "leaf"
2013-03-28 20:28:12,258 3233 INFO Done

3.14 运行目标库 worker 订阅进程

1
 londiste3 -d s_skytf.ini worker

备注:到了这里 londiste 的安装基本完成了,接下来看看配置信息。

3.15 查看节点状态

1
2
3
4
5
6
7
8
9
 [pg92@redhatB londiste]$ londiste3 p_skytf.ini status
Queue: testing   Local node: node_p

node_p (root)
  |                           Tables: 1/0/0
  |                           Lag: 22s, Tick: 221
  +--node_s (leaf)
                              Tables: 1/0/0
                              Lag: 22s, Tick: 221

3.16 查看节点成员

1
2
3
4
5
6
 [pg92@redhatB londiste]$ londiste3 p_skytf.ini members
Member info on node_p@testing:
node_name        dead             node_location
---------------  ---------------  ---------------------------------------------------------------------------
node_p           False            host=192.168.1.36 port=1921 user=postgres password=postgres123 dbname=skytf
node_s           False            host=192.168.1.35 port=1923 user=postgres password=postgres123 dbname=skytf

备注:3.15, 3.16 的信息应该在源库和目标库都能显示。

Londiste 测试

4.1 创建测试表(源库和目标库)

1
2
3
skytf=> create table test_lond1 (id int4 primary key,name character varying(32));
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "test_lond1_pkey" for table "test_lond1"
CREATE TABLE

4.2 add tables (源库)

1
2
3
4
5
6
7
8
[pg92@redhatB londiste]$ londiste3 p_skytf.ini add-table skytf.test_lond1
2013-03-28 16:34:14,270 11487 INFO Table added: skytf.test_lond1

[pg92@redhatB londiste]$ londiste3 p_skytf.ini tables
Tables on node
table_name        merge_state      table_attrs
----------------  ---------------  ---------------
skytf.test_lond1  ok

备注: merge_state 值为 ok 表示正常。

4.3 add tables (目标库)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 [pg91@redhat6 londiste]$ londiste3 s_skytf.ini  add-table skytf.test_lond1
2013-03-28 20:36:20,538 3498 INFO Table added: skytf.test_lond1

[pg91@redhat6 londiste]$ londiste3 s_skytf.ini tables
Tables on node
table_name        merge_state      table_attrs
----------------  ---------------  ---------------
skytf.test_lond1  None 

[pg91@redhat6 londiste]$ londiste3 s_skytf.ini tables
Tables on node
table_name        merge_state      table_attrs
----------------  ---------------  ---------------
skytf.test_lond1  ok

备注:在目标库加完表后, merge_state 值开始为 None, 随后变成 ok,表示正常。

4.4 表 INSERT 测试
源库

1
2
3
4
5
6
7
8
9
10
11
12
[pg92@redhatB londiste]$ psql skytf skytf
psql (9.2.1)
Type "help" for help.

skytf=> insert into test_lond1 select generate_series(1,1000),generate_series(1,1000) || 'a';
INSERT 0 1000

skytf=> select count(*) from test_lond1 ;
 count 
-------
  1000
(1 row)

备注:先在源库的表 test_lond1 插入 1000 条数据,看看目标库是否会同步。

目标库

1
2
3
4
5
6
7
8
9
[pg91@redhat6 londiste]$ psql skytf skytf
psql (9.1.2)
Type "help" for help.

skytf=> select count(*) from test_lond1 ;
 count 
-------
  1000
(1 row)

备注:可见目标库数据迅速同步了。

4.5 也可以通过 compare 比较

1
2
3
4
5
6
7
8
9
10
11
[pg91@redhat6 londiste]$ londiste3 s_skytf.ini compare skytf.test_lond1
2013-03-28 20:49:26,271 3642 INFO Checking if node_p can be used for copy
2013-03-28 20:49:26,275 3642 INFO Node node_p seems good source, using it
2013-03-28 20:49:26,276 3642 INFO skytf.test_lond1: Using node node_p as provider
2013-03-28 20:49:26,350 3642 INFO Provider: node_p (root)
2013-03-28 20:49:26,371 3642 INFO Locking skytf.test_lond1
2013-03-28 20:49:26,378 3642 INFO Syncing skytf.test_lond1
2013-03-28 20:49:29,429 3642 INFO Counting skytf.test_lond1
2013-03-28 20:49:29,564 3642 INFO srcdb: 1000 rows, checksum=1511187674
2013-03-28 20:49:29,575 3642 INFO dstdb: 1000 rows, checks
um=1511187674

备注:最后两行显示源库,目标库记录条数,但目标节点对应表数据不能修改,只能订阅,
否则出现以下错误。
4.6 删除目标节点对应表数据

1
2
skytf=> delete from test_lond1 where id=100;
ERROR:  Table 'skytf.test_lond1' to queue 'testing': change not allowed (D)

备注:目标节点复制表 test_lond1 数据不能修改。

Londiste 复制机制

为什么能复制?londiste3 使用的是触发器机制,看看以下

1
2
3
4
5
6
7
8
9
10
           Table "skytf.test_lond1"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 id     | integer               | not null
 name   | character varying(32) | 
Indexes:
    "test_lond1_pkey" PRIMARY KEY, btree (id)
Triggers:
    _londiste_testing AFTER INSERT OR DELETE OR UPDATE ON test_lond1 FOR EACH ROW EXECUTE PROCEDURE pgq.logutriga('testing')
    _londiste_testing_truncate AFTER TRUNCATE ON test_lond1 FOR EACH STATEMENT EXECUTE PROCEDURE pgq.sqltriga('testing')

特殊情况

如果节点没配置好,同时又删除不掉(drop-node),怎么办?个比推荐一个较暴力的做法,直接删除 Londsite 的几个模式即可。

删除 londiste 相关模式

drop schema londiste cascade;
drop schema pgq      cascade;
drop schema pgq_ext  cascade;
drop schema pgq_node cascade;     

压力测试

压力测试参考下一篇 blog :Londiste3:压力测试

参考

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/237948.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论