在PostgreSQL 8.3上配置Slony-I级联复制

在PostgreSQL 8.3上配置Slony-I级联复制

介绍

本指南针对希望将Slony-I配置为将数据库从主机复制到不同主机上的从站的用户。

如果您是Slony-I的新人,请参阅本页底部的术语,并确保阅读:

http://slony.info/documentation/concepts.html

先决条件

本指南假定已安装Postgres和Slony-I。

设计

本指南的复制设计如下:

主机hostM上将有一个数据库数据库的主节点。 我们要将数据库复制到hostS上的另一个节点。 hostS将是从节点。 复制将是一种方式,因此只有db上的更新将被复制到hostS

斯隆尼克

Slony使用一个名为slonik的应用程序来初始化,建模和更新集群中的数据库。 对于slony来说,slony将在参与复制的数据库中创建表。 slonik在数据库上执行许多命令,例如创建表并进行修改,以便它们被初始化以便与slony一起使用。

为了使slonik能够执行此操作, slonik必须能够连接到hostM和hostS上的数据库。

要测试这一点,请尝试从主主机hostM的以下内容

psql -d db -h hostM -U slony
psql -d db -h hostS -U slony

请注意,在上面的例子中,我试图以用户“ slony ”连接。 这是我在postgres上创建的超级用户 ,仅用于复制。 这不是必需的,您可以使用标准的“postgres”用户进行连接。

对,所以如果这个工作,slonik应该工作。 如果没有工作,那么你可能需要尝试几件事情:

1.检查主机是否已启动

ping hostX

2.检查防火墙是否阻塞连接(通常在从节点上)。

#root:# iptables -L

扫描上述命令的输出,看看是否接受标准的Postgres端口5432。

3.检查你的postgres.conf文件

#postgres:# cd $PGDATA
#postgres:# grep listen_addresses *.conf

你想要看到像listen_addresses ='*'。 如果行前面有一个散列,那么它已被注释掉(默认)。 使用你最喜爱的文本编辑器来改变它。

4.检查postgres“防火墙”。 Postgres使用访问控制列表来控制谁可以连接到什么数据库。 这里有很好的记录,我建议大家都知道如何配置这个文件:

http://www.postgresql.org/docs/8.3/interactive/auth-pg-hba-conf.html

以下两行会告诉postgres,如果尝试从hostS或hostM连接,可以接受用户slony。 请注意,此文件按顺序进行解析,并使用第一个匹配项。 另请注意,我已将其配置为仅使用IP而不是本地unix套接字,因为稍后使用的slonik命令将使用IP地址引用节点。

 host all slony <serverIP> trust
 host all slony <clientIP> trust

希望如果你有这么远,你的slonik现在可以和所有的节点通话,我们可以继续下去。

Slonik初始化

Slony可以做一些事情,但是它不能做的一件事是复制模式和模式更改。 为此,在初始化slony之前,我们必须将数据库的DDL(结构/模式)复制到从节点。 我们可以使用以下命令:

#slony@master#: pg_dumpall -s -c -d db | gzip ddl.sql.gz

<copy file to slave>

#slony@slave#: psql -d db < gunzip ddl.sql.gz

从这里开始复制数据之前,我们可以开始执行slonik脚本,让数据库进行通话。 当执行slonik命令时,它将尝试与从节点建立连接并传播信息。 这个初始步骤创建了使节点通话所必需的链接...

我喜欢这样做是一个脚本(在服务器上,虽然不重要)如下:

#!/usr/local/pgsql/bin/slonik
define CLUSTER cname;
define PRIMARY 1;
define SLAVE 10;
cluster name = @CLUSTER;

node @PRIMARY   admin conninfo = 'dbname=db host=hostM user=slony';

node @SLAVE admin conninfo = 'dbname=db host=hostS user=slony';

init cluster (id=@PRIMARY, comment='Primary Slony Node');

store node (id=@SLAVE, event node=@PRIMARY, comment='Slave Slony Node');

store path (server=@PRIMARY, client=@SLAVE, conninfo='dbname=db host=hostM user=slony');

store path (server=@SLAVE, client=@PRIMARY, conninfo='dbname=db host=hostS user=slony');

有关这些命令的信息,请参阅这里的slony文档: http : //slony.info/documentation/cmds.html

这里是快速浏览这些命令在这里:

第1行告诉bash可以使用什么命令来运行此脚本。 所以,如果您将脚本更改为可执行文件,它将由slonik运行。

define命令像标准宏一样定义并允许更多可读的脚本。 它也有助于避免拼写错误。

“节点”通知一个节点的存在以及如何连接到它。

'init cluster'在主节点上创建slony表。

'store node'在从节点上创建slony表。

“存储路径”为两个节点之间的通信创建一个单向路径。

接下来我们可以运行脚本:

#slony@server# chmod u+x script.sk 
#slony@server# ./script.sk
#slony@server# psql -U slony -h hostM -d db -c "\n" | grep slony
#slony@server# psql -U slony -h hostS -d db -c "\n" | grep slony

希望最后2个命令的输出将显示主机和客户端数据库中有一个名为“_slony”的模式。

如果一切都成功,那么我们可以开始启动复制守护进程。

俚语

这个寂寞的守护进程是积极的Minion制。 它们在数据库中起触发作用,并将数据发送到从节点。 对于数据库中的每个节点,必须有一个slon守护程序运行。

在服务器上启动slon守护进程,键入:

slon cname "dbname=db host=hostM user=slony"

你应该看到一堆信息飞过。

在Minion上启动slon守护进程,键入:

slon cname "dbname=db host=hostS user=slony"

你现在应该看到一堆消息飞过,如果你正在看服务器控制台,你会看到一些更多的信息飞到那里。

检查没有任何错误,如果您已经通过上述连接步骤,那么您不应该有任何错误。

在这个时间点上,节点都是相互通话,等待听到有没有需要复制的数据。 我们还没有定义什么数据应该被复制,所以守护进程将相当空闲。 为了开始复制,我们需要订阅一些数据。

订阅

以下脚本可以从服务器运行,它会告诉slony在一组表上创建触发器,并在数据被修改,添加或删除时进行复制。

该脚本将需要针对要复制的表和序列进行调整。

#!/usr/local/pgsql/bin/slonik
define CLUSTER cname;
define PRIMARY 1;
define SLAVE 10;
cluster name = @CLUSTER;

node @PRIMARY admin conninfo = 'dbname=db host=hostM user=slony';

node @SLAVE admin conninfo = 'dbname=db host=hostS user=slony';

create set (id=1, origin=@PRIMARY, comment='set1');

set add table (id=1, set id=1, origin = @PRIMARY, fully qualified name = 'schema.tablename', comment = 'table');

set add sequence (id=1, set id=1, origin = @PRIMARY, fully qualified name = 'schema.sequencename', comment = 'seq');

subscribe set (id = 1, provider = @PRIMARY, receiver = @SLAVE); 

运行此脚本后,显示slon守护程序的控制台应该显示正在复制数据。 请注意,一般来说,您不会作为前台进程运行slon守护程序,而是使用runlevel脚本(如果您使用RPM进行安装,则安装到/etc/init.d)。

就是这样。

希望本教程有助于启发您,请随时发表评论,指出错误或要求更多。

邓肯

术语

节点是主机和相应数据库的术语 例如,2个节点可以驻留在同一台服务器上,但指向不同的数据库。

主节点引用数据将被复制的节点。

从节点是指数据将被复制的节点。

集群是指在复制期间进行交互的节点集合。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏