Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103780720
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-05-02 21:11:17

 

  需要有 postgresql 的源代码,并且编译过(不一定安装)。

  步骤:

  1,先下载这个:

  解压缩后,有 slony1-1.0.2 目录。

  2,进入该目录,configure --with-pgsourcetree=

  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 采用这个复制技术来做备份,呵呵,除了配置稍微复杂点,非常好用!

阅读(1086) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~