10.3 复制您的第一个数据库

这个小小的介绍之后,我们可以继续前进并复制我们的第一个数据库。要做到这一点,我们可以在一个数据库实例上创建两个数据库。我们想简单地在这两个数据库之间进行复制。

[ 您在一个实例上复制或在两个实例上复制,这是没有区别的—它的工作原理完全一样。]

一旦您的实例启动并运行了,创建这两个数据库应该是一件容易的事:

hs@hs-VirtualBox:~$ createdb db1

hs@hs-VirtualBox:~$ createdb db2

现在我们可以创建一个表,它应该被从数据库db1复制到数据库db2:

db1=# CREATE TABLE t_test (id serial, name text,

PRIMARY KEY (id));

NOTICE: CREATE TABLE will create implicit sequence "t_test_id_seq" for

serial column "t_test.id"

NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "t_test_

pkey" for table "t_test"

CREATE TABLE

在两个数据库上,以相同的方式创建这个表;因为表结构不会自动复制。

一旦这项工作完成,我们可以写一个slonik脚本告诉关于我们的两个节点的集群。slonik是一个我们可以用来和Slony进行直接对话的命令行接口。您也可以用它交互工作,但,这不是太方便。

注册这些节点的脚本将如下所示:

#!/bin/sh

MASTERDB=db1

SLAVEDB=db2

HOST1=localhost

HOST2=localhost

DBUSER=hs

slonik<<_EOF_

cluster name = first_cluster;

# define nodes

node 1 admin conninfo = 'dbname=$MASTERDB host=$HOST1 user=$DBUSER';

node 2 admin conninfo = 'dbname=$SLAVEDB host=$HOST2 user=$DBUSER';

# init cluster

init cluster ( id=1, comment = 'Master Node');

# group tables into sets

create set (id=1, origin=1, comment='Our tables');

set add table (set id=1, origin=1, id=1,

fully qualified name = 'public.t_test',

comment='sample table');

store node (id=2, comment = 'Slave node',

event node=1);

store path (server = 1, client = 2, conninfo='dbname=$MASTERDB

host=$HOST1 user=$DBUSER');

store path (server = 2, client = 1, conninfo='dbname=$SLAVEDB

host=$HOST2 user=$DBUSER');

_EOF_

首先,我们定义了几个环境变量。这不是必须的,但是确保万一有变化,没有任何事情被遗忘是很方便的。然后,我们的slonik脚本启动了。

我们要做的第一件事是定义一个集群名。这一点很重要:使用Slony,集群是一个更加虚拟的东西—它并不需要和物理硬件相关。稍后,我们将会发现故障转移是什么意思。

在接下来的步骤中,我们必须定义我们这个集群中的节点。这里的思想是,每个节点将有一个和连接字符串相关的数字。一旦这些工作完成了,我们可以调用init cluster。在此步骤中,Slony将部署所有的基础设施进行复制。在这里,我们不必手动安装任何东西。

既然集群已经被初始化,我们可以把我们的表组织成复制集合,其实只是一组表。在Slony中,我们将始终与复制集合工作。表被分组为集合,并复制到一起。这个抽象层允许我们迅速移动表。在许多情况下,这比一个一个地移动单个表要容易的多。

最后,我们必须定义路径。什么是路径?路径基本上就是从A移动到B的连接字符串。这里驻澳的问题是,为什么需要路径。我们已经在前面定义了节点,为什么要定义路径?问题的关键是:从A到B的路径不一定要和从B到A的路径一样。如果这些服务器中的一台服务器在某个DMZ(隔离区),而另外一台服务器不在,这显得尤其重要。换句话说,通过定义路径,您可以很容易地在两个不同的专用网络之间复制和跨防火墙,如果有必要做些NAT。

由于脚本是一个简单的shell脚本,我们可以很容易地执行它:

hs@hs-VirtualBox:~/slony$ sh slony_first.sh

Slony在后台已经做了一些工作。当看我们的测试表是,我们可以看到发生了什么:
    db1=# \d t_test

Table
"public.t_test"

Column | Type |
Modifiers

--------+---------+-----------------------------------------------------

id | integer |
not null default nextval('t_test_id_seq'::regclass)

name | text |

Indexes:

"t_test_pkey"
PRIMARY KEY, btree (id)

Triggers:

_first_cluster_logtrigger
AFTER INSERT OR DELETE

OR UPDATE ON
t_test

FOR EACH ROW EXECUTE PROCEDURE _first_cluster.logtrigger('_first_cluster',
'1', 'k')

_first_cluster_truncatetrigger
BEFORE TRUNCATE ON t_test FOR EACH

STATEMENT EXECUTE
PROCEDURE _first_cluster.log_truncate('1')

Disabled triggers:

_first_cluster_denyaccess
BEFORE INSERT OR DELETE OR UPDATE ON t_test FOR EACH ROW EXECUTE PROCEDURE
_first_cluster.denyaccess('_first_cluster')

_first_cluster_truncatedeny
BEFORE TRUNCATE ON t_test FOR EACH

STATEMENT EXECUTE
PROCEDURE _first_cluster.deny_truncate()

已经自动部署了一些触发器来跟踪这些变化。每个事件都被触发器覆盖。

既然这个表由Slony控制,我们就可以开始复制它了。要做到这一点,我们必须再次写一个slonik脚本:

#!/bin/sh

MASTERDB=db1

SLAVEDB=db2

HOST1=localhost

HOST2=localhost

DBUSER=hs

slonik<<_EOF_

cluster name =
first_cluster;

node 1 admin
conninfo = 'dbname=$MASTERDB host=$HOST1 user=$DBUSER';

node 2 admin
conninfo = 'dbname=$SLAVEDB host=$HOST2 user=$DBUSER';

subscribe set (
id = 1, provider = 1, receiver = 2, forward = no);

_EOF_

在声明了集群名称和在列表中列出节点之后,我们就可以调用subscirbe set了。这里的关键是,在我们的例子中,设置1数字1是从节点1复制到节点2(接收者)。在这里提到的关键词是重要的。此关键字表示,在复制期间,新的用户是否应该存储日志信息,以使其有可能成为未来的提供者角色的候补节点。任何计划成为一个故障转移的候选节点必须设置 forward =yes。除此之外,要做级联复制(意味着,A复制到B,B复制到C)此关键字是必不可少的。

如果您执行这个脚本,Slony将清空slave上的表,并重新加载所有的数据,以确保事情是同步的。在很多情况下,您已经知道您是同步的,您想避免一次又一次地复制GB的数据。要做到这一点,我们可以添加OMIT COPY = yes。这将告诉Slony,我们有足够的信息,数据已经在同步。

在定义了我们要复制的东西之后,我们就可以用我们最喜欢的UNIX shell启动那两个slon守护进程了。

$ slon first_cluster
'host=localhostdbname=db1'

$ slon first_cluster
'host=localhostdbname=db2'

这也可以在我们定义这个复制过程之前做—所以,在这里顺序不是主要需要关注的。

现在我们可以继续前进,并检查复制是否顺利地工作:

db1=# INSERT INTO t_test (name) VALUES ('anna');

INSERT 0 1

db1=# SELECT * FROM t_test;

id | name

----+------

1 | anna

(1 row)

db1=# \q

hs@hs-VirtualBox:~/slony$ psql db2

psql (9.2.4)

Type "help" for help.

db2=# SELECT * FROM t_test;

id | name

---+------

(0 rows)

db2=# SELECT * FROM t_test;

id | name

--- +------

1 | anna

(1 row)

我们往master中添加了一行数据,迅速断开,并查询数据是否已经存在。如果您碰巧速度够快,您将看到数据出现会有一个小的延迟。在我们的例子中,我们设法得到一个空表只是为了说明异步复制的真正含义。

[让我们假设您正在运行一个书店。您的应用程序连接到服务器A并创建一个新用户。然后,用户将被重定向到一个新的页面,其中查询一些关于新用户的信息—做好那个数据还没有在服务器B上的可能性。在许多web应用负载均衡处理中,这是一中常见的错误。使用异步流复制也会发生同样的延迟。]

PostgreSQL Replication之第十章 配置Slony(3)的更多相关文章

  1. PostgreSQL Replication之第十章 配置Slony(1)

    在PostgreSQL领域中,Slony是最广泛的复制解决方案之一.它不仅是最老的复制方案实现的一个,但也是有最多的外部工具支持的一个,例如PgAdmin3等. 在本章中,我们将深入探究Slony并学 ...

  2. PostgreSQL Replication之第十章 配置Slony(6)

    10.6 执行故障切换 一旦您学会了如何复制表并将它们添加到集合中,是时候学习故障转移了.基本上,我们可以在两个两种类型的故障转移之间做出区分: • 计划内故障转移 • 计划外故障转移和崩溃 在本节, ...

  3. PostgreSQL Replication之第十章 配置Slony(5)

    10.5 给复制添加表和管理的问题 一旦我们增加了此表到系统中,我们可以将它添加到复制设置.这样做有点复杂.首先,我们必须创建我们自己的新表集合并把这个和我们已经有的表合并.因此,过一段时间,我们将有 ...

  4. PostgreSQL Replication之第十章 配置Slony(4)

    10.4 部署DDLs 对于生产性的应用程序来说,仅仅复制一个表明显是不够的.此外,通过没有办法保证数据从来不会发生改变.在某些时候,部署变化的数据结构(所谓的DDLs)是必要的. 现在的问题是,Sl ...

  5. PostgreSQL Replication之第十章 配置Slony(2)

    10.2 理解 Slony如何工作 在我们开始复制我们的第一个数据库之前,我们想深入Slony的架构.理解这是如何工作的是非常重要的,否则,将不可能以一种有用的和合理的方法使用这个软件.与事务日志流不 ...

  6. [转]PostgreSQL Replication之扩展与BDR

    原文:https://www.cnblogs.com/xmzzp/p/6284300.html postgres 实现master, slave ,且master是多主. -------------- ...

  7. PostgreSQL Replication之第九章 与pgpool一起工作(7)

    9.7 处理故障转移和高可用 可以使用pgpool来解决的一些明显的问题是高可用性和故障转移.一般来讲,有使用pgpool或者不使用pgpool可以用来处理这些问题的各种方法. 9.7.1 使用Pos ...

  8. 安装Postgresql之后,创建用户 配置rails

    登录 sudo su - postgres psql 1 创建Postgresql新用户,devpg是用户名,密码也是devpg, 不是超级管理员,拥有创建数据库权限,登录权限,继承拥有角色权限 cr ...

  9. PostgreSQL Replication之第四章 设置异步复制(4)

    4.4 基于流和基于文件的恢复 生活并不总只是黑色或白色:有时也会有一些灰色色调.对于某些情况下,流复制可能恰到好处.在另一些情况下,基于文件复制和PITR是您所需要的.但是也有许多情况下,您既需要流 ...

随机推荐

  1. MongoDB性能监控

    1.mongostat 查看运行中的mongodb实例的统计信息 重要指标说明: getmore: 通常发生在结果集比较大的查询时,第一个query返回了部分结果,后续的结果是通过getmore来获取 ...

  2. Translation Lookaside Buffer

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION In principle, then, e ...

  3. win7 创建软链接方式

    mklink  目标文件  源文件(需要被软链的文件) Win7中的软链接详解(mklink命令) Post by 铁木箱子 in 技术杂谈 on 2011-05-24 13:13. 点评一下 评论 ...

  4. 【git】删除某个文件的所有历史记录,批量删除远程分支

    删除git某个文件的所有历史记录 git的目的就是版本控制,记录每一个版本的变动.然而有的时候我们往往希望从版本库中彻底删除某个文件,不再显示在历史记录中.例如不小心上传了一堆错误的文件,或者不小心上 ...

  5. UBUNTU 14.04 安装 OPENCV 2.4.9

    1.  从OpenCV.org 下载源代码 opencv-2.4.9.zip 2. 解压到准备好的目录 unzip opencv-2.4.9.zip 3. 进入源码目录,创建release目录 cd ...

  6. 蓝牙BLE LINK LAYER剖析(二) -- PDU

    DATA FORMAT The Link Layer has only one packet format used for both advertising channel packets and ...

  7. 通过nginx配置文件抵御攻击

    通过nginx配置文件抵御攻击 囧思九千 · 2013/11/12 12:22 0x00 前言 大家好,我们是OpenCDN团队的Twwy.这次我们来讲讲如何通过简单的配置文件来实现nginx防御攻击 ...

  8. 关于pom.xml的一些问题的理解

    最近在pom上出了一些问题,搞了一天才理解了一些问题,记录一下. 当在覆盖本地repository包之后,pom.xml上面出现了一个x. 当mvn->update project之后,还是有许 ...

  9. jsp 标签、 项目全路径引用${CTX}

    请根据自己的需要选择以下标签. <%@ taglib uri="/struts-tags" prefix="s"%><%@ taglib ur ...

  10. JQuery中国省市区无刷新三级联动查询

    之前有写过用<Ajax控件来实现中国的省市区无刷新查询> 今天用JQuery来实现,用Ajax控件和JQuery的优缺点就先不说了. 效果图如下: 下面来结合代码来详细说明一下如何用JQu ...