11.4 使用 londiste 复制数据

pgq是一个叫做londiste的复制工具的核心。londiste 的核心是有一个比如比Slony 更加简单,容易使用的机制。如果您在一个大的安装中使用Slony,在集群方面的一个问题很容易引起其他方面的问题—在许多年前,但Slony还是相当新的时候,这尤其是如此。

和Slony相比,londiste的主要优势是,在londiste的情况下,每个“程序”复制就会有一个进程。所以,如果您从A复制到B,这个通道将被一个londiste进程管理。如果您从B复制到A或者从A复制到C,将会有这些独立的进程,这些进程相互之间都是彼此独立的。所有的从A到其它地方的通道可能共享一个接收者的队列,但是,传输进程之间不会相互交互。使用这种方法有些好处,因为如果一个组件出现故障,它不太可能导致其它问题—这不是所有进程交互的情况,因为这是Slony 的情况。对我来说这是londiste和Slony相比最关键的优势。

11.4.1 复制我们的第一个表

在这个理论的介绍之后,我们就可以向前继续,复制我们的第一个 表。要做到这一点,我们在同一个实例中创建两个数据库(这些数据库是否在同一个实例或者相距甚远并没有什么区别):

hs@hs-VirtualBox:~$ createdb node1

hs@hs-VirtualBox:~$ createdb node2

就像以前一样,我们将创建两个数据库中的表:

node1=# CREATE TABLE t_test (id int4, name text,

t timestamp DEFAULT now(),

PRIMARY KEY (id));

NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t_

test_pkey" for table "t_test"

CREATE TABLE

在Slony的章节中,我们已经看到了,DDL不被复制。该规则同样适用于 londiste,因为在PostgreSQL方面,这两个系统都面临这同样的限制。

在我们深入细节之前—让我们简单地总结一些复制我们的表的接下来的步骤:

• 写一个init 文件并初始化master.

• 在master上启动 londiste

• 写一个slave配置并初始化slave

• 在slave上启动londiste

• 写一个ticker 配置并启动ticker

• 添加所需要的来复制

让我们从该国过程的第一部分开始。我们必须创建一个init 文件,它应该控制master;

[londiste3]

job_name = first_table

db = dbname=node1

queue_name = replication_queue

logfile = /home/hs/log/londiste.log

pidfile = /home/hs/pid/londiste.pid

这里重要的部分是每项工作必须有一名字。这对于我们容易区分这些进程有意义。然后,我们必须定义一个到master的连接字符串,以及所以涉及的复制队列的名称。最后,我们可以配置一个PID和一个日志文件。

[每一项工作都必须有一个名字。这是要求的,因为Slony在集群上有一个单一的进程(因此,集群名称是足够的),但是londiste 的情况是每个程序有一个进程。]

要安装重要的东西,以及要初始化master节点,我们可以调用 londiste:

hs@hs-VirtualBox:~/skytools$ londiste3 londiste3.ini create-root node1

dbname=node1

2013-05-15 13:37:24,902 3999 WARNING No host= in public connect

string, bad idea

2013-05-15 13:37:25,118 3999 INFO plpgsql is installed

2013-05-15 13:37:25,119 3999 INFO Installing pgq

2013-05-15 13:37:25,119 3999 INFO Reading from /usr/local/share/

skytools3/pgq.sql

2013-05-15 13:37:25,327 3999 INFO pgq.get_batch_cursor is installed

2013-05-15 13:37:25,328 3999 INFO Installing pgq_ext

2013-05-15 13:37:25,328 3999 INFO Reading from /usr/local/share/

skytools3/pgq_ext.sql

2013-05-15 13:37:25,400 3999 INFO Installing pgq_node

2013-05-15 13:37:25,400 3999 INFO Reading from /usr/local/share/

skytools3/pgq_node.sql

2013-05-15 13:37:25,471 3999 INFO Installing londiste

2013-05-15 13:37:25,471 3999 INFO Reading from /usr/local/share/

skytools3/londiste.sql

2013-05-15 13:37:25,579 3999 INFO londiste.global_add_table is

installed

2013-05-15 13:37:25,670 3999 INFO Initializing node

2013-05-15 13:37:25,674 3999 INFO Location registered

2013-05-15 13:37:25,755 3999 INFO Node "node1" initialized for queue

"replication_queue" with type "root"

2013-05-15 13:37:25,761 3999 INFO Done

在Skytools中,这里有一个简单的规则:给脚本传递的第一个脚本总是包含所需配置的INI文件。然后是一些指令以及一些参数。这个调用将安装所有需要的基础设施并返回Done。

一旦这个操作完成,我们就可以启动一个工作进程:

hs@hs-VirtualBox:~/skytools$ londiste3 londiste3.ini worker

2013-05-15 13:41:31,761 4069 INFO {standby: 1}

2013-05-15 13:41:42,801 4069 INFO {standby: 1}

在master上启动了工作进程之后,我们可以看看slave的配置:

[londiste3]

job_name = first_table_slave

db = dbname=node2

queue_name = replication_queue

logfile = /home/hs/log/londiste_slave.log

pidfile = /home/hs/pid/londiste_slave.pid

这里主要的区别是,我们使用不同的连接字符串和一个不同的工作的名字。如果master和slave是两个独立的机器,剩下的将是一样。

一旦我们编译了配置,我们就可以创建叶子节点:

hs@hs-VirtualBox:~/skytools$ londiste3 slave.ini create-leaf node2

dbname=node2 --provider=dbname=node1

2013-05-15 13:51:27,090 4246 WARNING No host= in public connect

string, bad idea

2013-05-15 13:51:27,117 4246 INFO plpgsql is installed

2013-05-15 13:51:27,118 4246 INFO pgq is installed

2013-05-15 13:51:27,122 4246 INFO pgq.get_batch_cursor is installed

2013-05-15 13:51:27,122 4246 INFO pgq_ext is installed

2013-05-15 13:51:27,123 4246 INFO pgq_node is installed

2013-05-15 13:51:27,124 4246 INFO londiste is installed

2013-05-15 13:51:27,126 4246 INFO londiste.global_add_table is

installed

2013-05-15 13:51:27,205 4246 INFO Initializing node

2013-05-15 13:51:27,291 4246 INFO Location registered

2013-05-15 13:51:27,308 4246 INFO Location registered

2013-05-15 13:51:27,317 4246 INFO Subscriber registered: node2

2013-05-15 13:51:27,321 4246 INFO Location registered

2013-05-15 13:51:27,324 4246 INFO Location registered

2013-05-15 13:51:27,334 4246 INFO Node "node2" initialized for queue

"replication_queue" with type "leaf"

2013-05-15 13:51:27,345 4246 INFO Done

这里的关键是要告诉slave 从哪里找到master(提供者)。一旦系统知道从哪里找到所有的数据,我们就可以启动这里的worker了。

hs@hs-VirtualBox:~/skytools$ londiste3 slave.ini worker

2013-05-15 13:55:10,764 4301 INFO Consumer uptodate = 1

如果之前的命令已经成功运行了,这不会引起任何问题并正常工作。既然我们所有的工作都已就绪,我们可以进行最后的组件的安装—ticker进程:

[pgqd]

logfile = /home/hs/log/pgqd.log

pidfile = /home/hs/pid/pgqd.pid

ticker 的配置文件相当简单,--它所需要只有三行。这足以启动ticker 进程:

hs@hs-VirtualBox:~/skytools$ pgqd pgqd.ini

2013-05-15 14:01:12.181 4683 LOG Starting pgqd 3.1.4

2013-05-15 14:01:12.188 4683 LOG auto-detecting dbs ...

2013-05-15 14:01:12.310 4683 LOG test: pgq version ok: 3.1.3

2013-05-15 14:01:12.531 4683 LOG node1: pgq version ok: 3.1.3

2013-05-15 14:01:12.596 4683 LOG node2: pgq version ok: 3.1.3

2013-05-15 14:01:42.189 4683 LOG {ticks: 90, maint: 3, retry: 0}

2013-05-15 14:02:12.190 4683 LOG {ticks: 90, maint: 0, retry: 0}

如果ticker 已经成功启动了,我们已经把所有的基础工作完成了。到目前为止,我们配置了复制所需要的所有进程—但是,我们还没有告诉系统复制什么。

londiste 命令将为我们提供一组定义复制对象的命令。在我们的例子中,我们只是要添加所有的表并复制它们:

hs@hs-VirtualBox:~/skytools$ londiste3 londiste3.ini add-table --all

2013-05-15 14:02:39,367 4760 INFO Table added: public.t_test

就像Slony一样,londiste 将安装一个触发器,它会跟踪所有的变化。这些变化将希尔到pgq队列中,并有我们已经设置的进程来调度:

node1=# \d t_test

Table "public.t_test"

Column | Type | Modifiers

--------+-----------------------------+---------------

id | integer | not null

name | text |

t | timestamp without time zone | default now()

Indexes:

"t_test_pkey" PRIMARY KEY, btree (id)

Triggers:

_londiste_replication_queue AFTER INSERT OR DELETE OR UPDATE ON t_

test FOR EACH ROW EXECUTE PROCEDURE pgq.logutriga('replication_queue')

_londiste_replication_queue_truncate AFTER TRUNCATE ON t_test FOR

EACH STATEMENT EXECUTE PROCEDURE pgq.sqltriga('replication_queue')

Skytools 和 londiste 都特别地提供了使您的生活更方便的一组丰富的附加功能。然而,记录所有这些特征恐怕要查出本书的范围。如果您要了解更多的信息,我们建议更深入地去看Skytools 源代码的文档目录。您会发现一些有意思的文档,解释了一步一步地可以做什么。

PostgreSQL Replication之第十一章 使用Skytools(4)的更多相关文章

  1. PostgreSQL Replication之第十一章 使用Skytools(1)

    向您介绍了 Slony 之后,我们将介绍另外一种流行的复制工作.Skytools 是一个最初有 Skype 开发的软件包,它有多种用途.Skytools 不只是一个单一的程序,而且是一个工具与服务的集 ...

  2. PostgreSQL Replication之第十一章 使用Skytools(5)

    11.5 关于walmgr 的介绍 walmgr 是一个简化基于文件事务日志传输的工具.早在过去的一些日子里(在9.0版本之前),使用walmgr来简化基本备份是很常见的.随着流复制的引入,情况有了一 ...

  3. PostgreSQL Replication之第十一章 使用Skytools(3)

    11.3 管理 pgq-queues Skytools 的一个核心组件是pgq.它提供了一个通用排队接口,它可以让您把消息从一个消息提供者传送到一个任意数目的接收者. 现在的问题是:一般来说,一个队列 ...

  4. PostgreSQL Replication之第十一章 使用Skytools(2)

    11.2 剖析 skytools Skytools 不只是一个单一的脚本,而是一个提供各种不同服务的工具的集合.一旦我们安装了Skytools,更详细地查一下这些组件的细节是有意义的: • londi ...

  5. PostgreSQL Replication之第四章 设置异步复制(4)

    4.4 基于流和基于文件的恢复 生活并不总只是黑色或白色:有时也会有一些灰色色调.对于某些情况下,流复制可能恰到好处.在另一些情况下,基于文件复制和PITR是您所需要的.但是也有许多情况下,您既需要流 ...

  6. PostgreSQL Replication之第四章 设置异步复制(2)

    4.2 配置级联复制 正如您在本章已经看到的,设置流复制真的很容易.只需要设置几个参数,做一个基础备份,并享受您的复制设置. 在许多情况下,这种情况更有一点点微妙.在这个例子中我们假设:我们要使用一个 ...

  7. PostgreSQL Replication之第四章 设置异步复制(1)

    执行完您的第一个即时恢复(PITR,Point-In-Time-Recovery),我们准备在一个真正的复制设置上工作.在本章,您将学会如何设置异步复制和流.我们的目标是确保您可以实现更高的高可用和更 ...

  8. PostgreSQL Replication之第十三章 使用PL/Proxy扩展(3)

    13.3 聪明地扩展与处理集群 建立集群不是您面临的唯一任务.如果所有的事情都做完了并且系统已经运行了,您可能需要到处调整配置. 13.3.1 添加和移动分区 一旦一个集群启动并运行,您可能会发现您的 ...

  9. PostgreSQL Replication之第七章 理解Linux高可用(6)

    7.6 PostgreSQL和高可用性 数据库是我们日常数字生活的一部分,并期望它们快速工作. 您浏览网上论坛吗?那个帖子在数据库中.您看医生吗?您的医疗记录在数据库中.您在网上购物吗?那个货物,您的 ...

随机推荐

  1. Oracle数据库--SQL函数

    Oracle SQL函数  1.ASCII返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii( ...

  2. 基于LR的数据库性能测试

    web services协议 在LR的web services协议中提供了如下函数进行数据库的连接和执行sql语句,以实现对数据库的性能测试,也可以实现向数据库中自动生成批量数据. lr_db_dis ...

  3. w-BIG TABLE-view+where-small table

    w-BIG TABLE DROP PROCEDURE IF EXISTS truncate_insert_sales_rank_toparow_month; DELIMITER /w/ CREATE ...

  4. 十 mybatis逆向工程

    1       逆向工程 1.1     什么是逆向工程 mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的代码(mapper. ...

  5. Jsoncpp 数组的使用

    JsonCpp 是一个C++用来处理JSON 数据的开发包.下面讲一下怎么使用JsonCpp来序列化和反序列化Json对象,以实际代码为例子. 反序列化Json对象 比如一个Json对象的字符串序列如 ...

  6. Servlet Threading Model

    Servlet Threading Model The scalability issues of Java servlets are caused mainly by the server thre ...

  7. Qt调用Server SQL中的存储过程

    Server SQL中的存储过程如下: CREATE procedure PINSERTPC @pcnum int, @pcname varchar(50), @pctype int, @ipaddr ...

  8. html5学习测试

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. json-lib 之jsonConfig具体应用

    一,setCycleDetectionStrategy 防止自包含 public static void testCycleObject() {         CycleObject object ...

  10. Java学习-029-JSON 之三 -- 模仿 cssSelector 封装读取 JSON 数据方法

    前文简单介绍了如何通过 json-20141113.jar 提供的功能获取 JSON 的数据,敬请参阅:Java学习-028-JSON 之二 -- 数据读取. 了解学习过 JQuery 的朋友都知道, ...