这节将介绍下 PostgreSQL HOT-Standby 的主备切换,虽然 PostgreSQL 的主备 切换不太方便,没能像 Oracle DataGuard 一样提供切换命令,但是仍然有方法实现 这点在官网手册中有指出,但没给出详细的指导步骤。今天在测试过程中遇到不少问题,后经德哥指点,终于完成本实验,下面是详细过程。
环境信息
PostgreSQL 版本: PostgreSQL 9.1beta3
OS : Red Hat Enterprise Linux Server release 5.5
硬件环境 : 笔记本上的两台虚拟机
主库 IP : 192.168.1.25
主库 PORT : 1921
备库 IP : 192.168.1.26
备库 PORT : 1921
备注:这节不详细介绍 HOT-Standby 的搭建,关于搭建的内容可以参考之前的BLOG, PostgreSQL: Setting up streaming log replication (Hot Standby )
如何判断主库和备库
有时在论坛上会有人问,如何区分主库和备库,这里提供两种方法。
方法一: 根据主机进程判断
1 |
[postgres@pg1 pg_root]$ ps -ef | grep "wal" |
备注:这里显示了wal 日志发送进程”wal sender process”,说明是主库。
1 |
[postgres@pgb pg_xlog]$ ps -ef | grep wal |
备注:这里显示了 wal 日志接收进程 “wal receiver process” ,说明是备库;
方法二: 根据 pg_controldata 输出
1 |
pg_controldata 输出数据库服务的当前状态,可以根据 "Database cluster state: " 的信息来判断, |
如果值为 “in production” 说明是主库,如果值为 “in archive recovery” 说明是备库。
主库的 pg_controldata 输出
1 |
[postgres@pg1 pg_root]$ pg_controldata |
Recovery.conf 文件
recovery.conf 是一个配置文件,用于主库,备库切换时的参数配置,可以从 $PGHOME/share 目录下复制一份 recovery.conf.sample 到备库 $PGDATA 目录,里面有众多参数,这里只介绍用于切换时的关键参数。
1 |
standby_mode = '' --标记PG为STANDBY SERVER |
主备切换
4.1 创建备库recovery.conf 文件( On Slave )
1 |
cp $PGHOME/share/recovery.conf.sample $PGDATA/recovery.conf |
配置以下参数
1 |
standby_mode = 'on' --标记PG为STANDBY SERVER |
4.2 关闭主库(on Primary)
1 |
[postgres@pg1 pg_root]$ pg_ctl stop -m fast -D $PGDATA |
4.3 激活备库到主库状态 ( on slave )
激活备库只要创建一个文件即可,根据备库 recovery.conf 配置文件的参数 trigger_file 值,创建这个 trigger 文件即可。 例如 “touch /opt/pgdata/pg_root/postgresql.trigger.1921 “
1 |
[postgres/opt/pgdata/pg_root/postgresql.trigger.1921 pg_root]$ touch |
过一会儿发现 recovery.conf 文件变成 recovery.done ,说明备库已经激活。
1 |
[postgres@pgb pg_root]$ ll |
查看从库CSV日志(正在激活成主库)
1 |
2011-08-24 21:20:55.130 CST,,,29388,,4e54f1c5.72cc,11,,2011-08-24 20:42:45 CST,1/0,0,LOG,00000,"selected new timeline ID: 6",,,,,,,,,"" |
说明从库已经为OPEN状态,可以进行读写操作。
4.4 激活原来的主库,让其转变成从库 (在原来的主库上执行)
创建 $PGDATA/recovery.conf 文件,配置以下参数
1 |
recovery_target_timeline = 'latest' |
创建密码文件 /home/postgres/.pgpass 密码文件,输入以下内容
1 |
192.168.1.26:1921:replication:repuser:rep123us345er |
修改 pg_hba.conf (现在的主库上增加),添加以下配置
1 |
host replication repuser 192.168.1.25/32 md5 |
将原来的主库(现在的从库)启动
1 |
[postgres@pg1 pg_root]$ pg_ctl start -D $PGDATA |
查看从库日志, 发现大量 FATAL 错误信息
1 |
2011-08-24 21:31:59.178 CST,,,17889,,4e54fd4f.45e1,1,,2011-08-24 21:31:59 CST,,0,FATAL,XX000,"timeline 6 of the primary does not match recovery target timeline 5",,,,,,,,,"" |
备注:出现了大量 FATAL,XX000,”timeline 6 of the primary does not match recovery target timeline 5” 估计是时间线有问题,网上查了下资料也没啥结果,后来咨询了下德哥,只要将从库 $PGDATA/pg_xlog 一个文件考过来就行。
将主库文件 00000006.history 复制到从库
1 |
[postgres@pgb pg_xlog]$ scp 00000006.history [postgres@192.168.1.25:/opt/pgdata/pg_root/pg_xlog](mailto:postgres@192.168.1.25:/opt/pgdata/pg_root/pg_xlog) |
再次查看从库日志
1 |
2011-08-24 21:36:04.819 CST,,,17948,,4e54fe44.461c,1,,2011-08-24 21:36:04 CST,,0,FATAL,XX000,"timeline 6 of the primary does not match recovery target timeline 5",,,,,,,,,"" |
备注:根据日志信息,说明从库已经恢复正常;
验证
主库上创建一张表
1 |
create table test_11 (id integer,name varchar(32)); |
从库上查询
[postgres@pgb pg_root]$ psql
psql (9.1beta3)
Type "help" for help.
skytf=> /d
List of relations
Schema | Name | Type | Owner
--------+--------------------+-------+----------
public | pg_stat_statements | view | postgres
skytf | pgbench_accounts | table | skytf
skytf | pgbench_branches | table | skytf
skytf | pgbench_history | table | skytf
skytf | pgbench_tellers | table | skytf
skytf | test_11 | table | skytf
skytf | test_stadnby | table | skytf
备注:可见表 test_11 迅速从主库上同步过来了,到此为止,库切换完成。
总结
- Hot-Standby 切换步骤比较多,有些配置可以提前做好的,例如 .pgpass, pg_hba.conf 等;
- 主,备切换时,务必先将主库关闭,否则一旦从库被激活时,而主库尚未关闭,会有问题;
- 主,备切换可作为生产库迁移的一种方式,因为这最大限度减少了业务停机时间。
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/database/236422.html