www.wohedb.com  中文数据库管理系统 第一章   基本概念
1.1 概述
PostgreSQL的异步复制支持一个主节点和多个从节点的复制模式。主节点可以将数据复制到多个从节点中。理论上一个主节点带的从节点的个数是没有上限的,但从节点的个数越多,主节点和从节点之间的通信开销越大,所以从节点过多会导致复制系统无法正常工作。从节点也可以成为主节点,将数据复制到下一级的从节点。PostgreSQL的异步复制系统不提供检测参加复制的节点是否处于可用状态的功能,也没有提供将在主节点无法正常工作时,自动将从节点变成主节点的功能。当前PostgreSQL的异步复制只能复制表和序列,不能复制大对象。数据库的模式变化也不能被自动复制,但数据库管理员可以使用复制系统提供的功能手动将主节点上的模式变化复制到从节点上(详细信息请参考第2.4.25节对EXECUTE SCRIPT命令的介绍)。1.2 基本概念
     PostgreSQL的异步复制有下面几个基本概念:(1)节点(2)集群(3)复制集(4)源节点、提供者和订阅者(5)slon进程(6)slonik配置处理器下面详细介绍这这些概念:(1)节点每个参加复制的PostgreSQL数据库实例都是一个节点。多个节点可以位于同一个机器上。使用下面的slonik命令来定义一个节点。NODE 1 ADMIN CONNINFO = 'dbname=testdb host=server1 user=slony';(2)集群    集群是指参见复制的所有节点的集合。每个集群都有一个名字。使用下面的slonik命令来定义一个集群:cluster name = something;
其中的something表示集群的名字。(3)复制集一个或多个被复制的表和序列的构成的集合叫复制集。复制集是PostgreSQL的异步复制的基本复制单位。一个复制系统至少要有一个复制集。(4)源节点、提供者和订阅者每个复制集都有一个源节点,只有在源节点才能更新被复制的数据。提供被复制的数据的节点叫提供者,源节点也是提供者。接收被复制的数据的节点叫订阅者。从节点一般只是订阅者,从节点如果也是一个新的主节点,那么从节点也是一个提供者。(5)slon进程在集群的每个节点上都有一个slon进程。它负责具体的复制任务。(6)slonik配置处理器slonik是一个配置命令处理器。所有的复制的配置信息都是用一种特殊的语言来书写的,这种语言类似于SQL命令。详细信息参考第二章《slonik命令》。 1.3 复制集群节点编号
     复制集群中的每一个节点都有一个编号, 标号必须是数字,一般从1开始。例如,假设我们有一个由两个节点组成的复制集群,一个是主节点,另一个是从节点,可以将主节点的编号设为1,将从节点的编号设为2。节点的编号一旦确定以后就不能再更改。1.4 定义复制集
     复制集是PostgreSQL的异步复制的基本复制单位。一个复制集中可以包含一个或多个表(序列)。使用slonik命令create set命令来创建一个复制集。复制集中的表必须有一个主键。使用slonik命令SET ADD TABLE 来向复制集添加表或序列。如果两个或多个表之间有外键联系,应当把这些表放在同一个复制集里。 1.5 复制集群实例
     本节介绍如何创建一个复制集群。该集群只有两个节点。这两个节点都位于同一个机器上。第一个节点的数据库实例在端口5432监听用户请求,第二个节点的数据库实例在端口5433监听用户请求。第一个节是主节点,第二个节点是从节点。两个数据库实例都含有一个叫rep_db的数据库,该数据库中有一个表rep_table_1,rep_table_1单独构成了一个复制集。注意设置两个数据库实例的pg_hba.conf文件,保证两个数据库实例能够成功地连接对方。下面介绍详细的创建复制集群的步骤:(1)启动主节点和从节点,在两个节点中创建数据库rep_db。(2)在两个节点的数据库rep_db中创建表rep_table_1,使用下面的命令建表:create table rep_table_1 (col_1 char(30)  primary key, col2 integer);(3)在主节点上执行下面的slonik命令slonik <<_EOF_        cluster name = rep_cluster;                node 1 admin conninfo = 'dbname=rep_db host=localhost user=postgres port=5432';        node 2 admin conninfo = 'dbname=rep_db host=localhost user=postgres port=5433';         init cluster ( id=1, comment = 'Master Node');        create set (id=1, origin=1, comment='first replication set');        set add table (set id=1, origin=1, id=1, fully qualified name = 'public.rep_table_1', comment='first replication table');        store node (id=2, comment = 'Slave node', event node = 1);        store path (server = 1, client=2, conninfo='dbname=rep_db host=localhost user=postgres port=5432');        store path (server = 2, client=1, conninfo='dbname=rep_db host=localhost user=postgres port=5433'); _EOF_ (4)在主机点上执行下面的命令slonik <<_EOF_cluster name = rep_cluster;node 1 admin conninfo = 'dbname=rep_db host=localhost user=postgres port=5432';node 2 admin conninfo = 'dbname=rep_db host=localhost user=postgres port=5433';subscribe set ( id = 1, provider = 1, receiver = 2, forward = no);_EOF_     (5)执行下面的命令启动复制服务slon rep_cluster "dbname=rep_db user=postgres host=localhost port=5432"slon rep_cluster "dbname=rep_db user=postgres host=localhost port=5433"    上面的5步成功执行以后,复制集群就处于正常工作的状态了,在主节点上,向表rep_table_1插入数据,在从节点上很快就能看到rep_table_1中被插入的数据。