3. 1 POST RESQL STA DBY 3
Figure 2: PostgreSQL 9 的 standby
1.3.2 将 primary 节点设定为备份状态
将 primary 节点 restart ,以 superuser 登录到 postgres 库,执行:
select pg start backup ( ' ' ) ;
服务器即进入“备份”状态。停止从 WAL 向数据区的写入。此时所有对 primary 的访问仍
可正常进行。
从 pg start backup 函数的参数可以看出,我们可以给备份过程起一个好记的名字。
1.3.3 建立 standby 节点
在 standby 主机上建立一个空的数据目录,可以以 postgres 身份 mkdir 后设定读写权限为
700。
将 primary 主机的 data 目录中的内容 scp 到这里——同样道理,rsync 或手工调用 gzip 都
会提高传输效率。
这样复制过来的目录中会有 primary 节点的 pid 文件。删除 postmaster.pid。
修改 postgresql.conf 和 pg hba.conf ,将网络访问权限、缓存设置等都设定为适应本地环
境的配置。将 archive mode 和 archive command 项注释掉。
建立 recovery.conf 文件,内容如下:
standby mode = ' on '
restore command = ' cp / mnt / s e r v e r / a r c h i v e d i r /% f %p '
同样,在实用环境中,往往会使用 rsync 作为从远程归档存储中同步数据的命令。
4. 1 POST RESQL STA DBY 4
需要注意的是,无论是 primary 向 standby 直接推送 WAL,还是 standby 主动去获取,必
须要 super user 帐号有远程访问权限,服务器默认使用的总是 postgres。为了安全起见,最好
为 postgres 用户颁发 RSA 密钥,使用 SSL 方式登录远程主机进行复制。
为了更有效的进行工作,可以预先准备好 standby 主机的 postgresql.conf、pg hba.conf、
recovery.conf 等文件,此时复制过去即可。
此时启动 standby 节点,会看到一系列关于 standby 启动的提示。该节点会依据 recov-
ery.conf 的设定 3 去获取 WAL 文件,直至 timeout 条件达成,即自动切换到正常工作模式。
1.3.4 正式启动主从模式
回到 primary 的管理界面,执行:
s e l e c t ∗ from pg stop backup ( ) ;
如果没有设定错误,此时可以看到主从节点的日志都提示同步过程开始。此时可以在
primary 节点上执行各种 DDL 和 DML ,数据变更会很快到达 standby 节点。
1.3.5 hot standby
如果将主从节点的 wal level 都设定为'hot standby'。则从节点处于可读状态。此时可以做
为负载均衡服务器提供读服务。
更进一步,如果直接归档 primary 节点数据区中的 backup in progress 文件,可以得到更高
的同步率。
1.3.6 基于归档文件的复制
可以看出此配置方式其实简单的利用了归档文件和增量恢复过程。通过利用 recovery.conf
和 archive 的配置,其实可以组合出多种不同的维护方案。
1.4 基于流式同步的集群实施
postgresql 9 允许用户流式的同步主从节点。而且设定更为简单4 。
1.4.1 预设 primary 环境
在 primary 上建立一个用于复制的超级用户,需要注意的是这个用户的用户名不能为
“replication”。这里我设定的用户名为 repl。
c r e a t e user r e p l superuser l o g i n password ' 1 q2w3e ' ;
在 primary 的 pg hba.conf 文件中,加入一行:
3 实际上从 primary 复制来的文件中已经携带了一些必要的,关于 primary 的信息。
4 应当注意的一点是,基于文件的同步可以提供更为丰富的功能,而且基于流的同步提供了最大可能的同步速度。两
者并非简单的更新换代。
5. 1 POST RESQL STA DBY 5
# TYPE DATABASE USER CIDR−ADDRESS METHOD
host r e p l i c a t i o n r e p l 1 9 2 . 1 6 8 . 1 . 1 0 0 / 3 2 md5
CIDR-ADDRESS 一栏设定为 standby 主机的地址。
wal level 设定为 hot standby。
archive mode 设定为 on。
max wal senders 是允许接入的 standby 流连接个数,想允许多少个 standby 进行流式同
步,就设为几,默认为 0,不允许接入。
1.4.2 建立 standby 节点
在 standby 主机上建立一个空的数据目录,可以以 postgres 身份 mkdir 后设定读写权限为
700。
将 primary 主机的 data 目录中的内容 scp 到这里——同样道理,rsync 或手工调用 gzip 都
会提高传输效率。
这样复制过来的目录中会有 primary 节点的 pid 文件。删除 postmaster.pid。
修改 postgresql.conf 和 pg hba.conf ,将网络访问权限、缓存设置等都设定为适应本地环境
的配置。将 archive mode 和 archive command 项注释掉。设定 wal level 为 hot standby。设
定 hot standby 为 on。
建立 recovery.conf 文件,内容如下:
standby mode = ' on '
p r i ma ry c on ni n f o =
' host = 1 0 . 2 0 . 1 3 4 . 5 1 port =5432 user = r e p l password=1q2w3e '
此时启动 standby 节点,会看到一系列关于 standby 启动的提示。该节点会依据 recov-
ery.conf 的设定联接 priamry 节点,直至 timeout 条件达成 5 。
1.4.3 正式启动主从模式
回到 primary 的管理界面,执行:
s e l e c t ∗ from pg stop backup ( ) ;
如果没有设定错误,此时可以看到主从节点的日志都提示同步过程开始。此时可以在
primary 节点上执行各种 DDL 和 DML ,数据变更会同步到达 standby 节点。6
5 其实我们总是可以在 recovery.conf 中指定 tigger file 文件名,这样,只要我们 touch 出一个触发文件,就可以让
standby 节点进入正常模式。
6 当然,远程的 standby 总是比 primary 慢那么一点,但是 WAL 层相当于同步向各节点发送数据,这个同步过程远
比基于文件的方式要快。