Skytools包含三个组件:pgq、londiste、walmgr。
Pgq提供SQL API,由异步处理机制去灵活调用。用于解决实时事务的异步批处理问题。
Pgq由producer、ticker、consumer组成。Producer将events推送到queue中,ticker负责对批量queue制定相应处理规则,consumer从queue中获取events。
Londiste是基于pgq的事件传输功能的一个数据库复制工具,由python语言编写。
Walmgr是一个包含了WAL归档、基础备份及数据库运行时备份恢复功能的脚本。由python语言编写。
[root@londiste1 ~]# cat /etc/issue
CentOS release 5.9 (Final)
Kernel \r on an \m
[root@londiste1 ~]# uname -a
Linux londiste1 2.6.32-042stab076.8 #1 SMP Tue May 14 20:38:14 MSK 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@londiste2 ~]# cat /etc/issue
Fedora release 17 (Beefy Miracle)
Kernel \r on an \m (\l)
[root@londiste2 ~]# uname -a
Linux londiste2 2.6.32-042stab076.8 #1 SMP Tue May 14 20:38:14 MSK 2013 i686 i686 i386 GNU/Linux
【londiste1】
Python 2.5.6 (编译安装,系统自带版本为2.4.3)
psycopg2-2.5.1(要求python版本 >= 2.5)
skytools-3.1.5
【londiste2】
Python 2.7.3
psycopg2-2.5.1
skytools-3.1.5
获取地址:http://initd.org/psycopg/
【londiste1】
[root@londiste1 ~]# tar -zxvf psycopg2-2.5.1.tar.gz
[root@londiste1 psycopg2-2.5.1]# python setup.py build_ext --pg-config /opt/pg93/bin/pg_config build
[root@londiste1 psycopg2-2.5.1]# python setup.py build_ext --pg-config /opt/pg93/bin/pg_config install
【londiste2】
[root@londiste2 ~]# tar -zxvf psycopg2-2.5.1.tar.gz
[root@londiste2 psycopg2-2.5.1]# python setup.py build_ext --pg-config /opt/pg90/bin/pg_config build
[root@londiste2 psycopg2-2.5.1]# python setup.py build_ext --pg-config /opt/pg90/bin/pg_config install
{注意:--pg-config路径的指定,根据具体情况而定}
获取地址:http://pgfoundry.org/frs/?group_id=1000206
【londiste1】
[root@londiste1 ~]# tar -zxvf skytools-3.1.5.tar.gz
[root@londiste1 ~]# cd skytools-3.1.5
[root@londiste1 skytools-3.1.5]# ./configure --prefix=/opt/skytools --with-pgconfig=/opt/pg93/bin/pg_config
[root@londiste1 skytools-3.1.5]# make
[root@londiste1 skytools-3.1.5]# make install
[root@londiste1 skytools-3.1.5]# ls /opt/skytools/
bin lib share
[root@londiste1 skytools-3.1.5]# mkdir -p /opt/skytools/londiste3/pid
[root@londiste1 skytools-3.1.5]# mkdir -p /opt/skytools/londiste3/log
[root@londiste1 skytools-3.1.5]# chown -R postgres:postgres /opt/skytools/londisite3
【londiste2】
[root@londiste2 ~]# tar -zxvf skytools-3.1.5.tar.gz
[root@londiste2 ~]# cd skytools-3.1.5
[root@londiste2 skytools-3.1.5]# ./configure --prefix=/opt/skytools --with-pgconfig=/opt/pg90/bin/pg_config
[root@londiste2 skytools-3.1.5]# make
[root@londiste2 skytools-3.1.5]# make install
[root@londiste2 skytools-3.1.5]# ls /opt/skytools/
[root@londiste2 skytools-3.1.5]# mkdir -p /opt/skytools/londiste3/pid
[root@londiste2 skytools-3.1.5]# mkdir -p /opt/skytools/londiste3/log
[root@londiste2 skytools-3.1.5]# chown postgres:postgres /opt/skytools/londisite3
【londiste1】
export PATH=/opt/pg93/bin:/opt/skytools/bin:$PATH:$HOME/bin
export PGDATA=/opt/pg93/data
export PGUSER=postgres
export PGPORT=5493
export LD_LIBRARY_PATH=/opt/pg93/lib:$LD_LIBRARY_PATH
export PYTHONPATH=/opt/skytools/lib/python2.5/site-packages:$PYTHONPATH
【londiste2】
export PATH=/opt/pg90/bin:/opt/skytools/bin:$PATH:$HOME/bin
export PGDATA=/opt/pg90/data
export PGUSER=postgres
export PGPORT=5490
export LD_LIBRARY_PATH=/opt/pg90/lib:$LD_LIBRARY_PATH
export PYTHONPATH=/opt/skytools/lib/python2.7/site-packages:$PYTHONPATH
【首先在各个节点上配置允许连接(pg_hba.conf)并启动数据库】
HOSTNAME |
IP |
PG_VERSION |
USER |
PORT |
DB_NAME |
ROLE |
londiste1 |
192.168.100.30 |
9.3rc1 for linux |
postgres |
5493 |
db_p |
master |
londiste2 |
192.168.100.31 |
9.0.13 for linux |
postgres |
5490 |
db_s |
slave |
[postgres@londiste1 londiste3]$ cat db_p.ini
[londiste3]
job_name = l3_db_p
db = host=192.168.100.30 port=5493 user=postgres password=highgo dbname=db_p
queue_name = replika
logfile = /opt/skytools/londiste3/log/l3_db_p.log
pidfile = /opt/skytools/londiste3/pid/l3_db_p.pid
[postgres@londiste1 londiste3]$ londiste3 db_p.ini create-root node1 'host=192.168.100.30 port=5493 user=postgres password=highgo dbname=db_p'
2013-09-20 04:03:33,298 31459 INFO plpgsql is installed
2013-09-20 04:03:33,299 31459 INFO Installing pgq
2013-09-20 04:03:33,299 31459 INFO Reading from /opt/skytools/share/skytools3/pgq.sql
2013-09-20 04:03:33,826 31459 INFO pgq.get_batch_cursor is installed
2013-09-20 04:03:33,827 31459 INFO Installing pgq_ext
2013-09-20 04:03:33,827 31459 INFO Reading from /opt/skytools/share/skytools3/pgq_ext.sql
2013-09-20 04:03:34,121 31459 INFO Installing pgq_node
2013-09-20 04:03:34,121 31459 INFO Reading from /opt/skytools/share/skytools3/pgq_node.sql
2013-09-20 04:03:34,511 31459 INFO Installing londiste
2013-09-20 04:03:34,511 31459 INFO Reading from /opt/skytools/share/skytools3/londiste.sql
2013-09-20 04:03:34,857 31459 INFO londiste.global_add_table is installed
2013-09-20 04:03:34,956 31459 INFO Initializing node
2013-09-20 04:03:34,958 31459 INFO Location registered
2013-09-20 04:03:35,333 31459 INFO Node "node1" initialized for queue "replika" with type "root"
2013-09-20 04:03:35,349 31459 INFO Done
[postgres@londiste1 londiste3]$ psql db_p
psql (9.3rc1)
Type "help" for help.
db_p=# \dn
List of schemas
Name | Owner
----------+----------
londiste | postgres
pgq | postgres
pgq_ext | postgres
pgq_node | postgres
public | postgres
(5 rows)
db_p=# set search_path to londiste,pgq,pgq_ext,pgq_node;
SET
db_p=# \d+
List of relations
Schema | Name | Type | Owner | Size | Description
----------+-------------------------+----------+----------+------------+-------------
londiste | applied_execute | table | postgres | 8192 bytes |
londiste | pending_fkeys | table | postgres | 8192 bytes |
londiste | seq_info | table | postgres | 8192 bytes |
londiste | seq_info_nr_seq | sequence | postgres | 8192 bytes |
londiste | table_info | table | postgres | 8192 bytes |
londiste | table_info_nr_seq | sequence | postgres | 8192 bytes |
pgq | batch_id_seq | sequence | postgres | 8192 bytes |
pgq | consumer | table | postgres | 16 kB |
pgq | consumer_co_id_seq | sequence | postgres | 8192 bytes |
pgq | event_1 | table | postgres | 8192 bytes |
pgq | event_1_0 | table | postgres | 8192 bytes |
pgq | event_1_1 | table | postgres | 8192 bytes |
pgq | event_1_2 | table | postgres | 8192 bytes |
pgq | event_1_id_seq | sequence | postgres | 8192 bytes |
pgq | event_1_tick_seq | sequence | postgres | 8192 bytes |
pgq | event_template | table | postgres | 8192 bytes |
pgq | queue | table | postgres | 16 kB |
pgq | queue_queue_id_seq | sequence | postgres | 8192 bytes |
pgq | retry_queue | table | postgres | 8192 bytes |
pgq | subscription | table | postgres | 8192 bytes |
pgq | subscription_sub_id_seq | sequence | postgres | 8192 bytes |
pgq | tick | table | postgres | 16 kB |
pgq_ext | completed_batch | table | postgres | 8192 bytes |
pgq_ext | completed_event | table | postgres | 8192 bytes |
pgq_ext | completed_tick | table | postgres | 8192 bytes |
pgq_ext | partial_batch | table | postgres | 8192 bytes |
pgq_node | local_state | table | postgres | 16 kB |
pgq_node | node_info | table | postgres | 16 kB |
pgq_node | node_location | table | postgres | 16 kB |
pgq_node | subscriber_info | table | postgres | 8192 bytes |
(30 rows)
[postgres@londiste1 londiste3]$ londiste3 -d db_p.ini worker
[postgres@londiste1 londiste3]$ ps -ef | grep lond
postgres 31494 1 0 04:06 ? 00:00:00 /usr/local/bin/python /usr/bin/londiste3 -d db_p.ini worker
postgres 31498 30695 0 04:06 pts/0 00:00:00 grep lond
[postgres@londiste1 londiste3]$ cat pgqd.ini
[pgqd]
logfile = /opt/skytools/londiste3/log/pgqd.log
pidfile = /opt/skytools/londiste3/pid/pgqd.pid
[postgres@londiste1 londiste3]$ pgqd -d pgqd.ini
2013-09-20 05:45:25.481 32500 LOG Starting pgqd 3.1.5
[postgres@londiste2 londiste3]$ cat db_s.ini
[londiste3]
job_name = l3_db_s
db = host=192.168.100.31 port=5490 user=postgres password=highgo dbname=db_s
queue_name = replika
logfile = /opt/skytools/londiste3/log/l3_db_s.log
pidfile = /opt/skytools/londiste3/pid/l3_db_s.pid
{注:queue_name必须一致}
[postgres@londiste2 londiste3]$ londiste3 db_s.ini create-leaf node2 'host=192.168.100.31 port=5490 user=postgres password=highgo dbname=db_s' --provider='host=192.168.100.30 port=5493 user=postgres password=highgo dbname=db_p'
2013-09-20 04:09:22,336 18763 INFO plpgsql is installed
2013-09-20 04:09:22,337 18763 INFO Installing pgq
2013-09-20 04:09:22,337 18763 INFO Reading from /usr/share/skytools3/pgq.sql
2013-09-20 04:09:22,932 18763 INFO pgq.get_batch_cursor is installed
2013-09-20 04:09:22,933 18763 INFO Installing pgq_ext
2013-09-20 04:09:22,934 18763 INFO Reading from /usr/share/skytools3/pgq_ext.sql
2013-09-20 04:09:23,235 18763 INFO Installing pgq_node
2013-09-20 04:09:23,236 18763 INFO Reading from /usr/share/skytools3/pgq_node.sql
2013-09-20 04:09:23,615 18763 INFO Installing londiste
2013-09-20 04:09:23,615 18763 INFO Reading from /usr/share/skytools3/londiste.sql
2013-09-20 04:09:23,977 18763 INFO londiste.global_add_table is installed
2013-09-20 04:09:24,123 18763 INFO Initializing node
2013-09-20 04:09:24,169 18763 INFO Location registered
2013-09-20 04:09:24,184 18763 INFO Location registered
2013-09-20 04:09:24,225 18763 INFO Subscriber registered: node2
2013-09-20 04:09:24,259 18763 INFO Location registered
2013-09-20 04:09:24,274 18763 INFO Location registered
2013-09-20 04:09:24,293 18763 INFO Node "node2" initialized for queue "replika" with type "leaf"
2013-09-20 04:09:24,309 18763 INFO Done
LOG: unexpected EOF on client connection
[postgres@londiste2 londiste3]$ psql db_s
psql (9.0.13)
Type "help" for help.
db_s=# \dn
List of schemas
Name | Owner
--------------------+----------
information_schema | postgres
londiste | postgres
pg_catalog | postgres
pg_toast | postgres
pg_toast_temp_1 | postgres
pgq | postgres
pgq_ext | postgres
pgq_node | postgres
public | postgres
(9 rows)
db_s=# set search_path to londiste,pgq,pgq_ext,pgq_node;
SET
db_s=# \d+
List of relations
Schema | Name | Type | Owner | Size | Description
----------+-------------------------+----------+----------+------------+-------------
londiste | applied_execute | table | postgres | 0 bytes |
londiste | pending_fkeys | table | postgres | 0 bytes |
londiste | seq_info | table | postgres | 0 bytes |
londiste | seq_info_nr_seq | sequence | postgres | 8192 bytes |
londiste | table_info | table | postgres | 0 bytes |
londiste | table_info_nr_seq | sequence | postgres | 8192 bytes |
pgq | batch_id_seq | sequence | postgres | 8192 bytes |
pgq | consumer | table | postgres | 0 bytes |
pgq | consumer_co_id_seq | sequence | postgres | 8192 bytes |
pgq | event_template | table | postgres | 0 bytes |
pgq | queue | table | postgres | 0 bytes |
pgq | queue_queue_id_seq | sequence | postgres | 8192 bytes |
pgq | retry_queue | table | postgres | 0 bytes |
pgq | subscription | table | postgres | 0 bytes |
pgq | subscription_sub_id_seq | sequence | postgres | 8192 bytes |
pgq | tick | table | postgres | 0 bytes |
pgq_ext | completed_batch | table | postgres | 0 bytes |
pgq_ext | completed_event | table | postgres | 0 bytes |
pgq_ext | completed_tick | table | postgres | 0 bytes |
pgq_ext | partial_batch | table | postgres | 0 bytes |
pgq_node | local_state | table | postgres | 8192 bytes |
pgq_node | node_info | table | postgres | 8192 bytes |
pgq_node | node_location | table | postgres | 8192 bytes |
pgq_node | subscriber_info | table | postgres | 0 bytes |
(24 rows)
[postgres@londiste2 londiste3]$ londiste3 -d db_s.ini worker
[postgres@londiste2 londiste3]$ ps -ef | grep lond
postgres 18812 1 0 04:13 ? 00:00:00 /usr/bin/python /bin/londiste3 -d db_s.ini worker
postgres 18815 16517 0 04:13 pts/0 00:00:00 grep --color=auto lond
[postgres@londiste2 londiste3]$ londiste3 db_s.ini status
Queue: replika Local node: node2
node1 (root)
| Tables: 0/0/0
| Lag: 12m46s, Tick: 1
+--: node2 (leaf)
Tables: 0/0/0
Lag: 12m46s, Tick: 1
[postgres@londiste2 londiste3]$ londiste3 db_s.ini members
Member info on node2@replika:
node_name dead node_location
--------------- --------------- -----------------------------------------------------------------------
node1 False host=192.168.100.30 port=5493 user=postgres password=highgo dbname=db_p
node2 False host=192.168.100.31 port=5490 user=postgres password=highgo dbname=db_s
【londiste1】
db_p=# create table t1 (
db_p(# id int primary key,
db_p(# name varchar(20)
db_p(# );
CREATE TABLE
db_p=# \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | t1 | table | postgres
(1 row)
[postgres@londiste1 londiste3]$ londiste3 db_p.ini add-table public.t1
2013-09-20 04:44:06,562 31866 INFO Table added: public.t1
[postgres@londiste1 londiste3]$ londiste3 db_p.ini tables
Tables on node
table_name merge_state table_attrs
--------------- --------------- ---------------
public.t1 ok
db_p=# \d t1
Table "public.t1"
Column | Type | Modifiers
--------+-----------------------+-----------
id | integer | not null
name | character varying(20) |
Indexes:
"t1_pkey" PRIMARY KEY, btree (id)
Triggers:
_londiste_replika AFTER INSERT OR DELETE OR UPDATE ON t1 FOR EACH ROW EXECUTE PROCEDURE pgq.logutriga('replika')
_londiste_replika_truncate AFTER TRUNCATE ON t1 FOR EACH STATEMENT EXECUTE PROCEDURE pgq.sqltriga('replika')
{此时,同步表会自动添加两个触发器}
【londiste2】
db_s=# create table t1 (
db_s(# id int primary key,
db_s(# name varchar(20)
db_s(# );
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t1_s_pkey" for table "t1_s"
CREATE TABLE
db_s=# \d
List of relations
Schema | Name | Type | Owner
--------+------+-------+----------
public | t1 | table | postgres
(1 row)
[postgres@londiste2 londiste3]$ londiste3 db_s.ini add-table public.t1
2013-09-20 04:44:06,562 31866 INFO Table added: public.t1
db_s=# \d t1
Table "public.t1"
Column | Type | Modifiers
--------+-----------------------+-----------
id | integer | not null
name | character varying(20) |
Indexes:
"t1_pkey" PRIMARY KEY, btree (id)
Triggers:
_londiste_replika AFTER INSERT OR DELETE OR UPDATE ON t1 FOR EACH ROW EXECUTE PROCEDURE pgq.logutriga('replika', 'deny')
_londiste_replika_truncate AFTER TRUNCATE ON t1 FOR EACH STATEMENT EXECUTE PROCEDURE pgq.sqltriga('replika', 'deny')
[postgres@londiste2 londiste3]$ londiste3 db_s.ini tables
Tables on node
table_name merge_state table_attrs
--------------- --------------- ---------------
public.t1 None
{开始时为None,同步完成后变为ok}
【londiste1】
db_p=# insert into t1 values (1,'lsk');
INSERT 0 1
【londiste2】
db_s=# select * from t1 ;
id | name
----+------
1 | lsk
(1 row)
{测时可以看到数据已经同步,不过该方式的同步速度比较慢,不会将主库端的变更立刻在备库端体现,需要等待一段时间}
HOSTNAME |
IP |
PG_VERSION |
USER |
PASSWORD |
PORT |
DB_NAME |
ROLE |
londiste1 |
192.168.100.30 |
9.3rc1 for centos64 |
postgres |
highgo |
5432 |
db1 |
master |
londiste2 |
192.168.100.31 |
9.0.13 for fedora32 |
postgres |
highgo |
5432 |
db2 |
slave1 |
londiste3 |
192.168.100.24 |
9.0.13 for centos64 |
postgres |
highgo |
5432 |
db3 |
slave2 |
londiste4 |
192.168.100.25 |
9.0.13 for ubuntu64 |
postgres |
highgo |
5432 |
db4 |
slave3 |
londiste5 |
192.168.100.20 |
9.2.4 for suse32 |
postgres |
highgo |
5432 |
db5 |
slave4 |
注:以下实验所有配置只在londiste1上进行,其它节点需要安装skytools。
[postgres@londiste1 londiste3]$ psql -h 192.168.100.30 -p 5432 -U postgres -c "create database db1"
Password for user postgres:
CREATE DATABASE
[postgres@londiste1 londiste3]$ psql -h 192.168.100.31 -p 5432 -U postgres -c "create database db2"
Password for user postgres:
CREATE DATABASE
[postgres@londiste1 londiste3]$ psql -h 192.168.100.24 -p 5432 -U postgres -c "create database db3"
Password for user postgres:
CREATE DATABASE
[postgres@londiste1 londiste3]$ psql -h 192.168.100.25 -p 5432 -U postgres -c "create database db4"
Password for user postgres:
CREATE DATABASE
[postgres@londiste1 londiste3]$ psql -h 192.168.100.20 -p 5432 -U postgres -c "create database db5"
Password for user postgres:
CREATE DATABASE
[postgres@londiste1 londiste3]$ cat pgqd.ini
[pgqd]
#database_list = db1,db2,db3,db4,db5
logfile = /opt/skytools/londiste3/log/pgqd.log
pidfile = /opt/skytools/londiste3/pid/pgqd.pid
[postgres@londiste1 londiste3]$ cat db1.ini
[londiste3]
job_name = londiste_db1
db = host=192.168.100.30 port=5432 user=postgres password=highgo dbname=db1
queue_name = replika
logfile = /opt/skytools/londiste3/log/londiste_db1.log
pidfile = /opt/skytools/londiste3/pid/londiste_db1.pid
pgq_autocommit = 1
pgq_lazy_fetch = 0
[postgres@londiste1 londiste3]$ cat db2.ini
[londiste3]
job_name = londiste_db2
db = host=192.168.100.31 port=5432 user=postgres password=highgo dbname=db2
queue_name = replika
logfile = /opt/skytools/londiste3/log/londiste_db2.log
pidfile = /opt/skytools/londiste3/pid/londiste_db2.pid
pgq_autocommit = 1
pgq_lazy_fetch = 0
[postgres@londiste1 londiste3]$ cat db3.ini
[londiste3]
job_name = londiste_db3
db = host=192.168.100.24 port=5432 user=postgres password=highgo dbname=db3
queue_name = replika
logfile = /opt/skytools/londiste3/log/londiste_db3.log
pidfile = /opt/skytools/londiste3/pid/londiste_db3.pid
pgq_autocommit = 1
pgq_lazy_fetch = 0
[postgres@londiste1 londiste3]$ cat db4.ini
[londiste3]
job_name = londiste_db4
db = host=192.168.100.25 port=5432 user=postgres password=highgo dbname=db4
queue_name = replika
logfile = /opt/skytools/londiste3/log/londiste_db4.log
pidfile = /opt/skytools/londiste3/pid/londiste_db4.pid
pgq_autocommit = 1
pgq_lazy_fetch = 0
[postgres@londiste1 londiste3]$ cat db5.ini
[londiste3]
job_name = londiste_db5
db = host=192.168.100.149 port=5432 user=postgres password=highgo dbname=db5
queue_name = replika
logfile = /opt/skytools/londiste3/log/londiste_db5.log
pidfile = /opt/skytools/londiste3/pid/londiste_db5.pid
pgq_autocommit = 1
pgq_lazy_fetch = 0
[postgres@londiste1 londiste3]$ londiste3 db1.ini create-root node1 'host=192.168.100.30 port=5432 user=postgres password=highgo dbname=db1'
2013-09-21 02:01:13,851 17906 INFO plpgsql is installed
2013-09-21 02:01:13,852 17906 INFO Installing pgq
2013-09-21 02:01:13,853 17906 INFO Reading from /opt/skytools/share/skytools3/pgq.sql
2013-09-21 02:01:14,458 17906 INFO pgq.get_batch_cursor is installed
2013-09-21 02:01:14,459 17906 INFO Installing pgq_ext
2013-09-21 02:01:14,460 17906 INFO Reading from /opt/skytools/share/skytools3/pgq_ext.sql
2013-09-21 02:01:14,790 17906 INFO Installing pgq_node
2013-09-21 02:01:14,791 17906 INFO Reading from /opt/skytools/share/skytools3/pgq_node.sql
2013-09-21 02:01:15,170 17906 INFO Installing londiste
2013-09-21 02:01:15,171 17906 INFO Reading from /opt/skytools/share/skytools3/londiste.sql
2013-09-21 02:01:15,685 17906 INFO londiste.global_add_table is installed
2013-09-21 02:01:15,726 17906 INFO Initializing node
2013-09-21 02:01:15,728 17906 INFO Location registered
2013-09-21 02:01:16,126 17906 INFO Node "node1" initialized for queue "replika" with type "root"
2013-09-21 02:01:16,139 17906 INFO Done
[postgres@londiste1 londiste3]$ londiste3 db2.ini create-branch node2 'host=192.168.100.31 port=5432 user=postgres password=highgo dbname=db2' --provider='host=192.168.100.30 port=5432 user=postgres password=highgo dbname=db1'
2013-09-21 02:03:35,666 17932 INFO plpgsql is installed
2013-09-21 02:03:35,667 17932 INFO Installing pgq
2013-09-21 02:03:35,668 17932 INFO Reading from /opt/skytools/share/skytools3/pgq.sql
2013-09-21 02:03:36,319 17932 INFO pgq.get_batch_cursor is installed
2013-09-21 02:03:36,320 17932 INFO Installing pgq_ext
2013-09-21 02:03:36,320 17932 INFO Reading from /opt/skytools/share/skytools3/pgq_ext.sql
2013-09-21 02:03:36,686 17932 INFO Installing pgq_node
2013-09-21 02:03:36,687 17932 INFO Reading from /opt/skytools/share/skytools3/pgq_node.sql
2013-09-21 02:03:37,137 17932 INFO Installing londiste
2013-09-21 02:03:37,137 17932 INFO Reading from /opt/skytools/share/skytools3/londiste.sql
2013-09-21 02:03:37,587 17932 INFO londiste.global_add_table is installed
2013-09-21 02:03:37,693 17932 INFO Initializing node
2013-09-21 02:03:37,737 17932 INFO Location registered
2013-09-21 02:03:37,755 17932 INFO Location registered
2013-09-21 02:03:37,783 17932 INFO Subscriber registered: node2
2013-09-21 02:03:37,802 17932 INFO Location registered
2013-09-21 02:03:37,827 17932 INFO Location registered
2013-09-21 02:03:38,165 17932 INFO Node "node2" initialized for queue "replika" with type "branch"
2013-09-21 02:03:38,179 17932 INFO Done
[postgres@londiste1 londiste3]$ londiste3 db3.ini create-branch node3 'host=192.168.100.24 port=5432 user=postgres password=highgo dbname=db3' --provider='host=192.168.100.30 port=5432 user=postgres password=highgo dbname=db1'
2013-09-21 02:39:37,639 18358 INFO plpgsql is installed
2013-09-21 02:39:37,640 18358 INFO Installing pgq
2013-09-21 02:39:37,640 18358 INFO Reading from /opt/skytools/share/skytools3/pgq.sql
2013-09-21 02:39:38,347 18358 INFO pgq.get_batch_cursor is installed
2013-09-21 02:39:38,348 18358 INFO Installing pgq_ext
2013-09-21 02:39:38,348 18358 INFO Reading from /opt/skytools/share/skytools3/pgq_ext.sql
2013-09-21 02:39:38,692 18358 INFO Installing pgq_node
2013-09-21 02:39:38,693 18358 INFO Reading from /opt/skytools/share/skytools3/pgq_node.sql
2013-09-21 02:39:39,378 18358 INFO Installing londiste
2013-09-21 02:39:39,378 18358 INFO Reading from /opt/skytools/share/skytools3/londiste.sql
2013-09-21 02:39:39,892 18358 INFO londiste.global_add_table is installed
2013-09-21 02:39:39,991 18358 INFO Initializing node
2013-09-21 02:39:40,035 18358 INFO Location registered
2013-09-21 02:39:40,063 18358 INFO Location registered
2013-09-21 02:39:40,093 18358 INFO Subscriber registered: node3
2013-09-21 02:39:40,118 18358 INFO Location registered
2013-09-21 02:39:40,133 18358 INFO Location registered
2013-09-21 02:39:40,158 18358 INFO Location registered
2013-09-21 02:39:40,540 18358 INFO Node "node3" initialized for queue "replika" with type "branch"
2013-09-21 02:39:40,553 18358 INFO Done
[postgres@londiste1 londiste3]$ londiste3 db4.ini create-branch node4 'host=192.168.100.25 port=5432 user=postgres password=highgo dbname=db4' --provider='host=192.168.100.31 port=5432 user=postgres password=highgo dbname=db2'
2013-09-21 02:40:35,441 18372 INFO plpgsql is installed
2013-09-21 02:40:35,442 18372 INFO Installing pgq
2013-09-21 02:40:35,442 18372 INFO Reading from /opt/skytools/share/skytools3/pgq.sql
2013-09-21 02:40:36,208 18372 INFO pgq.get_batch_cursor is installed
2013-09-21 02:40:36,209 18372 INFO Installing pgq_ext
2013-09-21 02:40:36,210 18372 INFO Reading from /opt/skytools/share/skytools3/pgq_ext.sql
2013-09-21 02:40:36,601 18372 INFO Installing pgq_node
2013-09-21 02:40:36,602 18372 INFO Reading from /opt/skytools/share/skytools3/pgq_node.sql
2013-09-21 02:40:37,032 18372 INFO Installing londiste
2013-09-21 02:40:37,033 18372 INFO Reading from /opt/skytools/share/skytools3/londiste.sql
2013-09-21 02:40:37,496 18372 INFO londiste.global_add_table is installed
2013-09-21 02:40:37,639 18372 INFO Initializing node
2013-09-21 02:40:37,704 18372 INFO Location registered
2013-09-21 02:40:37,718 18372 INFO Location registered
2013-09-21 02:40:37,742 18372 INFO Subscriber registered: node4
2013-09-21 02:40:37,762 18372 INFO Location registered
2013-09-21 02:40:37,789 18372 INFO Location registered
2013-09-21 02:40:37,814 18372 INFO Location registered
2013-09-21 02:40:37,839 18372 INFO Location registered
2013-09-21 02:40:38,221 18372 INFO Node "node4" initialized for queue "replika" with type "branch"
2013-09-21 02:40:38,260 18372 INFO Done
[postgres@londiste1 londiste3]$ londiste3 db5.ini create-branch node5 'host=192.168.100.20 port=5432 user=postgres password=highgo dbname=db5' --provider='host=192.168.100.24 port=5432 user=postgres password=highgo dbname=db3'
2013-09-21 05:50:55,190 20501 INFO plpgsql is installed
2013-09-21 05:50:55,191 20501 INFO Installing pgq
2013-09-21 05:50:55,191 20501 INFO Reading from /opt/skytools/share/skytools3/pgq.sql
2013-09-21 05:50:55,886 20501 INFO pgq.get_batch_cursor is installed
2013-09-21 05:50:55,887 20501 INFO Installing pgq_ext
2013-09-21 05:50:55,888 20501 INFO Reading from /opt/skytools/share/skytools3/pgq_ext.sql
2013-09-21 05:50:56,218 20501 INFO Installing pgq_node
2013-09-21 05:50:56,219 20501 INFO Reading from /opt/skytools/share/skytools3/pgq_node.sql
2013-09-21 05:50:56,603 20501 INFO Installing londiste
2013-09-21 05:50:56,603 20501 INFO Reading from /opt/skytools/share/skytools3/londiste.sql
2013-09-21 05:50:57,031 20501 INFO londiste.global_add_table is installed
2013-09-21 05:50:57,111 20501 INFO Initializing node
2013-09-21 05:50:57,164 20501 INFO Location registered
2013-09-21 05:50:57,176 20501 INFO Location registered
2013-09-21 05:50:57,206 20501 INFO Subscriber registered: node5
2013-09-21 05:50:57,228 20501 INFO Location registered
2013-09-21 05:50:57,249 20501 INFO Location registered
2013-09-21 05:50:57,266 20501 INFO Location registered
2013-09-21 05:50:57,282 20501 INFO Location registered
2013-09-21 05:50:57,307 20501 INFO Location registered
2013-09-21 05:50:57,656 20501 INFO Node "node5" initialized for queue "replika" with type "branch"
2013-09-21 05:50:57,677 20501 INFO Done
[postgres@londiste1 londiste3]$ pgqd -d pgqd.ini
2013-09-21 06:03:56.064 20726 LOG Starting pgqd 3.1.5
拓扑图如下:
[postgres@londiste1 londiste3]$ londiste3 db1.ini status
Queue: replika Local node: node1
node1 (root)
| Tables: 0/0/0
| Lag: 24s, Tick: 17, NOT UPTODATE
+--: node2 (branch)
| | Tables: 0/0/0
| | Lag: 4h3m29s, Tick: 1, NOT UPTODATE
| +--: node4 (branch)
| Tables: 0/0/0
| Lag: 4h1m7s, Tick: 1, NOT UPTODATE
+--: node3 (branch)
| Tables: 0/0/0
| Lag: 4h3m29s, Tick: 1, NOT UPTODATE
+--: node5 (branch)
Tables: 0/0/0
Lag: 3h25m5s, Tick: 1, NOT UPTODATE
[postgres@londiste1 londiste3]$ londiste3 -d db1.ini worker
[postgres@londiste1 londiste3]$ londiste3 -d db2.ini worker
[postgres@londiste1 londiste3]$ londiste3 -d db3.ini worker
[postgres@londiste1 londiste3]$ londiste3 -d db4.ini worker
[postgres@londiste1 londiste3]$ londiste3 -d db5.ini worker
[postgres@londiste1 londiste3]$ ps -ef | grep londiste
postgres 20766 1 0 06:05 ? 00:00:00 /usr/local/bin/python /opt/skytools/bin/londiste3 -d db1.ini worker
postgres 20770 1 0 06:05 ? 00:00:00 /usr/local/bin/python /opt/skytools/bin/londiste3 -d db2.ini worker
postgres 20773 1 0 06:05 ? 00:00:00 /usr/local/bin/python /opt/skytools/bin/londiste3 -d db3.ini worker
postgres 20789 1 0 06:05 ? 00:00:00 /usr/local/bin/python /opt/skytools/bin/londiste3 -d db4.ini worker
postgres 20791 1 0 06:06 ? 00:00:00 /usr/local/bin/python /opt/skytools/bin/londiste3 -d db5.ini worker
postgres 20795 18340 0 06:06 pts/1 00:00:00 grep londiste
[postgres@londiste1 londiste3]$ londiste3 db1.ini status
Queue: replika Local node: node1
node1 (root)
| Tables: 0/0/0
| Lag: 12s, Tick: 27
+--: node2 (branch)
| | Tables: 0/0/0
| | Lag: 12s, Tick: 27
| +--: node4 (branch)
| Tables: 0/0/0
| Lag: 12s, Tick: 27
+--: node3 (branch)
| Tables: 0/0/0
| Lag: 12s, Tick: 27
+--: node5 (branch)
Tables: 0/0/0
Lag: 12s, Tick: 27
[postgres@londiste1 londiste3]$ londiste3 db1.ini members
Member info on node1@replika:
node_name dead node_location
--------------- --------------- ----------------------------------------------------------------------
node1 False host=192.168.100.30 port=5432 user=postgres password=highgo dbname=db1
node2 False host=192.168.100.31 port=5432 user=postgres password=highgo dbname=db2
node3 False host=192.168.100.24 port=5432 user=postgres password=highgo dbname=db3
node4 False host=192.168.100.25 port=5432 user=postgres password=highgo dbname=db4
node5 False host=192.168.100.20 port=5432 user=postgres password=highgo dbname=db5
[postgres@londiste1 londiste3]$ psql db1 -c "create table t1 (id serial primary key, data text)"
CREATE TABLE
[postgres@londiste1 londiste3]$ londiste3 db1.ini add-table t1
2013-09-21 06:16:50,763 21003 INFO Table added: public.t1
[postgres@londiste1 londiste3]$ londiste3 db2.ini add-table t1 --create
2013-09-21 06:17:33,922 21022 INFO Creating public.t1
2013-09-21 06:17:33,997 21022 INFO Creating t1_pkey
2013-09-21 06:17:34,067 21022 INFO Table added: public.t1
[postgres@londiste1 londiste3]$ londiste3 db3.ini add-table t1 --create
2013-09-21 06:18:27,701 21046 INFO Creating public.t1
2013-09-21 06:18:27,773 21046 INFO Creating t1_pkey
2013-09-21 06:18:27,875 21046 INFO Table added: public.t1
[postgres@londiste1 londiste3]$ londiste3 db4.ini add-table t1 --create
2013-09-21 06:18:31,035 21048 INFO Creating public.t1
2013-09-21 06:18:31,119 21048 INFO Creating t1_pkey
2013-09-21 06:18:31,218 21048 INFO Table added: public.t1
[postgres@londiste1 londiste3]$ londiste3 db5.ini add-table t1 --create
2013-09-21 06:18:38,220 21050 INFO Creating public.t1
2013-09-21 06:18:38,282 21050 INFO Creating t1_pkey
2013-09-21 06:18:38,350 21050 INFO Table added: public.t1
[postgres@londiste1 londiste3]$ psql db1 -c "insert into t1(data) values('row1'),('row2'),('row3')"
INSERT 0 3
[postgres@londiste1 londiste3]$ psql db1 -c "select * from t1"
id | data
----+------
1 | row1
2 | row2
3 | row3
(3 rows)
[postgres@londiste1 londiste3]$ psql -h 192.168.100.31 -d db2 -c "select * from t1"
Password:
id | data
----+------
1 | row1
2 | row2
3 | row3
(3 rows)
[postgres@londiste1 londiste3]$ psql -h 192.168.100.24 -d db3 -c "select * from t1"
Password:
id | data
----+------
1 | row1
2 | row2
3 | row3
(3 rows)
[postgres@londiste1 londiste3]$ psql -h 192.168.100.25 -d db4 -c "select * from t1"
Password:
id | data
----+------
1 | row1
2 | row2
3 | row3
(3 rows)
[postgres@londiste1 londiste3]$ psql -h 192.168.100.20 -d db5 -c "select * from t1"
Password:
id | data
----+------
1 | row1
2 | row2
3 | row3
(3 rows)
HOSTNAME |
IP |
PG_VERSION |
USER |
PASSWORD |
PORT |
DB_NAME |
ROLE |
localhost |
localhost |
9.0.4 for centos32bit |
postgres |
highgo |
5432 |
part1 |
root1 |
localhost |
localhost |
9.0.4 for centos32bit |
postgres |
highgo |
5432 |
part2 |
root2 |
localhost |
localhost |
9.0.4 for centos32bit |
postgres |
highgo |
5432 |
full |
full |
create database full1;
create database part1;
create database part2;
[postgres@localhost conf]$ cat pgqd.ini
[pgqd]
database_list = part1,part2,full1
logfile = /opt/skytools/londiste/log/pgqd.log
pidfile = /opt/skytools/londiste/pid/pgqd.pid
[postgres@localhost conf]$ cat part1.ini
[londiste3]
job_name = l3_part1
db = dbname=part1
queue_name = l3_part1_q
logfile = /opt/skytools/londiste/log/%(job_name)s.log
pidfile = /opt/skytools/londiste/pid/%(job_name)s.pid
[postgres@localhost conf]$ cat part2.ini
[londiste3]
job_name = l3_part2
db = dbname=part2
queue_name = l3_part2_q
logfile = /opt/skytools/londiste/log/%(job_name)s.log
pidfile = /opt/skytools/londiste/pid/%(job_name)s.pid
[postgres@localhost conf]$ cat part1_full1.ini
[londiste3]
job_name = l3_part1_full1
db = dbname=full1
queue_name = l3_part1_q
logfile = /opt/skytools/londiste/log/%(job_name)s.log
pidfile = /opt/skytools/londiste/pid/%(job_name)s.pid
[postgres@localhost conf]$ cat part2_full1.ini
[londiste3]
job_name = l3_part2_full1
db = dbname=full1
queue_name = l3_part2_q
logfile = /opt/skytools/londiste/log/%(job_name)s.log
pidfile = /opt/skytools/londiste/pid/%(job_name)s.pid
[postgres@localhost conf]$ londiste3 part1.ini create-root part1_root dbname=part1
2013-09-27 14:20:10,481 28176 WARNING No host= in public connect string, bad idea
2013-09-27 14:20:10,567 28176 INFO plpgsql is installed
2013-09-27 14:20:10,569 28176 INFO Installing pgq
2013-09-27 14:20:10,572 28176 INFO Reading from /opt/skytools/share/skytools3/pgq.sql
2013-09-27 14:20:10,893 28176 INFO pgq.get_batch_cursor is installed
2013-09-27 14:20:10,894 28176 INFO Installing pgq_ext
2013-09-27 14:20:10,894 28176 INFO Reading from /opt/skytools/share/skytools3/pgq_ext.sql
2013-09-27 14:20:10,988 28176 INFO Installing pgq_node
2013-09-27 14:20:10,988 28176 INFO Reading from /opt/skytools/share/skytools3/pgq_node.sql
2013-09-27 14:20:11,085 28176 INFO Installing londiste
2013-09-27 14:20:11,085 28176 INFO Reading from /opt/skytools/share/skytools3/londiste.sql
2013-09-27 14:20:11,235 28176 INFO londiste.global_add_table is installed
2013-09-27 14:20:11,257 28176 INFO Initializing node
2013-09-27 14:20:11,259 28176 INFO Location registered
2013-09-27 14:20:11,331 28176 INFO Node "part1_root" initialized for queue "l3_part1_q" with type "root"
2013-09-27 14:20:11,336 28176 INFO Done
[postgres@localhost conf]$ londiste3 part2.ini create-root part2_root dbname=part2
2013-09-27 14:20:30,440 28181 WARNING No host= in public connect string, bad idea
2013-09-27 14:20:30,538 28181 INFO plpgsql is installed
2013-09-27 14:20:30,539 28181 INFO Installing pgq
2013-09-27 14:20:30,540 28181 INFO Reading from /opt/skytools/share/skytools3/pgq.sql
2013-09-27 14:20:30,798 28181 INFO pgq.get_batch_cursor is installed
2013-09-27 14:20:30,799 28181 INFO Installing pgq_ext
2013-09-27 14:20:30,799 28181 INFO Reading from /opt/skytools/share/skytools3/pgq_ext.sql
2013-09-27 14:20:30,892 28181 INFO Installing pgq_node
2013-09-27 14:20:30,892 28181 INFO Reading from /opt/skytools/share/skytools3/pgq_node.sql
2013-09-27 14:20:30,975 28181 INFO Installing londiste
2013-09-27 14:20:30,975 28181 INFO Reading from /opt/skytools/share/skytools3/londiste.sql
2013-09-27 14:20:31,102 28181 INFO londiste.global_add_table is installed
2013-09-27 14:20:31,129 28181 INFO Initializing node
2013-09-27 14:20:31,131 28181 INFO Location registered
2013-09-27 14:20:31,436 28181 INFO Node "part2_root" initialized for queue "l3_part2_q" with type "root"
2013-09-27 14:20:31,440 28181 INFO Done
[postgres@localhost conf]$ londiste3 part1_full1.ini create-leaf merge_part1_full1 dbname=full1 --provider=dbname=part1
2013-09-27 14:44:14,558 28448 WARNING No host= in public connect string, bad idea
2013-09-27 14:44:14,566 28448 INFO plpgsql is installed
2013-09-27 14:44:14,567 28448 INFO pgq is installed
2013-09-27 14:44:14,569 28448 INFO pgq.get_batch_cursor is installed
2013-09-27 14:44:14,570 28448 INFO pgq_ext is installed
2013-09-27 14:44:14,571 28448 INFO pgq_node is installed
2013-09-27 14:44:14,573 28448 INFO londiste is installed
2013-09-27 14:44:14,574 28448 INFO londiste.global_add_table is installed
2013-09-27 14:44:14,592 28448 INFO Initializing node
2013-09-27 14:44:14,635 28448 INFO Location registered
2013-09-27 14:44:14,641 28448 INFO Location registered
2013-09-27 14:44:14,649 28448 INFO Subscriber registered: merge_part1_full1
2013-09-27 14:44:14,654 28448 INFO Location registered
2013-09-27 14:44:14,657 28448 INFO Location registered
2013-09-27 14:44:14,663 28448 INFO Node "merge_part1_full1" initialized for queue "l3_part1_q" with type "leaf"
2013-09-27 14:44:14,668 28448 INFO Done
[postgres@localhost conf]$ londiste3 part2_full1.ini create-leaf merge_part2_full1 dbname=full1 --provider=dbname=part2
2013-09-27 14:44:31,967 28457 WARNING No host= in public connect string, bad idea
2013-09-27 14:44:31,974 28457 INFO plpgsql is installed
2013-09-27 14:44:31,975 28457 INFO pgq is installed
2013-09-27 14:44:31,977 28457 INFO pgq.get_batch_cursor is installed
2013-09-27 14:44:31,978 28457 INFO pgq_ext is installed
2013-09-27 14:44:31,979 28457 INFO pgq_node is installed
2013-09-27 14:44:31,980 28457 INFO londiste is installed
2013-09-27 14:44:31,981 28457 INFO londiste.global_add_table is installed
2013-09-27 14:44:31,994 28457 INFO Initializing node
2013-09-27 14:44:32,030 28457 INFO Location registered
2013-09-27 14:44:32,037 28457 INFO Location registered
2013-09-27 14:44:32,044 28457 INFO Subscriber registered: merge_part2_full1
2013-09-27 14:44:32,048 28457 INFO Location registered
2013-09-27 14:44:32,051 28457 INFO Location registered
2013-09-27 14:44:32,058 28457 INFO Node "merge_part2_full1" initialized for queue "l3_part2_q" with type "leaf"
2013-09-27 14:44:32,062 28457 INFO Done
[postgres@localhost conf]$ pgqd -d pgqd.ini
2013-09-27 14:39:50.675 28352 LOG Starting pgqd 3.1.5
[postgres@localhost conf]$ londiste3 -d part1_full1.ini worker
[postgres@localhost conf]$ londiste3 -d part2_full1.ini worker
[postgres@localhost conf]$ ps -ef | grep londiste
postgres 28476 1 0 14:45 ? 00:00:00 /opt/python25/bin/python /opt/skytools/bin/londiste3 -d part1_full1.ini worker
postgres 28486 1 0 14:45 ? 00:00:00 /opt/python25/bin/python /opt/skytools/bin/londiste3 -d part2_full1.ini worker
postgres 28491 24970 0 14:46 pts/2 00:00:00 grep londiste
[postgres@localhost ~]$ psql -d "part1" -c "create table mydata (id int4 primary key, data text)"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "mydata_pkey" for table "mydata"
CREATE TABLE
[postgres@localhost ~]$ psql -d "part2" -c "create table mydata (id int4 primary key, data text)"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "mydata_pkey" for table "mydata"
CREATE TABLE
[postgres@localhost conf]$ londiste3 part1.ini add-table mydata
2013-09-27 14:49:04,577 28534 INFO Table added: public.mydata
[postgres@localhost conf]$ londiste3 part2.ini add-table mydata
2013-09-27 14:49:12,833 28539 INFO Table added: public.mydata
[postgres@localhost conf]$ psql -d "full1" -c "select * from londiste.table_info order by queue_name"
nr | queue_name | table_name | local | merge_state | custom_snapshot | dropped_ddl | table_attrs | dest_table
----+------------+---------------+-------+-------------+-----------------+-------------+-------------+------------
1 | l3_part1_q | public.mydata | f | | | | |
2 | l3_part2_q | public.mydata | f | | | | |
(2 rows)
{看到两个queue已经添加}
[postgres@localhost ~]$ psql part1
psql (9.0.4)
Type "help" for help.
part1=# INSERT INTO mydata VALUES (1,'lianshunke1');
INSERT 0 1
part1=# \c part2
You are now connected to database "part2".
part2=# INSERT INTO mydata VALUES (2,'lianshunke2');
INSERT 0 1
[postgres@localhost conf]$ londiste3 part1_full1.ini add-table mydata --create --merge-all
2013-09-27 14:53:21,861 28611 INFO Creating public.mydata
2013-09-27 14:53:22,063 28611 INFO Creating mydata_pkey
2013-09-27 14:53:22,137 28611 INFO Table added: public.mydata
【以下为两个queue在同步过程中的状态变化】
[postgres@localhost conf]$ psql -d "full1" -c "select * from londiste.table_info order by queue_name"
nr | queue_name | table_name | local | merge_state | custom_snapshot | dropped_ddl | table_attrs | dest_table
----+------------+---------------+-------+-------------+-----------------+-------------+-------------+------------
1 | l3_part1_q | public.mydata | t | | | | |
2 | l3_part2_q | public.mydata | t | | | | |
(2 rows)
[postgres@localhost conf]$ psql -d "full1" -c "select * from londiste.table_info order by queue_name"
nr | queue_name | table_name | local | merge_state | custom_snapshot | dropped_ddl | table_attrs | dest_table
----+------------+---------------+-------+-------------+-----------------+-------------+-------------+------------
1 | l3_part1_q | public.mydata | t | in-copy | | | |
2 | l3_part2_q | public.mydata | t | in-copy | | | |
(2 rows)
[postgres@localhost conf]$ psql -d "full1" -c "select * from londiste.table_info order by queue_name"
nr | queue_name | table_name | local | merge_state | custom_snapshot | dropped_ddl | table_attrs | dest_table
----+------------+---------------+-------+-------------+-----------------+------------------------------------------------------+-------------+------------
1 | l3_part1_q | public.mydata | t | catching-up | 2669:2669: | ALTER TABLE public.mydata ADD CONSTRAINT mydata_pkey+| |
| | | | | | PRIMARY KEY (id); | |
2 | l3_part2_q | public.mydata | t | catching-up | 2681:2681: | | |
(2 rows)
[postgres@localhost conf]$ psql -d "full1" -c "select * from londiste.table_info order by queue_name"
nr | queue_name | table_name | local | merge_state | custom_snapshot | dropped_ddl | table_attrs | dest_table
----+------------+---------------+-------+-------------+-----------------+-------------+-------------+------------
1 | l3_part1_q | public.mydata | t | catching-up | 2669:2669: | | |
2 | l3_part2_q | public.mydata | t | catching-up | 2681:2681: | | |
(2 rows)
[postgres@localhost conf]$ psql -d "full1" -c "select * from londiste.table_info order by queue_name"
nr | queue_name | table_name | local | merge_state | custom_snapshot | dropped_ddl | table_attrs | dest_table
----+------------+---------------+-------+---------------+-----------------+-------------+-------------+------------
1 | l3_part1_q | public.mydata | t | wanna-sync:27 | 2669:2669: | | |
2 | l3_part2_q | public.mydata | t | catching-up | 2681:2681: | | |
(2 rows)
[postgres@localhost conf]$ psql -d "full1" -c "select * from londiste.table_info order by queue_name"
nr | queue_name | table_name | local | merge_state | custom_snapshot | dropped_ddl | table_attrs | dest_table
----+------------+---------------+-------+---------------+-----------------+-------------+-------------+------------
1 | l3_part1_q | public.mydata | t | ok | 2669:2669: | | |
2 | l3_part2_q | public.mydata | t | wanna-sync:24 | 2681:2681: | | |
(2 rows)
[postgres@localhost conf]$ psql -d "full1" -c "select * from londiste.table_info order by queue_name"
nr | queue_name | table_name | local | merge_state | custom_snapshot | dropped_ddl | table_attrs | dest_table
----+------------+---------------+-------+-------------+-----------------+-------------+-------------+------------
1 | l3_part1_q | public.mydata | t | ok | 2669:2669: | | |
2 | l3_part2_q | public.mydata | t | ok | 2681:2681: | | |
(2 rows)
{merge_state为ok时表明同步完成}
[postgres@localhost ~]$ psql full1
psql (9.0.4)
Type "help" for help.
full1=# SELECT * from mydata;
id | data
----+-------------
1 | lianshunke1
2 | lianshunke2
(2 rows)
{数据已经同步}
【向part1中插入数据】
full1=# \c part1
You are now connected to database "part1".
part1=# INSERT INTO mydata VALUES (11,'lianshunke11');
INSERT 0 1
【向part2中插入数据】
part1=# \c part2
You are now connected to database "part2".
part2=# INSERT INTO mydata VALUES (22,'lianshunke22');
INSERT 0 1
【在full1中查看同步情况】
part2=# \c full1
You are now connected to database "full1".
full1=# SELECT * from mydata;
id | data
----+--------------
1 | lianshunke1
2 | lianshunke2
11 | lianshunke11
22 | lianshunke22
(4 rows)
【在full1中删除测试数据】
full1=# DELETE FROM mydata ;
ERROR: Table 'public.mydata' to queue 'l3_part1_q': change not allowed (D)
{同步表禁止在子节点上更改数据}
【在part1中删除数据】
full1=# \c part1
You are now connected to database "part1".
part1=# SELECT * from mydata ;
id | data
----+--------------
1 | lianshunke1
11 | lianshunke11
(2 rows)
part1=# DELETE FROM mydata where id=11;
DELETE 1
【在full1中查看】
part1=# \c full1
You are now connected to database "full1".
full1=# SELECT * from mydata ;
id | data
----+--------------
1 | lianshunke1
2 | lianshunke2
22 | lianshunke22
(3 rows)
{数据被删除}
[postgres@localhost conf]$ londiste3 part1.ini status
Queue: l3_part1_q Local node: part1_root
part1_root (root)
| Tables: 1/0/0
| Lag: 1m0s, Tick: 33, NOT UPTODATE
+--: merge_part1_full1 (leaf)
Tables: 1/0/0
Lag: 1m0s, Tick: 33
[postgres@localhost conf]$ londiste3 part2.ini status
Queue: l3_part2_q Local node: part2_root
part2_root (root)
| Tables: 1/0/0
| Lag: 50s, Tick: 31, NOT UPTODATE
+--: merge_part2_full1 (leaf)
Tables: 1/0/0
Lag: 50s, Tick: 31
[postgres@localhost conf]$ londiste3 part1.ini tables
Tables on node
table_name merge_state table_attrs
--------------- --------------- ---------------
public.mydata ok
[postgres@localhost conf]$ londiste3 part2.ini tables
Tables on node
table_name merge_state table_attrs
--------------- --------------- ---------------
public.mydata ok
[postgres@localhost conf]$ londiste3 part1.ini members
Member info on part1_root@l3_part1_q:
node_name dead node_location
----------------- --------------- ---------------
merge_part1_full1 False dbname=full1
part1_root False dbname=part1
[postgres@localhost conf]$ londiste3 part2.ini members
Member info on part2_root@l3_part2_q:
node_name dead node_location
----------------- --------------- ---------------
merge_part2_full1 False dbname=full1
part2_root False dbname=part2
[postgres@localhost conf]$ londiste3 part1.ini compare
2013-10-11 10:53:32,097 18193 INFO Checking if part1_root can be used for copy
2013-10-11 10:53:32,108 18193 INFO Node part1_root seems good source, using it
2013-10-11 10:53:32,109 18193 INFO public.mydata: Using node part1_root as provider
2013-10-11 10:53:32,131 18193 INFO Provider: part1_root (root)
2013-10-11 10:53:32,162 18193 INFO Locking public.mydata
2013-10-11 10:53:32,181 18193 INFO Syncing public.mydata
2013-10-11 10:53:34,713 18193 INFO Counting public.mydata
2013-10-11 10:53:34,885 18193 INFO srcdb: 2 rows, checksum=-3203416869
2013-10-11 10:53:34,887 18193 INFO dstdb: 2 rows, checksum=-3203416869
{此处可以看到源端与目标端的同步行数以及校验值,执行compare操作会对当前queue所针对的表进行一次同步}
[postgres@localhost conf]$ londiste3 part2.ini compare
2013-10-11 10:53:39,763 18203 INFO Checking if part2_root can be used for copy
2013-10-11 10:53:39,771 18203 INFO Node part2_root seems good source, using it
2013-10-11 10:53:39,772 18203 INFO public.mydata: Using node part2_root as provider
2013-10-11 10:53:39,791 18203 INFO Provider: part2_root (root)
2013-10-11 10:53:39,814 18203 INFO Locking public.mydata
2013-10-11 10:53:39,815 18203 INFO Syncing public.mydata
2013-10-11 10:53:42,331 18203 INFO Counting public.mydata
2013-10-11 10:53:42,482 18203 INFO srcdb: 2 rows, checksum=-1518757964
2013-10-11 10:53:42,484 18203 INFO dstdb: 2 rows, checksum=-1518757964
HOSTNAME |
IP |
PG_VERSION |
USER |
PASSWORD |
PORT |
DB_NAME |
ROLE |
localhost |
localhost |
9.3rc1 for centos64 |
postgres |
highgo |
5432 |
part_root |
root |
localhost |
localhost |
9.3rc1 for centos64 |
postgres |
highgo |
5432 |
part_part0 |
leaf1 |
localhost |
localhost |
9.3rc1 for centos64 |
postgres |
highgo |
5432 |
part_part1 |
leaf2 |
postgres=# create database part_root;
CREATE DATABASE
postgres=# create database part_part0;
CREATE DATABASE
postgres=# create database part_part1;
CREATE DATABASE
【part_part0】
part_part0=# create schema partconf;
CREATE SCHEMA
part_part0=# CREATE TABLE partconf.conf (
part_part0(# part_nr integer,
part_part0(# max_part integer,
part_part0(# db_code bigint,
part_part0(# is_primary boolean,
part_part0(# max_slot integer,
part_part0(# cluster_name text
part_part0(# );
CREATE TABLE
part_part0=# insert into partconf.conf(part_nr, max_part) values(0,1);
INSERT 0 1
【part_part1】
part_part1=# CREATE SCHEMA partconf;
CREATE SCHEMA
part_part1=# CREATE TABLE partconf.conf (
part_part1(# part_nr integer,
part_part1(# max_part integer,
part_part1(# db_code bigint,
part_part1(# is_primary boolean,
part_part1(# max_slot integer,
part_part1(# cluster_name text
part_part1(# );
CREATE TABLE
part_part1=# insert into partconf.conf(part_nr, max_part) values(1,1);
INSERT 0 1
【part_root】
part_root=# create schema partconf;
CREATE SCHEMA
[postgres@localhost ~]$ cd /opt/pg93/share/extension/
[postgres@localhost extension]$ psql part_root < hashlib--1.0.sql
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
[postgres@localhost extension]$ psql part_part0 < hashlib--1.0.sql
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
[postgres@localhost extension]$ psql part_part1 < hashlib--1.0.sql
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
part_root=# \df
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+----------------+------------------+-----------------------------+--------
public | hash128_string | bytea | bytea, text | normal
public | hash128_string | bytea | bytea, text, bigint | normal
public | hash128_string | bytea | bytea, text, bigint, bigint | normal
public | hash128_string | bytea | text, text | normal
public | hash128_string | bytea | text, text, bigint | normal
public | hash128_string | bytea | text, text, bigint, bigint | normal
public | hash64_string | bigint | bytea, text | normal
public | hash64_string | bigint | bytea, text, bigint | normal
public | hash64_string | bigint | bytea, text, bigint, bigint | normal
public | hash64_string | bigint | text, text | normal
public | hash64_string | bigint | text, text, bigint | normal
public | hash64_string | bigint | text, text, bigint, bigint | normal
public | hash_int4 | integer | bigint, text | normal
public | hash_int4 | integer | integer, text | normal
public | hash_int8 | bigint | bigint, text | normal
public | hash_string | integer | bytea, text | normal
public | hash_string | integer | bytea, text, integer | normal
public | hash_string | integer | text, text | normal
public | hash_string | integer | text, text, integer | normal
(19 rows)
[postgres@localhost extension]$ psql part_root -c 'create extension hashlib'
CREATE EXTENSION
[postgres@localhost extension]$ psql part_part0 -c 'create extension hashlib'
CREATE EXTENSION
[postgres@localhost extension]$ psql part_part1 -c 'create extension hashlib'
CREATE EXTENSION
part_root=# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------
hashlib | 1.1 | public | Stable hash functions
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
[postgres@localhost conf]$ cat part_root.ini
[londiste3]
job_name = part_root
db = dbname=part_root
queue_name = replika
logfile = /opt/skytools/londiste/log/part_root.log
pidfile = /opt/skytools/londiste/pid/part_root.pid
[postgres@localhost conf]$ cat part_part0.ini
[londiste3]
job_name = part_part0
db = dbname=part_part0
queue_name = replika
logfile = /opt/skytools/londiste/log/part_part0.log
pidfile = /opt/skytools/londiste/pid/part_part0.pid
[postgres@localhost conf]$ cat part_part1.ini
[londiste3]
job_name = part_part1
db = dbname=part_part1
queue_name = replika
logfile = /opt/skytools/londiste/log/part_part1.log
pidfile = /opt/skytools/londiste/pid/part_part1.pid
[postgres@localhost conf]$ londiste3 part_root.ini create-root node1 dbname=part_root
2013-10-11 15:07:24,186 29307 WARNING No host= in public connect string, bad idea
2013-10-11 15:07:24,331 29307 INFO plpgsql is installed
2013-10-11 15:07:24,332 29307 INFO Installing pgq
2013-10-11 15:07:24,333 29307 INFO Reading from /opt/skytools/share/skytools3/pgq.sql
2013-10-11 15:07:25,350 29307 INFO pgq.get_batch_cursor is installed
2013-10-11 15:07:25,351 29307 INFO Installing pgq_ext
2013-10-11 15:07:25,351 29307 INFO Reading from /opt/skytools/share/skytools3/pgq_ext.sql
2013-10-11 15:07:25,704 29307 INFO Installing pgq_node
2013-10-11 15:07:25,704 29307 INFO Reading from /opt/skytools/share/skytools3/pgq_node.sql
2013-10-11 15:07:26,126 29307 INFO Installing londiste
2013-10-11 15:07:26,126 29307 INFO Reading from /opt/skytools/share/skytools3/londiste.sql
2013-10-11 15:07:26,531 29307 INFO londiste.global_add_table is installed
2013-10-11 15:07:26,643 29307 INFO Initializing node
2013-10-11 15:07:26,646 29307 INFO Location registered
2013-10-11 15:07:26,912 29307 INFO Node "node1" initialized for queue "replika" with type "root"
2013-10-11 15:07:26,992 29307 INFO Done
[postgres@localhost conf]$ londiste3 -d part_root.ini worker
[postgres@localhost conf]$ ps -ef | grep worker
postgres 29327 1 0 15:08 ? 00:00:00 /opt/python25/bin/python /opt/skytools/bin/londiste3 -d part_root.ini worker
postgres 29335 27861 0 15:08 pts/2 00:00:00 grep worker
[postgres@localhost conf]$ londiste3 part_part0.ini create-leaf node2_0 dbname=part_part0 --provider=dbname=part_root
2013-10-11 15:09:33,157 29361 WARNING No host= in public connect string, bad idea
2013-10-11 15:09:33,165 29361 INFO plpgsql is installed
2013-10-11 15:09:33,166 29361 INFO Installing pgq
2013-10-11 15:09:33,167 29361 INFO Reading from /opt/skytools/share/skytools3/pgq.sql
2013-10-11 15:09:34,301 29361 INFO pgq.get_batch_cursor is installed
2013-10-11 15:09:34,302 29361 INFO Installing pgq_ext
2013-10-11 15:09:34,302 29361 INFO Reading from /opt/skytools/share/skytools3/pgq_ext.sql
2013-10-11 15:09:34,474 29361 INFO Installing pgq_node
2013-10-11 15:09:34,475 29361 INFO Reading from /opt/skytools/share/skytools3/pgq_node.sql
2013-10-11 15:09:34,832 29361 INFO Installing londiste
2013-10-11 15:09:34,832 29361 INFO Reading from /opt/skytools/share/skytools3/londiste.sql
2013-10-11 15:09:36,634 29361 INFO londiste.global_add_table is installed
2013-10-11 15:09:37,523 29361 INFO Initializing node
2013-10-11 15:09:39,935 29361 INFO Location registered
2013-10-11 15:09:40,254 29361 INFO Location registered
2013-10-11 15:09:40,810 29361 INFO Subscriber registered: node2_0
2013-10-11 15:09:40,876 29361 INFO Location registered
2013-10-11 15:09:40,879 29361 INFO Location registered
2013-10-11 15:09:40,945 29361 INFO Node "node2_0" initialized for queue "replika" with type "leaf"
2013-10-11 15:09:41,001 29361 INFO Done
[postgres@localhost conf]$ londiste3 -d part_part0.ini worker
[postgres@localhost conf]$ londiste3 part_part1.ini create-leaf node2_1 dbname=part_part1 --provider=dbname=part_root
2013-10-11 15:10:05,861 29380 WARNING No host= in public connect string, bad idea
2013-10-11 15:10:05,867 29380 INFO plpgsql is installed
2013-10-11 15:10:05,869 29380 INFO Installing pgq
2013-10-11 15:10:05,928 29380 INFO Reading from /opt/skytools/share/skytools3/pgq.sql
2013-10-11 15:10:07,291 29380 INFO pgq.get_batch_cursor is installed
2013-10-11 15:10:07,293 29380 INFO Installing pgq_ext
2013-10-11 15:10:07,293 29380 INFO Reading from /opt/skytools/share/skytools3/pgq_ext.sql
2013-10-11 15:10:07,631 29380 INFO Installing pgq_node
2013-10-11 15:10:07,631 29380 INFO Reading from /opt/skytools/share/skytools3/pgq_node.sql
2013-10-11 15:10:07,871 29380 INFO Installing londiste
2013-10-11 15:10:07,872 29380 INFO Reading from /opt/skytools/share/skytools3/londiste.sql
2013-10-11 15:10:08,319 29380 INFO londiste.global_add_table is installed
2013-10-11 15:10:08,505 29380 INFO Initializing node
2013-10-11 15:10:10,610 29380 INFO Location registered
2013-10-11 15:10:10,743 29380 INFO Location registered
2013-10-11 15:10:10,927 29380 INFO Subscriber registered: node2_1
2013-10-11 15:10:10,963 29380 INFO Location registered
2013-10-11 15:10:10,966 29380 INFO Location registered
2013-10-11 15:10:10,969 29380 INFO Location registered
2013-10-11 15:10:11,041 29380 INFO Node "node2_1" initialized for queue "replika" with type "leaf"
2013-10-11 15:10:11,132 29380 INFO Done
[postgres@localhost conf]$ londiste3 -d part_part1.ini worker
[postgres@localhost conf]$ ps -ef | grep worker
postgres 29327 1 0 15:08 ? 00:00:00 /opt/python25/bin/python /opt/skytools/bin/londiste3 -d part_root.ini worker
postgres 29397 1 0 15:10 ? 00:00:00 /opt/python25/bin/python /opt/skytools/bin/londiste3 -d part_part1.ini worker
postgres 29403 1 0 15:10 ? 00:00:00 /opt/python25/bin/python /opt/skytools/bin/londiste3 -d part_part0.ini worker
postgres 29412 27861 0 15:10 pts/2 00:00:00 grep worker
[postgres@localhost conf]$ cat pgqd.ini
[pgqd]
logfile = /opt/skytools/londiste/log/pgqd.log
pidfile = /opt/skytools/londiste/pid/pgqd.pid
[postgres@localhost conf]$ pgqd -d pgqd.ini
2013-10-11 15:12:42.278 29452 LOG Starting pgqd 3.1.5
[postgres@localhost conf]$ ps -ef | grep pgqd
postgres 29454 1 0 15:12 ? 00:00:00 pgqd -d pgqd.ini
postgres 29469 27861 0 15:12 pts/2 00:00:00 grep pgqd
part_root=# create table t1(id integer primary key);
CREATE TABLE
part_root=# insert into t1 values (1);
INSERT 0 1
part_root=# insert into t1 values (2);
INSERT 0 1
part_root=# select * from t1;
id
----
1
2
(2 rows)
[postgres@localhost conf]$ londiste3 part_root.ini add-table t1 --handler=part --handler-arg=key=id
2013-10-12 00:14:52,824 4394 INFO Table added: public.t1
[postgres@localhost conf]$ londiste3 part_part0.ini add-table t1 --create --handler=part --handler-arg=key=id
2013-10-12 00:14:59,093 4399 INFO Creating public.t1
2013-10-12 00:14:59,097 4399 INFO Creating t1_pkey
2013-10-12 00:14:59,133 4399 INFO Table added: public.t1
[postgres@localhost conf]$ londiste3 part_part1.ini add-table t1 --create --handler=part --handler-arg=key=id
2013-10-12 00:15:04,608 4404 INFO Creating public.t1
2013-10-12 00:15:04,612 4404 INFO Creating t1_pkey
2013-10-12 00:15:04,648 4404 INFO Table added: public.t1
part_root=# \d t1
Table "public.t1"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
Indexes:
"t1_pkey" PRIMARY KEY, btree (id)
Triggers:
_londiste_replika AFTER INSERT OR DELETE OR UPDATE ON t1 FOR EACH ROW EXECUTE PROCEDURE pgq.logutriga('replika', 'ev_extra3=''hash=''||partconf.get_hash_raw(id)')
_londiste_replika_truncate AFTER TRUNCATE ON t1 FOR EACH STATEMENT EXECUTE PROCEDURE pgq.sqltriga('replika')
part_part0=# \d t1
Table "public.t1"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
Indexes:
"t1_pkey" PRIMARY KEY, btree (id)
Triggers:
_londiste_replika AFTER INSERT OR DELETE OR UPDATE ON t1 FOR EACH ROW EXECUTE PROCEDURE pgq.logutriga('replika', 'ev_extra3=''hash=''||partconf.get_hash_raw(id)', 'deny')
_londiste_replika_truncate AFTER TRUNCATE ON t1 FOR EACH STATEMENT EXECUTE PROCEDURE pgq.sqltriga('replika', 'deny')
part_part1=# \d t1
Table "public.t1"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
Indexes:
"t1_pkey" PRIMARY KEY, btree (id)
Triggers:
_londiste_replika AFTER INSERT OR DELETE OR UPDATE ON t1 FOR EACH ROW EXECUTE PROCEDURE pgq.logutriga('replika', 'ev_extra3=''hash=''||partconf.get_hash_raw(id)', 'deny')
_londiste_replika_truncate AFTER TRUNCATE ON t1 FOR EACH STATEMENT EXECUTE PROCEDURE pgq.sqltriga('replika', 'deny')
part_part0=# select * from t1;
id
----
1
(1 row)
part_part1=# select * from t1;
id
----
2
(1 row)
{可以看到之前表里的初始数据已经分配给了两个leaf节点}
part_root=# insert into t1 values (3);
INSERT 0 1
part_part1=# select * from t1;
id
----
2
3
(2 rows)
{分配给leaf2}
part_root=# insert into t1 values (4);
INSERT 0 1
part_part0=# select * from t1;
id
----
1
4
(2 rows)
{分配给leaf1}
part_root=# insert into t1 values (5);
INSERT 0 1
part_root=# insert into t1 values (6);
INSERT 0 1
part_part0=# select * from t1;
id
----
1
4
5
(3 rows)
part_part1=# select * from t1;
id
----
2
3
6
(3 rows)
【根据上面的测试可以发现其分配规律为12211221的分配方式】
HOSTNAME |
IP |
PG_VERSION |
USER |
PASSWORD |
PORT |
ROLE |
db1 |
192.168.100.37 |
9.3.2 for centos6.4-x64 |
postgres |
highgo |
5432 |
master |
db2 |
192.168.100.38 |
9.3.2 for centos6.4-x64 |
postgres |
highgo |
5432 |
slave |
[root@master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
:#:1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.37 db1
192.168.100.38 db2
[root@slave ~]# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost localhost4.localdomain4 localhost4
# Auto-generated hostname. Please do not remove this comment.
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.37 db1
192.168.100.38 db2
[postgres@db1 ~]$ cd .ssh/
[postgres@db1 .ssh]$ ls
[postgres@db1 .ssh]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/postgres/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/postgres/.ssh/id_rsa.
Your public key has been saved in /home/postgres/.ssh/id_rsa.pub.
The key fingerprint is:
f1:87:23:aa:01:74:b7:f7:9b:74:7b:e6:e9:d6:80:2d postgres@db1
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| . . . . |
| . . . . o . |
| . . S + .o |
| . o o oE o |
| . . o .. o |
| o . + .+..|
| . o .*+ |
+-----------------+
[postgres@db1 .ssh]$ ssh-copy-id -i id_rsa.pub db2
The authenticity of host 'db2 (192.168.100.38)' can't be established.
RSA key fingerprint is 70:02:66:0a:f5:3a:62:52:55:a2:98:b1:1c:d7:6c:73.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'db2,192.168.100.38' (RSA) to the list of known hosts.
postgres@db2 's password:
Now try logging into the machine, with "ssh 'db2'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
验证:
[postgres@db1 .ssh]$ ssh db2 date
Thu Dec 19 01:25:48 EST 2013
【当然也可通过说明文档中指出的使用walmgr3 –ssh-keygen 命令做免密码登录认证】
[root@db1 ~]# cd /opt/pg93/
[root@db1 pg93]# mkdir data
[root@db1 pg93]# chown postgres:postgres data/
[root@db1 pg93]# su - postgres
[postgres@db1 ~]$ initdb -D /opt/pg93/data/
[postgres@db1 data]$ vi postgresql.conf
listen_addresses = '*'
port = 5432
logging_collector = on
log_filename = 'postgresql.log'
log_connections = on
log_disconnections = on
[postgres@master data]$ pg_ctl start
主端配置文件:
[postgres@db1 pg93]$ cat wal-master.ini
[walmgr]
job_name = wal-master
logfile = /opt/pg93/data/log/%(job_name)s.log
pidfile = /opt/pg93/data/pid/%(job_name)s.pid
use_skylog = 0
master_db = port=5432 host=db1 dbname=template1
master_data = /opt/pg93/data
master_config = /opt/pg93/data/postgresql.conf
master_bin = /opt/pg93/bin
# set this only if you can afford database restarts during setup and stop.
# master_restart_cmd = pg_ctlcluster 9.1 main restart
slave = db2
slave_config = /opt/pg93/wal-slave.ini
walmgr_data = db2:/opt/pg93/slave_walmanager/backup
completed_wals = %(walmgr_data)s/logs.complete
partial_wals = %(walmgr_data)s/logs.partial
full_backup = %(walmgr_data)s/data.master
config_backup = %(walmgr_data)s/config.backup
# syncdaemon update frequency
loop_delay = 10.0
# use record based shipping available since 8.2
use_xlog_functions = 0
# pass -z to rsync, useful on low bandwidth links
compression = 0
# keep symlinks for pg_xlog and pg_log
keep_symlinks = 1
# tell walmgr to set wal_level to hot_standby during setup
hot_standby = 1
# periodic sync
#command_interval = 600
#periodic_command = /var/lib/postgresql/walshipping/periodic.sh
备端配置文件:
[postgres@db2 pg93]$ cat wal-slave.ini
[walmgr]
job_name = wal-standby
logfile = /opt/pg93/data/log/%(job_name)s.log
use_skylog = 0
slave_data = /opt/pg93/data
slave_bin = /opt/pg93/bin
slave_stop_cmd = /opt/pg93/bin/pg_ctl -D /opt/pg93/data stop
slave_start_cmd = /opt/pg93/bin/pg_ctl -D /opt/pg93/data start
#slave_config_dir = /tmp/test_slave
slave_config_dir = /opt/pg93/data
walmgr_data = /opt/pg93/slave_walmanager/backup
completed_wals = %(walmgr_data)s/logs.complete
partial_wals = %(walmgr_data)s/logs.partial
full_backup = %(walmgr_data)s/data.master
config_backup = %(walmgr_data)s/config.backup
backup_datadir = no
keep_backups = 0
# archive_command =
# primary database connect string for hot standby -- enabling
# this will cause the slave to be started in hot standby mode.
primary_conninfo = host=db1 user=postgres port=5432
配置复制:
[postgres@db1 pg93]$ walmgr3 wal-master.ini setup
2013-12-20 02:05:19,289 32538 INFO Configuring WAL archiving
2013-12-20 02:05:19,294 32538 INFO Sending SIGHUP to postmaster
LOG: received SIGHUP, reloading configuration files
LOG: parameter "archive_command" changed to "/opt/skytools/bin/walmgr3 /opt/pg93/wal-master.ini xarchive %p %f"
2013-12-20 02:05:19,491 32538 INFO Done
此时配置文件postgresql.conf中如下参数发生变化:
wal_level = 'hot_standby'
archive_mode = 'on'
archive_command = '/opt/skytools/bin/walmgr3 /opt/pg93/data/wal-master.ini xarchive %p %f'
并且,在db2中生成了备份目录:
[postgres@db2 pg93]$ ll slave_walmanager/backup/
total 16
drwxrwxr-x 2 postgres postgres 4096 Dec 19 22:04 config.backup
drwxrwxr-x 2 postgres postgres 4096 Dec 19 22:04 data.master
drwxrwxr-x 2 postgres postgres 4096 Dec 19 22:04 logs.complete
drwxrwxr-x 2 postgres postgres 4096 Dec 19 22:04 logs.partial
修改max_wal_senders参数:
max_wal_senders = 3
在pg_hba.conf中加入以下两条:
[postgres@db1 data]$ vi pg_hba.conf
host postgres postgres 192.168.100.0/24 trust
host replication postgres 192.168.100.0/24 trust
执行基础备份:
[postgres@db1 pg93]$ walmgr3 wal-master.ini backup
2013-12-20 02:05:58,339 28752 INFO Backup lock obtained.
2013-12-20 02:05:58,347 32547 INFO Execute SQL: select pg_start_backup('FullBackup'); [port=5432 host=db1 dbname=template1]
2013-12-20 02:05:59,015 32550 INFO {count: 1, duration: 0.518224000931}
2013-12-20 02:06:00,098 32547 INFO Checking tablespaces
2013-12-20 02:06:00,099 32547 INFO pg_log does not exist, skipping
2013-12-20 02:06:00,274 32547 INFO Backup conf files from /opt/pg93/data
2013-12-20 02:06:00,648 28826 INFO First useful WAL file is: 00000003000000000000002B
2013-12-20 02:06:00,660 32547 INFO Execute SQL: select pg_stop_backup(); [port=5432 host=db1 dbname=template1]
2013-12-20 02:06:01,313 32564 INFO {count: 1, duration: 0.562467098236}
2013-12-20 02:06:01,681 32568 INFO {count: 1, duration: 0.282044887543}
2013-12-20 02:06:02,876 28878 INFO Backup lock released.
2013-12-20 02:06:02,884 32547 INFO Full backup successful
Backup过程会在walmgr_data中生成基础备份数据,如下:
[postgres@db2 pg93]$ ls slave_walmanager/backup/
config.backup/ data.master/ logs.complete/ logs.partial/
[postgres@db2 pg93]$ ls slave_walmanager/backup/
config.backup data.master logs.complete logs.partial
[postgres@db2 pg93]$ ls slave_walmanager/backup/data.master/
PG_VERSION backup_label.old global pg_clog pg_notify pg_snapshots pg_stat_tmp pg_twophase pid
backup_label base log pg_multixact pg_serial pg_stat pg_subtrans pg_xlog recovery.conf
在备端执行恢复:
[postgres@db2 pg93]$ walmgr3 wal-slave.ini restore
2013-12-20 02:09:38,190 28909 WARNING backup_datadir is disabled, deleting old data dir
2013-12-20 02:09:38,191 28909 INFO Move /opt/pg93/slave_walmanager/backup/data.master to /opt/pg93/data
2013-12-20 02:09:38,197 28909 INFO Write /opt/pg93/data/recovery.conf
2013-12-20 02:09:38,198 28909 INFO Restoring configuration files
2013-12-20 02:09:38,200 28909 INFO Starting postmaster: /opt/pg93/bin/pg_ctl -D /opt/pg93/data start
server starting
[postgres@db2 pg93]$ LOG: database system was interrupted; last known up at 2013-12-20 02:05:58 EST
LOG: entering standby mode
2013-12-20 02:09:38,494 28916 INFO 00000003.history: not found (ignored)
2013-12-20 02:09:38,576 28917 INFO 00000003000000000000002B: Found
2013-12-20 02:09:38,603 28917 INFO {count: 1}
LOG: restored log file "00000003000000000000002B" from archive
LOG: redo starts at 0/2B000028
LOG: consistent recovery state reached at 0/2B0000F0
2013-12-20 02:09:38,776 28921 INFO 00000003000000000000002C: not found (ignored)
LOG: fetching timeline history file for timeline 3 from primary server
LOG: started streaming WAL from primary at 0/2C000000 on timeline 3
在备库上生成的recovery.conf内容如下:
[postgres@db2 pg93]$ cat data/recovery.conf
restore_command = '/opt/skytools/bin/walmgr3 /opt/pg93/wal-slave.ini xrestore %f "%p" %r'
standby_mode = 'on'
trigger_file = '/opt/pg93/slave_walmanager/backup/logs.complete/STOP'
primary_conninfo = 'host=db1 user=postgres port=5432'
archive_cleanup_command = '/opt/pg93/bin/pg_archivecleanup /opt/pg93/slave_walmanager/backup/logs.complete %r'
【至此,流复制已经实现。 可将db1与db2的角色互换重复以上过程进行配置,便可实现db1与db2之间互相切换。】
主端:
[postgres@db1 pg93]$ ps -ef | grep post
postgres 605 1 0 02:48 pts/1 00:00:00 /opt/pg93/bin/postgres
postgres 607 605 0 02:48 ? 00:00:00 postgres: checkpointer process
postgres 608 605 0 02:48 ? 00:00:00 postgres: writer process
postgres 609 605 0 02:48 ? 00:00:00 postgres: wal writer process
postgres 610 605 0 02:48 ? 00:00:00 postgres: autovacuum launcher process
postgres 611 605 0 02:48 ? 00:00:00 postgres: archiver process last was 000000030000000000000030.00000028.backup
postgres 612 605 0 02:48 ? 00:00:00 postgres: stats collector process
postgres 660 605 0 02:50 ? 00:00:00 postgres: wal sender process postgres 192.168.100.38(56960) streaming 0/310000C8
[postgres@db1 pg93]$ createdb pgbench
[postgres@db1 pg93]$ pgbench -i -s 1 pgbench
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
creating tables...
100000 of 100000 tuples (100%) done (elapsed 0.20 s, remaining 0.00 s).
vacuum...
set primary keys...
done.
[postgres@db1 pg93]$ psql
psql (9.3.2)
Type "help" for help.
postgres=# select pg_current_xlog_location();
pg_current_xlog_location
--------------------------
0/31CB94B0
(1 row)
备端:
[postgres@db2 pg93]$ ps -ef | grep post
root 24384 24063 0 Dec19 pts/1 00:00:00 su - postgres
postgres 24385 24384 0 Dec19 pts/1 00:00:00 -bash
postgres 29539 1 0 02:50 pts/1 00:00:00 /opt/pg93/bin/postgres -D /opt/pg93/data
postgres 29540 29539 0 02:50 ? 00:00:00 postgres: startup process recovering 000000030000000000000031
postgres 29544 29539 0 02:50 ? 00:00:00 postgres: checkpointer process
postgres 29545 29539 0 02:50 ? 00:00:00 postgres: writer process
postgres 29546 29539 0 02:50 ? 00:00:00 postgres: stats collector process
postgres 29548 29539 0 02:50 ? 00:00:00 postgres: wal receiver process streaming 0/310000C8
[postgres@db2 pg93]$ psql pgbench
psql (9.3.2)
Type "help" for help.
pgbench=# \d+
List of relations
Schema | Name | Type | Owner | Size | Description
--------+------------------+-------+----------+---------+-------------
public | pgbench_accounts | table | postgres | 13 MB |
public | pgbench_branches | table | postgres | 16 kB |
public | pgbench_history | table | postgres | 0 bytes |
public | pgbench_tellers | table | postgres | 16 kB |
(4 rows)
pgbench=# select pg_last_xlog_receive_location();
pg_last_xlog_receive_location
-------------------------------
0/31CB94B0
(1 row)
pgbench=# select pg_last_xlog_replay_location();
pg_last_xlog_replay_location
------------------------------
0/31CB94B0
(1 row)
【接2.2节环境进行以下实验】
【改变一个节点的provider】
当前拓扑关系如下:
[postgres@londiste1 londiste3]$ londiste3 db1.ini status
Queue: replika Local node: node1
node1 (root)
| Tables: 1/0/0
| Lag: 15s, Tick: 439
+--: node2 (branch)
| | Tables: 1/0/0
| | Lag: 15s, Tick: 439
| +--: node4 (branch)
| Tables: 1/0/0
| Lag: 15s, Tick: 439
+--: node3 (branch)
| Tables: 1/0/0
| Lag: 15s, Tick: 439
+--: node5 (branch)
Tables: 1/0/0
Lag: 15s, Tick: 439
将node4的provider更改为node3,如下:
[postgres@londiste1 londiste3]$ londiste3 db4.ini change-provider --provider=node3
2013-09-21 10:14:40,353 25458 INFO [node4] Consumer londiste_db4 tagged as paused
2013-09-21 10:14:40,366 25458 INFO Waiting for worker to accept
2013-09-21 10:14:41,371 25458 INFO Consumer 'londiste_db4' on node 'node4' paused
2013-09-21 10:14:41,386 25458 INFO [node3] Location registered
2013-09-21 10:14:41,409 25458 INFO [node3] Subscriber registered: node4
2013-09-21 10:14:41,416 25458 INFO [node4] Consumer provider node set to : node3
2013-09-21 10:14:41,424 25458 INFO [node4] Consumer londiste_db4 tagged as resumed
2013-09-21 10:14:41,431 25458 INFO Waiting for worker to accept
2013-09-21 10:14:42,436 25458 INFO Consumer 'londiste_db4' on node 'node4' resumed
2013-09-21 10:14:42,448 25458 INFO [node2] Subscriber unregistered: node4
[postgres@londiste1 londiste3]$ londiste3 db1.ini status
Queue: replika Local node: node1
node1 (root)
| Tables: 1/0/0
| Lag: 1s, Tick: 448
+--: node2 (branch)
| Tables: 1/0/0
| Lag: 1s, Tick: 448
+--: node3 (branch)
| Tables: 1/0/0
| Lag: 1s, Tick: 448
+--: node4 (branch)
| Tables: 1/0/0
| Lag: 1s, Tick: 448
+--: node5 (branch)
Tables: 1/0/0
Lag: 1s, Tick: 448
{node3已顺利接管node4}
将node5更改为node4的子节点,如下:
[postgres@londiste1 londiste3]$ londiste3 db5.ini change-provider --provider=node4
2013-09-21 10:16:11,661 25488 INFO [node5] Consumer londiste_db5 tagged as paused
2013-09-21 10:16:11,672 25488 INFO Waiting for worker to accept
2013-09-21 10:16:12,677 25488 INFO Consumer 'londiste_db5' on node 'node5' paused
2013-09-21 10:16:12,693 25488 INFO [node4] Location registered
2013-09-21 10:16:12,713 25488 INFO [node4] Subscriber registered: node5
2013-09-21 10:16:12,720 25488 INFO [node5] Consumer provider node set to : node4
2013-09-21 10:16:12,731 25488 INFO [node5] Consumer londiste_db5 tagged as resumed
2013-09-21 10:16:12,738 25488 INFO Waiting for worker to accept
2013-09-21 10:16:13,743 25488 INFO Consumer 'londiste_db5' on node 'node5' resumed
2013-09-21 10:16:13,756 25488 INFO [node3] Subscriber unregistered: node5
[postgres@londiste1 londiste3]$ londiste3 db1.ini status
Queue: replika Local node: node1
node1 (root)
| Tables: 1/0/0
| Lag: 3s, Tick: 451
+--: node2 (branch)
| Tables: 1/0/0
| Lag: 3s, Tick: 451
+--: node3 (branch)
| Tables: 1/0/0
| Lag: 3s, Tick: 451
+--: node4 (branch)
| Tables: 1/0/0
| Lag: 3s, Tick: 451
+--: node5 (branch)
Tables: 1/0/0
Lag: 3s, Tick: 451
{node5已成为node4的子节点}
将node4更改为node2的子节点,如下:
[postgres@londiste1 londiste3]$ londiste3 db4.ini change-provider --provider=node2
2013-09-21 10:17:20,633 25517 INFO [node4] Consumer londiste_db4 tagged as paused
2013-09-21 10:17:20,643 25517 INFO Waiting for worker to accept
2013-09-21 10:17:21,647 25517 INFO Consumer 'londiste_db4' on node 'node4' paused
2013-09-21 10:17:21,660 25517 INFO [node2] Location registered
2013-09-21 10:17:21,683 25517 INFO [node2] Subscriber registered: node4
2013-09-21 10:17:21,691 25517 INFO [node4] Consumer provider node set to : node2
2013-09-21 10:17:21,701 25517 INFO [node4] Consumer londiste_db4 tagged as resumed
2013-09-21 10:17:21,709 25517 INFO Waiting for worker to accept
2013-09-21 10:17:22,713 25517 INFO Consumer 'londiste_db4' on node 'node4' resumed
2013-09-21 10:17:22,725 25517 INFO [node3] Subscriber unregistered: node4
[postgres@londiste1 londiste3]$ londiste3 db1.ini status
Queue: replika Local node: node1
node1 (root)
| Tables: 1/0/0
| Lag: 45s, Tick: 452
+--: node3 (branch)
| Tables: 1/0/0
| Lag: 45s, Tick: 452
+--: node2 (branch)
| Tables: 1/0/0
| Lag: 45s, Tick: 452
+--: node4 (branch)
| Tables: 1/0/0
| Lag: 45s, Tick: 452
+--: node5 (branch)
Tables: 1/0/0
Lag: 45s, Tick: 452
{发现node4会携带其子节点受node2接管}
【使A节点直接接管B节点,接上小节】
使node3接管node5,如下:
[postgres@londiste1 londiste3]$ londiste3 db3.ini takeover node5
2013-09-21 10:19:58,929 25566 INFO old: node5
2013-09-21 10:19:58,998 25566 INFO [node5] Consumer londiste_db5 tagged as paused
2013-09-21 10:19:59,008 25566 INFO Waiting for worker to accept
2013-09-21 10:20:00,013 25566 INFO Consumer 'londiste_db5' on node 'node5' paused
2013-09-21 10:20:00,024 25566 INFO [node3] Location registered
2013-09-21 10:20:00,043 25566 INFO [node3] Subscriber registered: node5
2013-09-21 10:20:00,055 25566 INFO [node5] Consumer provider node set to : node3
2013-09-21 10:20:00,066 25566 INFO [node5] Consumer londiste_db5 tagged as resumed
2013-09-21 10:20:00,073 25566 INFO Waiting for worker to accept
2013-09-21 10:20:01,077 25566 INFO Consumer 'londiste_db5' on node 'node5' resumed
2013-09-21 10:20:01,091 25566 INFO [node4] Subscriber unregistered: node5
[postgres@londiste1 londiste3]$ londiste3 db1.ini status
Queue: replika Local node: node1
node1 (root)
| Tables: 1/0/0
| Lag: 2s, Tick: 459
+--: node2 (branch)
| | Tables: 1/0/0
| | Lag: 2s, Tick: 459
| +--: node4 (branch)
| Tables: 1/0/0
| Lag: 2s, Tick: 459
+--: node3 (branch)
| Tables: 1/0/0
| Lag: 2s, Tick: 459
+--: node5 (branch)
Tables: 1/0/0
Lag: 2s, Tick: 459
{已顺利接管}
子节点接管root节点,如下:
[postgres@londiste1 londiste3]$ londiste3 db2.ini takeover node1
2013-09-21 10:22:13,158 25616 INFO old: node1
2013-09-21 10:22:13,197 25616 INFO [node1] Consumer londiste_db1 tagged as paused
2013-09-21 10:22:13,202 25616 INFO Waiting for worker to accept
2013-09-21 10:22:22,224 25616 INFO Consumer 'londiste_db1' on node 'node1' paused
2013-09-21 10:22:22,227 25616 INFO [node1] Step 1: Writing disabled for: replika
2013-09-21 10:22:22,242 25616 INFO [node1] Step 2: Inserted last tick: replika
2013-09-21 10:22:23,260 25616 INFO [node2] Consumer londiste_db2 tagged as paused
2013-09-21 10:22:23,268 25616 INFO Waiting for worker to accept
2013-09-21 10:22:24,273 25616 INFO Consumer 'londiste_db2' on node 'node2' paused
2013-09-21 10:22:24,281 25616 INFO [node2] Branch node promoted to root
2013-09-21 10:22:24,299 25616 INFO [node2] Subscriber registered: node1
2013-09-21 10:22:24,315 25616 INFO [node1] Subscriber unregistered: node2
2013-09-21 10:22:24,327 25616 INFO [node2] Consumer londiste_db2 tagged as resumed
2013-09-21 10:22:24,334 25616 INFO Waiting for worker to accept
2013-09-21 10:22:25,338 25616 INFO Consumer 'londiste_db2' on node 'node2' resumed
2013-09-21 10:22:25,341 25616 INFO [node1] Step 3: Demoted root to branch: replika
2013-09-21 10:22:25,351 25616 INFO [node1] Consumer londiste_db1 tagged as resumed
2013-09-21 10:22:25,358 25616 INFO Waiting for worker to accept
2013-09-21 10:22:26,363 25616 INFO Consumer 'londiste_db1' on node 'node1' resumed
[postgres@londiste1 londiste3]$ londiste3 db1.ini status
Queue: replika Local node: node1
node2 (root)
| Tables: 1/0/0
| Lag: 8s, Tick: 463
+--: node4 (branch)
| Tables: 1/0/0
| Lag: 8s, Tick: 463
+--: node1 (branch)
| Tables: 1/0/0
| Lag: 8s, Tick: 463
+--: node3 (branch)
| Tables: 1/0/0
| Lag: 8s, Tick: 463
+--: node5 (branch)
Tables: 1/0/0
Lag: 8s, Tick: 463
{此时,接管节点成为root节点,远root节点变为node2的子节点,且原来与node2同级的节点也变为node2的子节点}
【2.5节中包括的此处不再累赘说明】
1.列举当前备份命令(listbackups):
[postgres@db1 pg93]$ walmgr3 wal-master.ini listbackups
2.对wal进行一次手动同步命令(sync):
[postgres@db1 pg93]$ walmgr3 wal-master.ini sync
2013-12-23 21:44:32,280 22317 INFO 000000030000000000000030.00000028.backup: last complete
2013-12-23 21:44:32,320 22317 INFO Database state is not 'shut down', copying all
2013-12-23 21:44:32,320 22317 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000031
2013-12-23 21:44:32,822 22317 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000032
2013-12-23 21:44:33,310 22317 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000033
2013-12-23 21:44:33,850 22317 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000034
2013-12-23 21:44:34,595 22317 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000035
2013-12-23 21:44:35,057 22317 INFO Partial copy done
3.启动定时同步命令(syncdaemon):
【同步间隔时间为配置文件中loop_delay参数指定】
[postgres@db1 pg93]$ walmgr3 wal-master.ini syncdaemon
2013-12-23 21:54:12,574 22473 INFO 000000030000000000000033: last complete
2013-12-23 21:54:12,581 22473 INFO Database state is not 'shut down', copying all
2013-12-23 21:54:12,582 22473 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000034
2013-12-23 21:54:12,987 22473 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000035
2013-12-23 21:54:13,148 22473 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000036
2013-12-23 21:54:13,575 22473 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000037
2013-12-23 21:54:13,988 22473 INFO Partial copy done
2013-12-23 21:54:23,990 22473 INFO 000000030000000000000033: last complete
2013-12-23 21:54:23,994 22473 INFO Database state is not 'shut down', copying all
2013-12-23 21:54:23,995 22473 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000034
2013-12-23 21:54:24,155 22473 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000035
2013-12-23 21:54:24,318 22473 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000036
2013-12-23 21:54:24,487 22473 INFO Syncing /opt/pg93/data/pg_xlog/000000030000000000000037
2013-12-23 21:54:24,658 22473 INFO Partial copy done
4.取消archive配置命令(stop):
【执行后archive_command参数配置将取消】
[postgres@db1 pg93]$ walmgr3 wal-master.ini stop
2013-12-23 21:57:25,488 22524 INFO Disabling WAL archiving
2013-12-23 21:57:25,490 22524 INFO database must be restarted to disable archiving
2013-12-23 21:57:25,490 22524 INFO Setting archive_command to /bin/true to avoid WAL pileup
2013-12-23 21:57:25,493 22524 INFO Sending SIGHUP to postmaster
2013-12-23 21:57:25,494 22524 INFO Done
5.自定义定期任务命令(periodic):
[postgres@db1 pg93]$ walmgr3 wal-master.ini periodic
该命令仅在配置文件中制定了定期执行命令(periodic_command)时有效。可以指定任何脚本,如同步、配置文件、系统定时任务crontab脚本等。
1.列举当前备份命令(listbackups):
[postgres@db2 pg93]$ walmgr3 wal-slave.ini listbackups
List of backups:
Backup set Timestamp Label First WAL
--------------- ------------------------ ----------- ------------------------
data.master 2013-12-23 21:45:30 EST FullBackup 000000030000000000000032
2.暂停wal重放命令(pause):
[postgres@db2 pg93]$ walmgr3 wal-slave.ini pause
2013-12-23 22:14:47,210 4139 INFO Pausing recovery mode
3.继续wal重放命令(continue):
[postgres@db2 pg93]$ walmgr3 wal-slave.ini continue
2013-12-23 22:15:21,740 4149 INFO Continuing with recovery
4. 停止恢复模式命令(boot):
【slave将变为可读写模式】
[postgres@db2 pg93]$ walmgr3 wal-slave.ini boot
2013-12-23 22:17:27,412 4164 INFO Stopping recovery mode
5.创建一个slave节点(createslave):
【该命令使子节点的创建过程更加简单】
[postgres@db2 pg93]$ walmgr3 wal-slave.ini createslave
2013-12-23 22:21:20,216 4306 INFO Backup lock obtained.
2013-12-23 22:21:20,221 4306 INFO Starting pg_receivexlog
2013-12-23 22:21:20,224 4306 INFO Starting pg_basebackup
2013-12-23 22:21:22,772 4306 INFO pg_basebackup finished successfully
2013-12-23 22:21:22,773 4306 WARNING backup_datadir is disabled, deleting old data dir
2013-12-23 22:21:22,826 4306 INFO Move /opt/pg93/slave_walmanager/backup/data.master to /opt/pg93/data
2013-12-23 22:21:22,834 4306 INFO Write /opt/pg93/data/recovery.conf
2013-12-23 22:21:22,835 4306 INFO Starting postmaster: /opt/pg93/bin/pg_ctl -D /opt/pg93/data start
server starting
LOG: database system was interrupted; last known up at 2013-12-23 22:21:20 EST
LOG: creating missing WAL directory "pg_xlog/archive_status"
LOG: entering standby mode
2013-12-23 22:21:23,149 4358 INFO 00000003.history: Found
2013-12-23 22:21:23,154 4358 INFO {count: 1}
LOG: restored log file "00000003.history" from archive
2013-12-23 22:21:23,237 4360 INFO 000000030000000000000036: Found
2013-12-23 22:21:23,266 4360 INFO {count: 1}
LOG: restored log file "000000030000000000000036" from archive
LOG: redo starts at 0/36000028
LOG: consistent recovery state reached at 0/360000F0
LOG: database system is ready to accept read only connections
2013-12-23 22:21:23,462 4364 INFO 000000030000000000000037: not found (ignored)
LOG: started streaming WAL from primary at 0/37000000 on timeline 3
2013-12-23 22:21:27,845 4306 INFO pg_receivelog stopped
2013-12-23 22:21:27,846 4306 INFO Backup lock released.
2013-12-23 22:21:27,846 4306 INFO Streaming replication standby created successfully
http://pgfoundry.org/projects/skytools/
http://skytools.projects.pgfoundry.org/skytools-3.0/
http://skytools.projects.pgfoundry.org/skytools-3.0/doc/skytools3.html
http://wiki.postgresql.org/wiki/Skytools#Documentation_3
http://wiki.postgresql.org/wiki/Londiste_Tutorial
错误现象:
[pg90@localhost conf]$ londiste3 part1.ini create-root part1_root dbname=part1
Traceback (most recent call last):
File "/opt/skytools/bin/londiste3", line 8, in <module>
import pkgloader
ImportError: No module named pkgloader
解决办法:
[root@localhost skytools-3.1.5]# python setup_pkgloader.py build
[root@localhost skytools-3.1.5]# python setup_pkgloader.py install
[root@localhost skytools-3.1.5]# python setup_skytools.py build
[root@localhost skytools-3.1.5]# python setup_skytools.py install
错误现象:
ProgrammingError: schema "partconf" does not exist
解决方法:
在root节点上也创建partconf模式:
part_root=# CREATE SCHEMA partconf;
CREATE SCHEMA
part_root=# CREATE TABLE partconf.conf (
part_root(# part_nr integer,
part_root(# max_part integer,
part_root(# db_code bigint,
part_root(# is_primary boolean,
part_root(# max_slot integer,
part_root(# cluster_name text
part_root(# );
CREATE TABLE
part_root=# CREATE FUNCTION partconf.get_hash_raw
part_root-# ( i_input integer)
part_root-# RETURNS integer
part_root-# LANGUAGE sql
part_root-# AS $$
part_root$# -- used to wrap hashtext so that we can replace it in 8.4
part_root$# -- with older implementation to keep compatibility
part_root$# select hash_string($1::text, 'lookup2');
part_root$# $$;
ERROR: function hash_string(text, unknown) does not exist
LINE 8: select hash_string($1::text, 'lookup2');
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
错误现象:
[postgres@localhost pghashlib-master]$ make install
/bin/mkdir -p '/opt/pgsql/lib'
/bin/mkdir -p '/opt/pgsql/share/contrib'
/bin/mkdir -p '/opt/pgsql/share/doc/contrib'
/bin/sh /opt/pgsql/lib/pgxs/src/makefiles/../../config/install-sh -c -m 755 hashlib.so '/opt/pgsql/lib/hashlib.so'
rst2html README.rst > hashlib.html
/bin/sh: rst2html: command not found
make: *** [hashlib.html] Error 127
make: *** Deleting file `hashlib.html'
解决办法:
下载docutils并安装https://pypi.python.org/pypi/docutils
[root@localhost docutils-0.11]# python setup.py install
[root@localhost ~]# ln -s /opt/python25/bin/rst2html.py /usr/bin/rst2html
错误现象:
[postgres@localhost extension]$ psql test < hashlib--1.0.sql
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
ERROR: could not load library "/opt/pgsql/lib/hashlib.so": /opt/pgsql/lib/hashlib.so: undefined symbol: le64toh
解决办法:
换64位操作系统
错误现象:
编译skytools报错,找不到相应头文件
[root@localhost skytools-3.1.5]# make
……
make[3]: Entering directory `/root/skytools-3.1.5/sql/pgq/lowlevel'
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fpic -DHAVE_CONFIG_H -I. -I. -I/opt/pg93/include/server -I/opt/pg93/include/internal -D_GNU_SOURCE -c -o insert_event.o insert_event.c
insert_event.c:19:22: error: postgres.h: No such file or directory
insert_event.c:20:21: error: funcapi.h: No such file or directory
insert_event.c:22:29: error: catalog/pg_type.h: No such file or directory
insert_event.c:23:30: error: commands/trigger.h: No such file or directory
insert_event.c:24:26: error: executor/spi.h: No such file or directory
insert_event.c:25:28: error: lib/stringinfo.h: No such file or directory
insert_event.c:26:28: error: utils/builtins.h: No such file or directory
insert_event.c:27:28: error: utils/datetime.h: No such file or directory
insert_event.c:28:27: error: utils/hsearch.h: No such file or directory
insert_event.c:29:25: error: access/xact.h: No such file or directory
……
错误原因:
9.3中头文件路径发生了变化(/opt/pg93/include/postgresql/server),但skytools还是按照之前版本的路径查找(/opt/pg93/include/server)
解决方法:
将server拷贝至include下
5.7、Python.h
错误现象:
./psycopg/psycopg.h:30:20: error: Python.h: No such file or directory
……
错误原因:
缺少Python.h头文件
[root@db1 psycopg2-2.5.1]# find / -name Python.h
解决办法:
[root@db1 psycopg2-2.5.1]# yum install python-devel
[root@db1 psycopg2-2.5.1]# find / -name Python.h
/usr/include/python2.6/Python.h