在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个节点可以驻留在同一台服务器上,但指向不同的数据库。
主节点引用数据将被复制的节点。
从节点是指数据将被复制到的节点。
集群是指在复制期间进行交互的节点集合。