注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

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

2013-03-30 12:05:57|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


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

一 londiste3 相关组件:
--1.1 PgQ
    用来处理队列消息的机制,在 skytool 安装包中,关于 PgQ 更详细的介绍请参考 PGQ Tutorial

--1.2 Londiste
  用 Python 写的复制工具,使用 PgQ 事件处理器。关于 Londiste 详细介绍请参考 Londiste Tutorial

--1.3 所需套件: Psycopg2 
        Python-Postgres driver ,可以在这个链接下载:( http://initd.org/psycopg/  )


二 环境信息
  IP  PORT DATNAME VERSION
 源库: 192.168.1.36 1921 skytf PostgreSQL 9.2.1
 目标库: 192.168.1.35 1923 skytf PostgreSQL 9.1.2
测试样例: 一张表。
备注: 实验环境为两台虚拟机。


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

--3.2 解压
 [root@redhatB soft_bak]# tar zxvf skytools-3.1.3.tar.gz 
   

--3.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 安装其它模块
 [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 相关目录
 [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 (源库)
 [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 源库:
[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 进程
 [pg92@redhatB londiste]$ londiste3 -d p_skytf.ini worker
   
--查看进程
 [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
 [pgqd]
logfile = ./log/pgqd.log
pidfile = ./pid/pgqd.pid

--3.10 启动  ticker daemon:
 [pg92@redhatB londiste]$ pgqd -d /database/pg92/pgdata/londiste/pgqd.ini
   

--3.11 编译并安装 (目标库)
 ./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 文件
 [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 目标库:
[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 订阅进程
 londiste3 -d s_skytf.ini worker
 备注:到了这里 londiste 的安装基本完成了,接下来看看配置信息。
  
--3.15 查看节点状态
 [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 查看节点成员
 [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 的信息应该在源库和目标库都能显示。


四 测试
--4.1 创建测试表(源库和目标库)
 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 (源库)
 [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 (目标库)
 [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 测试
--源库
 [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 条数据,看看目标库是否会同步。

--目标库
 [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 比较
 [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  删除目标节点对应表数据
 skytf=> delete from test_lond1 where id=100;
ERROR:  Table 'skytf.test_lond1' to queue 'testing': change not allowed (D)
 备注:目标节点复制表 test_lond1 数据不能修改。

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

           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 的几个模式即可。

--5.1 删除 londiste 相关模式
drop schema londiste cascade;
drop schema pgq      cascade;
drop schema pgq_ext  cascade;
drop schema pgq_node cascade;     
   

六 压力测试
     压力测试参考下一篇 blog :Londiste3:压力测试  
  
七 参考
wiki SkyTools      
PGQ_Tutorial       

  评论这张
 
阅读(10286)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016