postgresql 9 standby

5
PostgreSQL 9 高性能集群实施手册 刘鑫 <[email protected]> August 24, 2010 1 PostgreSQL standby 对于大规模数据库应用,如何提供读写分离和热同步集群,是非常重要的内容。PostgreSQL 有多种不同的实施方案,这里我们讨论 standby 技术的特色和实现。 1.1 standby 简介 standby 技术基于 PostgreSQL 的预写入日志(wal)同步,建立服务器级的数据同步节点。 它的节点间直接传递写操作的二进制预写入事务,传输效率高、性能好,一致性强,自动同步 DDL 操作。 standby 组件是 PostgreSQL 的官方发行版内置功能。 standby 节点的核心机制并不复杂,即通过操作系统命令(或 pg standby 命令),将服务器 节点间的二进制日志同步到同一个状态。设定备份节点处于恢复状态。当主节点可访问时,不 断有新的预写入日志产生并同步到备份节点。备份节点就一直处于恢复状态。一旦这个同步过 程因某些原因终止 1 ,备份节点即认为恢复过程结束,自动切换到可访问的状态。 通常我们会使用 PostgreSQL 配置项 archive command 将 wal 存档于一个特定的路径, standby 使用 recovery 配置项 restore command 指定一个系统命令,自行获取需要恢复的 wal ,如果文件不存在,会等待直到 timout 。 archive 和 restore 的原本是为了通过 wal 实现增量备份和恢复。 因此我们需要注意这样几点: 过去的 standby 组件性能很好,但是也有其不足,其中一个很重要的问题是 standby 节点不 能读。这使它只能限于作为份节点存在。 1.2 PostgreSQL 9 的 standby 增进 PostgreSQL 9 对于 standby 功能进行了多方面的增进: 快速同步 允许“尽快的”将处理中的 WAL 发布出去。 流式同步 允许 standby 节点联接到 primary 节点上,以流式获取新的 WAL 数据,达到真正的 “hotstandby”。 1 在生产环境中,往往是因为主节点 down 机导致访问超时。 1

Upload: march-liu

Post on 21-Jan-2015

3.839 views

Category:

Technology


14 download

DESCRIPTION

还很粗糙,敬请指正

TRANSCRIPT

Page 1: PostgreSQL 9 Standby

PostgreSQL 9 高性能集群实施手册

刘鑫 <[email protected]>

August 24, 2010

1 PostgreSQL standby

对于大规模数据库应用,如何提供读写分离和热同步集群,是非常重要的内容。PostgreSQL

有多种不同的实施方案,这里我们讨论 standby 技术的特色和实现。

1.1 standby 简介

standby 技术基于 PostgreSQL 的预写入日志(wal)同步,建立服务器级的数据同步节点。

它的节点间直接传递写操作的二进制预写入事务,传输效率高、性能好,一致性强,自动同步

DDL 操作。

standby 组件是 PostgreSQL 的官方发行版内置功能。

standby 节点的核心机制并不复杂,即通过操作系统命令(或 pg standby 命令),将服务器

节点间的二进制日志同步到同一个状态。设定备份节点处于恢复状态。当主节点可访问时,不

断有新的预写入日志产生并同步到备份节点。备份节点就一直处于恢复状态。一旦这个同步过

程因某些原因终止1,备份节点即认为恢复过程结束,自动切换到可访问的状态。

通常我们会使用 PostgreSQL 配置项 archive command 将 wal 存档于一个特定的路径,

standby 使用 recovery 配置项 restore command 指定一个系统命令,自行获取需要恢复的wal

,如果文件不存在,会等待直到 timout 。

archive 和 restore 的原本是为了通过wal 实现增量备份和恢复。

因此我们需要注意这样几点:

过去的 standby 组件性能很好,但是也有其不足,其中一个很重要的问题是 standby 节点不

能读。这使它只能限于作为份节点存在。

1.2 PostgreSQL 9 的 standby 增进

PostgreSQL 9 对于 standby 功能进行了多方面的增进:

快速同步 允许“尽快的”将处理中的WAL 发布出去。

流式同步 允许 standby 节点联接到 primary 节点上,以流式获取新的 WAL 数据,达到真正的

“hot standby”。1在生产环境中,往往是因为主节点 down 机导致访问超时。

1

Page 2: PostgreSQL 9 Standby

1 POST RESQL STA DBY 2

Figure 1: PostgreSQL 9 之前的 standby

压缩传输 允许使用压缩方式传输 WAL,更为节省带宽。近期见到的几个高负载的数据库服务

器,普遍 CPU 资源比较充足,对于此类应用,这个功能相当实用。

replication 联接 虽然 PostgreSQL 9 要求用于流式同步的登录帐户必需是 superuser,但是在

pg hba 中,可以限定该用户只能在 primary 节点执行同步复制,提高了安全性。

性能提升 文档声称新的基于 WAL 文件的复制可以得到一个数量级以上的性能提升,这一点我

还没有确认。

standby 节点可读 当 standby 节点打开 hot standby 选项,可以实时进行只读的查询。这使得

standby 成为一个兼具增量备份/维护、实时同步备用节点和负载均衡能力的多功能组件。

1.3 基于文件的同步

基于文件的同步原理相当简单,可以依据以下的步骤执行:

1.3.1 修改 primary 的选项

编辑primary节点的postgres.conf文件,设定`archive mode`为'on'。设定archive command

为'cp -i %p /mnt/server/archivedir/%f </dev/null' 2。并且将wal level 设为 `archive` 。

服务器调用 archive command 时,会将 %p 替换为最新被归档的 WAL 文件路径全名, %f

替换为文件名。2这是最简单的写法,在并发环境下,文档建议预先使用 test 判断文件是否存在。如果需要将归档文件备份到远程存

储,通常 DBA 们会倾向使用更为高效的 rsync。

Page 3: PostgreSQL 9 Standby

1 POST RESQL STA DBY 3

Figure 2: PostgreSQL 9 的 standby

1.3.2 将 primary 节点设定为备份状态

将 primary 节点 restart ,以 superuser 登录到 postgres 库,执行:

se le c t pg star t 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/ server / a r ch i ved i r /\%f \%p '

同样,在实用环境中,往往会使用 rsync 作为从远程归档存储中同步数据的命令。

Page 4: PostgreSQL 9 Standby

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 的管理界面,执行:

se le 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。

create user rep l superuser log in password '1q2w3e ' ;

在 primary 的 pg hba.conf 文件中,加入一行:3实际上从 primary 复制来的文件中已经携带了一些必要的,关于 primary 的信息。4应当注意的一点是,基于文件的同步可以提供更为丰富的功能,而且基于流的同步提供了最大可能的同步速度。两

者并非简单的更新换代。

Page 5: PostgreSQL 9 Standby

1 POST RESQL STA DBY 5

# TYPE DATABASE USER CIDR−ADDRESS METHOD

host r ep l i c a t i on rep l 192.168.1.100/32 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 '

primary conninfo = \

' host =10.20.134.51 port=5432 user= rep l password=1q2w3e '

此时启动 standby 节点,会看到一系列关于 standby 启动的提示。该节点会依据 recov-

ery.conf 的设定联接 priamry 节点,直至 timeout 条件达成 5。

1.4.3 正式启动主从模式

回到 primary 的管理界面,执行:

se le c t ∗ from pg stop backup ( ) ;

如果没有设定错误,此时可以看到主从节点的日志都提示同步过程开始。此时可以在

primary 节点上执行各种 DDL 和 DML ,数据变更会同步到达 standby 节点。6

5其实我们总是可以在 recovery.conf 中指定 tigger file 文件名,这样,只要我们 touch 出一个触发文件,就可以让

standby 节点进入正常模式。6当然,远程的 standby 总是比 primary 慢那么一点,但是 WAL 层相当于同步向各节点发送数据,这个同步过程远

比基于文件的方式要快。