dblink怎样实现分布式事务 |
| pgsqldb.com (2005-04-26 12:05:28) |
|
|
简单说两句: 前提:
需要有postgresql的源代码,并且编译过(不一定安装)。
步骤: 1,先下载这个:
http://laser.dyndns.zhengmai.net.cn/download/slony1-1.0.2.tar.gz
解压缩后,有slony1-1.0.2目录。
2,进入该目录,configure --with-pgsourcetree=<postgresql 源代码目录>
3,make & make install
4,以一个数据库用户的身份,我先说一个最简单的,所有表都有主键 的,点对点的主从复制方案,我们需要写下面这么一个脚本:
#!/bin/sh
CLUSTER=『你的集群的名称,随意』 DBNAME1=『需要复制的源数据库』 DBNAME2=『需要复制的目的数据库』 HOST1=『源库IP或主机名』 HOST2=『目的库IP或主机名』 SLONY_USER=『源库数据库超级用户名』 PGBENCH_USER=『源库用户名,没啥用』
slonik <<_EOF_ #这句是定义集群名 cluster name = $CLUSTER;
#这两句是定义复制节点 node 1 admin conninfo = 'dbname=$DBNAME1 host=$HOST1 user=$SLONY_USER'; node 2 admin conninfo = 'dbname=$DBNAME2 host=$HOST2 user=$PGBENCH_USER';
#初始化集群,id从1开始,如果只有一个集群,那么肯定是1 #comment里可以写一些自己的注释,随意 init cluster ( id = 1, comment = 'Node 1' );
#创建一个复制集,id也是从1开始 create set ( id = 1, origin = 1, comment = 'All pgbench tables' );
#向自己的复制集种添加表,每个需要复制的表一条set命令, #id从1开始,逐次递加,步进为1; #fully qualified name是表的全称:模式名.表名 #这里的复制集id需要和前面创建的复制集id一致,origin关键字 #这里暂时不解释 set add table ( set id = 1, origin = 1, id = 1, fully qualified name = 'public.accounts', comment = 'Table accounts' ); set add table ( set id = 1, origin = 1, id = 2, fully qualified name = 'public.branches', comment = 'Table branches' ); set add table ( set id = 1, origin = 1, id = 3, fully qualified name = 'public.tellers', comment = 'Table tellers' ); # #假如某个表没有主键,但是有唯一键字,那么可以用key关键字 #指定其为复制键字,如下面的key参数,如果都没有,则需要添加 #主键,我们以后来讲 set add table ( set id = 1, origin = 1, id = 4, fully qualified name = 'public.history', key = "column", comment = 'Table history' );
#存储主从两个节点的信息 #下面是从节点 store node ( id = 2, comment = 'Node 2' ); #下面是主节点的连接参数 store path ( server = 1, client = 2, conninfo = 'dbname=$DBNAME1 host=$HOST1 user=$SLONY_USER'); #下面是从节点的连接参数 store path ( server = 2, client = 1, conninfo = 'dbname=$DBNAME2 host=$HOST2 user=$PGBENCH_USER'); #设置复制中角色,主节点是原始提供者,从节点是接受者 store listen ( origin = 1, provider = 1, receiver = 2 ); store listen ( origin = 2, provider = 2, receiver = 1 ); _EOF_
5,然后执行这个脚本,在任何数据库用户下都可以,自己搞定认证问题吧。
6,在源库(主服务器)上运行命令:
slon 『你的集群的名称』 "dbname=『需要复制的源数据库』 user=『源库数据库超级用户名』"&
7,在目的库(从服务器)上运行命令:
slon 『你的集群的名称』 "dbname=『需要复制的目的数据库』 user=『源库数据库超级用户名』"&
8,提交复制集,可以用下面的脚本:
#!/bin/sh
CLUSTER=『你的集群的名称,随意』 DBNAME1=『需要复制的源数据库』 DBNAME2=『需要复制的目的数据库』 HOST1=『源库IP或主机名』 HOST2=『目的库IP或主机名』 SLONY_USER=『源库数据库超级用户名』 PGBENCH_USER=『源库用户名,没啥用』
slonik <<_EOF_ # ---- # This defines which namespace the replication system uses # ---- cluster name = $CLUSTER;
#提供连接参数 node 1 admin conninfo = 'dbname=$DBNAME1 host=$HOST1 user=$SLONY_USER'; node 2 admin conninfo = 'dbname=$DBNAME2 host=$HOST2 user=$PGBENCH_USER';
#提交复制集 subscribe set ( id = 1, provider = 1, receiver = 2, forward = no); _EOF_
slony1是基于postgresql的异步通知机制做的复制技术, 其同步速度非常快,我测试的结果是近乎实时。目前我这个bbs 采用这个复制技术来做备份,呵呵,除了配置稍微复杂点,非常好用!
因为时间关系,更复杂的层次复制我们以后再谈吧。slony自己的 文档也不老少。最近忙坏了。实在没时间细讲。有具体试验问题, 在这里讨论吧,我抽空回复大家。
(http://www.fanqiang.com)
原文链接:http://bbs.pgsqldb.com/index.php?t=msg&th=4716&start=0&rid=&S=93db471195f5359505157b010e89f22e
|
|