PostgreSQL Replication之第十一章 使用Skytools(4)
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)的更多相关文章
- PostgreSQL Replication之第十一章 使用Skytools(1)
向您介绍了 Slony 之后,我们将介绍另外一种流行的复制工作.Skytools 是一个最初有 Skype 开发的软件包,它有多种用途.Skytools 不只是一个单一的程序,而且是一个工具与服务的集 ...
- PostgreSQL Replication之第十一章 使用Skytools(5)
11.5 关于walmgr 的介绍 walmgr 是一个简化基于文件事务日志传输的工具.早在过去的一些日子里(在9.0版本之前),使用walmgr来简化基本备份是很常见的.随着流复制的引入,情况有了一 ...
- PostgreSQL Replication之第十一章 使用Skytools(3)
11.3 管理 pgq-queues Skytools 的一个核心组件是pgq.它提供了一个通用排队接口,它可以让您把消息从一个消息提供者传送到一个任意数目的接收者. 现在的问题是:一般来说,一个队列 ...
- PostgreSQL Replication之第十一章 使用Skytools(2)
11.2 剖析 skytools Skytools 不只是一个单一的脚本,而是一个提供各种不同服务的工具的集合.一旦我们安装了Skytools,更详细地查一下这些组件的细节是有意义的: • londi ...
- PostgreSQL Replication之第四章 设置异步复制(4)
4.4 基于流和基于文件的恢复 生活并不总只是黑色或白色:有时也会有一些灰色色调.对于某些情况下,流复制可能恰到好处.在另一些情况下,基于文件复制和PITR是您所需要的.但是也有许多情况下,您既需要流 ...
- PostgreSQL Replication之第四章 设置异步复制(2)
4.2 配置级联复制 正如您在本章已经看到的,设置流复制真的很容易.只需要设置几个参数,做一个基础备份,并享受您的复制设置. 在许多情况下,这种情况更有一点点微妙.在这个例子中我们假设:我们要使用一个 ...
- PostgreSQL Replication之第四章 设置异步复制(1)
执行完您的第一个即时恢复(PITR,Point-In-Time-Recovery),我们准备在一个真正的复制设置上工作.在本章,您将学会如何设置异步复制和流.我们的目标是确保您可以实现更高的高可用和更 ...
- PostgreSQL Replication之第十三章 使用PL/Proxy扩展(3)
13.3 聪明地扩展与处理集群 建立集群不是您面临的唯一任务.如果所有的事情都做完了并且系统已经运行了,您可能需要到处调整配置. 13.3.1 添加和移动分区 一旦一个集群启动并运行,您可能会发现您的 ...
- PostgreSQL Replication之第七章 理解Linux高可用(6)
7.6 PostgreSQL和高可用性 数据库是我们日常数字生活的一部分,并期望它们快速工作. 您浏览网上论坛吗?那个帖子在数据库中.您看医生吗?您的医疗记录在数据库中.您在网上购物吗?那个货物,您的 ...
随机推荐
- Shell-bash中特殊字符汇总[转]
转自http://www.linuxidc.com/Linux/2015-08/121217.htm 首先举例一个bash脚本 #!/bin/bash file=$1 files=`find / -n ...
- Oracle数据库--SQL
1.事务(Transaction ) 1)命名事务 set transaction name ‘transaction_name ’; 2)查看事务是否存在 select name from v$tr ...
- Allowed memory size Out of memory ini_set('memory_limit', '-1');
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 51 bytes) ini_set(' ...
- 【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】
树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AV ...
- epoll 简单介绍及例子
第一部分:Epoll简介 . 当select()返回时,timeout参数的状态在不同的系统中是未定义的,因此每次调用select()之前必须重新初始化timeout和文件描述符set.实际上,秒,然 ...
- [收藏]Asp.net MVC生命周期
一个HTTP请求从IIS移交到Asp.net运行时,Asp.net MVC是在什么时机获得了控制权并对请求进行处理呢?处理过程又是怎样的? 以IIS7中asp.net应用程序生命周期为例,下图是来自M ...
- Bootstrap 一. 排版样式(内联文本元素,对齐,大小写,缩略语,地址文本,引用文本,列表排版 ,代码 )
第 2 章 排版样式 在 h1 ~ h6 元素之间,还可以嵌入一个 small 元素作为副标题 <h1>Bootstrap 框架 <small>Bootstrap 小标题< ...
- nrf51822-添加DFU服务
以ble_app_uart例子为基础,在其上添加dfu服务. Sdk中的bootloader提供了两个方式来进入升级模式,一种是按键,另一种是手机点击升级. 在bootloader代码相关代码如下 如 ...
- NSString的常见方法
//1.创建常量字符串. NSString *astring = @"This is a String!"; //2.创建空字符串,给予赋值. NSString *astrin ...
- php日期时间函数 整理
设定系统默认时区 date_default_timezone_get() $tz='America/Los_Angeles'; 返回系统默认时区 date_default_timezone_set($ ...