PostgreSQL 9 Standby
Upcoming SlideShare
Loading in...5
×
 

PostgreSQL 9 Standby

on

  • 4,328 views

还很粗糙,敬请指正

还很粗糙,敬请指正

Statistics

Views

Total Views
4,328
Views on SlideShare
4,291
Embed Views
37

Actions

Likes
3
Downloads
109
Comments
0

5 Embeds 37

http://blogold.chinaunix.net 19
http://blog.chinaunix.net 11
http://www.phpfans.net 4
http://www.cublog.cn 2
http://www.51099.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

PostgreSQL 9 Standby PostgreSQL 9 Standby Document Transcript

  • PostgreSQL 9 高性能集群实施手册 刘鑫 <liuxin2@kingsoft.com> 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
  • 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。
  • 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 作为从远程归档存储中同步数据的命令。 View slide
  • 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 应当注意的一点是,基于文件的同步可以提供更为丰富的功能,而且基于流的同步提供了最大可能的同步速度。两 者并非简单的更新换代。 View slide
  • 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 层相当于同步向各节点发送数据,这个同步过程远 比基于文件的方式要快。