PostgreSQL HOT-Standby 的主备切换

本文详细介绍PostgreSQL的Hot-Standby主备切换过程,包括环境配置、主备标识判断方法、关键配置文件recovery.conf的使用、主备切换步骤及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://stoneking.blog.51cto.com/65035/782132

PostgreSQL HOT-Standby 的主备切换 2012-02-17 15:21:06

--1 环境信息
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

--2 如何区别主库和备库
有时在论坛上会有人问,如何区分主库和备库,这里提供两种方法。

--2.1 方法一,根据主机进程判断
[postgres@pg1 pg_root]$ ps -ef | grep "wal"
postgres 17715 17684 0 20:41 ? 00:00:00 postgres: wal writer process
postgres 17746 17684 0 20:43 ? 00:00:00 postgres: wal sender process repuser 192.168.1.26(43246) streaming 0/700178A8
postgres 17819 17590 0 21:00 pts/2 00:00:00 grep wal

备注:这里显示了wal 日志发送进程"wal sender process",说明是主库。

[postgres@pgb pg_xlog]$ ps -ef | grep wal
postgres 29436 29386 0 20:43 ? 00:00:00 postgres: wal receiver process streaming 0/700178A8
postgres 29460 29289 0 21:00 pts/3 00:00:00 grep wal

备注:这里显示了 wal 日志接收进程 "wal receiver process" ,说明是备库;

--2.2 方法二,根据 pg_controldata 输出
pg_controldata 输出数据库服务的当前状态,可以根据 "Database cluster state: " 的信息来判断,
如果值为 "in production" 说明是主库,如果值为 "in archive recovery" 说明是备库。

主库的 pg_controldata 输出
[postgres@pg1 pg_root]$ pg_controldata
pg_control version number: 903
Catalog version number: 201105231
Database system identifier: 5640897481082175487
Database cluster state: in production
...

备库的 pg_controldata 输出
[postgres@pgb pg_xlog]$ pg_controldata
pg_control version number: 903
Catalog version number: 201105231
Database system identifier: 5640897481082175487
Database cluster state: in archive recovery
...


--3 recovery.conf 文件介绍
recovery.conf 是一个配置文件,用于主库,备库切换时的参数配置,可以从 $PGHOME/share 目录下
复制一份 recovery.conf.sample 到备库 $PGDATA 目录,里面有众多参数,这里只介绍用于切换时的
关键参数

standby_mode = '' --标记PG为STANDBY SERVER
primary_conninfo = '' --标识主库信息
trigger_file = '' --标识触发器文件

 

主备切换
--4.1 创建备库recovery.conf 文件( On Slave )
cp $PGHOME/share/recovery.conf.sample $PGDATA/recovery.conf

配置以下参数
standby_mode = 'on' --标记PG为STANDBY SERVER
primary_conninfo = 'host=192.168.1.25 port=1921 user=repuser ' --标识主库信息
trigger_file = '/opt/pgdata/pg_root/postgresql.trigger.1921' --标识触发器文件


--4.2 关闭主库(on Primary)
[postgres@pg1 pg_root]$ pg_ctl stop -m fast -D $PGDATA
waiting for server to shut down....... done
server stopped


--4.3 激活备库到主库状态 ( on slave )
激活备库只要创建一个文件即可,根据备库 recovery.conf 配置文件的参数 trigger_file 值,
创建这个 trigger 文件即可。 例如 "touch /opt/pgdata/pg_root/postgresql.trigger.1921 "

[postgres@pgb pg_root]$ touch /opt/pgdata/pg_root/postgresql.trigger.1921

过一会儿发现 recovery.conf 文件变成 recovery.done ,说明备库已经激活。

[postgres@pgb pg_root]$ ll
total 176K
-rw------- 1 postgres postgres 168 Aug 24 10:24 backup_label.old
drwx------ 5 postgres postgres 4.0K Aug 15 10:03 base
drwx------ 2 postgres postgres 4.0K Aug 24 20:50 global
drwx------ 2 postgres postgres 4.0K Aug 15 10:03 pg_clog
-rw------- 1 postgres postgres 4.5K Aug 24 10:39 pg_hba.conf
-rw------- 1 postgres postgres 1.6K Aug 15 10:03 pg_ident.conf
drwx------ 4 postgres postgres 4.0K Aug 15 10:03 pg_multixact
drwx------ 2 postgres postgres 4.0K Aug 24 20:42 pg_notify
drwx------ 2 postgres postgres 4.0K Aug 15 10:03 pg_serial
drwx------ 2 postgres postgres 4.0K Aug 15 10:03 pg_stat_tmp
drwx------ 2 postgres postgres 4.0K Aug 15 10:03 pg_subtrans
drwx------ 2 postgres postgres 4.0K Aug 21 20:21 pg_tblspc
drwx------ 2 postgres postgres 4.0K Aug 15 10:03 pg_twophase
-rw------- 1 postgres postgres 4 Aug 15 10:03 PG_VERSION
drwx------ 3 postgres postgres 4.0K Aug 24 21:20 pg_xlog
-rw------- 1 postgres postgres 19K Aug 24 10:24 postgresql.conf
-rw------- 1 postgres postgres 51 Aug 24 20:42 postmaster.opts
-rw------- 1 postgres postgres 69 Aug 24 20:42 postmaster.pid
-rw-r--r-- 1 postgres postgres 4.7K Aug 24 20:42 recovery.conf


--查看从库CSV日志(正在激活成主库)
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",,,,,,,,,""
2011-08-24 21:20:58.119 CST,,,29388,,4e54f1c5.72cc,12,,2011-08-24 20:42:45 CST,1/0,0,LOG,00000,"archive recovery complete",,,,,,,,,""
2011-08-24 21:20:58.495 CST,,,29386,,4e54f1c3.72ca,5,,2011-08-24 20:42:43 CST,,0,LOG,00000,"database system is ready to accept connections",,,,,,,,,""

说明从库已经为OPEN状态,可以进行读写操作。
 

--4.4 激活原来的主库,让其转变成从库 (在原来的主库上执行)
--创建 $PGDATA/recovery.conf 文件,配置以下参数
recovery_target_timeline = 'latest'
standby_mode = 'on' --标记PG为STANDBY SERVER
primary_conninfo = 'host=192.168.1.26 port=1921 user=repuser ' --标识主库信息
trigger_file = '/opt/pgdata/pg_root/postgresql.trigger.1921' --标识触发器文件

--创建密码文件 /home/postgres/.pgpass 密码文件,输入以下内容
192.168.1.26:1921:replication:repuser:rep123us345er

--修改 pg_hba.conf (现在的主库上增加),添加以下配置
host replication repuser 192.168.1.25/32 md5

--将原来的主库(现在的从库)启动
[postgres@pg1 pg_root]$ pg_ctl start -D $PGDATA
server starting

--查看从库日志, 发现大量 FATAL 错误信息
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",,,,,,,,,""
2011-08-24 21:32:04.208 CST,,,17891,,4e54fd54.45e3,1,,2011-08-24 21:32:04 CST,,0,FATAL,XX000,"timeline 6 of the primary does not match recovery target timeline 5",,,,,,,,,""
2011-08-24 21:32:09.135 CST,,,17892,,4e54fd59.45e4,1,,2011-08-24 21:32:09 CST,,0,FATAL,XX000,"timeline 6 of the primary does not match recovery target timeline 5",,,,,,,,,""
2011-08-24 21:32:14.136 CST,,,17895,,4e54fd5e.45e7,1,,2011-08-24 21:32:14 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 复制到从库
[postgres@pgb pg_xlog]$ scp 00000006.history postgres@192.168.1.25:/opt/pgdata/pg_root/pg_xlog
postgres@192.168.1.25's password:
00000006.history

--再次查看从库日志
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",,,,,,,,,""
2011-08-24 21:36:09.742 CST,,,17885,,4e54fd44.45dd,5,,2011-08-24 21:31:48 CST,1/0,0,LOG,00000,"new target timeline is 6",,,,,,,,,""
2011-08-24 21:36:09.824 CST,,,17977,,4e54fe49.4639,1,,2011-08-24 21:36:09 CST,,0,LOG,00000,"streaming replication successfully connected to primary",,,,,,,,,""

备注:根据日志信息,说明从库已经恢复正常;
 

--4.5 测试
主库上创建一张表
postgres=# \c skytf skytf
You are now connected to database "skytf" as user "skytf".
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_stadnby | table | skytf
(16 rows)

skytf=> create table test_11 (id integer,name varchar(32));
CREATE TABLE

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
(17 rows)

从库上查询
[postgres@pgb pg_root]$ psql
psql (9.1beta3)
Type "help" for help.

postgres=# \c skytf skytf
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 迅速从主库上同步过来了,到此为止,库切换完成。


--5 总结:
1 Hot-Standby 切换步骤比较多,有些配置可以提前做好的,例如 .pgpass, pg_hba.conf 等;
2 主,备切换时,务必先将主库关闭,否则一旦从库被激活时,而主库尚未关闭,会有问题;
3 主,备切换可作为生产库迁移的一种方式,因为这最大限度减少了业务停机时间。


<think>好的,我现在需要帮助用户配置PostgreSQL 15与repmgr。用户之前的问题是关于节点配置多个同步节点,现在转向了repmgr的配置,这说明他们可能正在寻求高可用性解决方案。我需要确保覆盖repmgr的基本概念、安装步骤、配置流程以及常见管理操作。 首先,用户可能不太清楚repmgr的具体作用,所以需要先解释repmgr是什么,它的功能和优势。然后,分步骤指导安装和配置,包括节点和节点的设置。考虑到用户之前配置过同步节点,可能需要将repmgr与之前的设置结合起来,确保两者兼容。 需要详细说明配置文件(如postgresql.conf和repmgr.conf)的修改,尤其是那些关键的参数,比如shared_preload_libraries、max_wal_senders等。此外,用户可能对如何注册节点和启动集群管理不太熟悉,需要提供具体的命令示例。 另外,用户可能在实际操作中遇到问题,比如服务启动失败或节点注册错误,因此故障排查部分也很重要。需要列出常见问题及解决方法,比如检查日志文件、确认端口开放、确保SSH免密登录等。 还需要注意版本兼容性,特别是PostgreSQL 15和repmgr版本的匹配,避免因版本不兼容导致的问题。最后,提醒用户定期份和监控集群状态,确保高可用性的持续性。 总结来说,回答需要结构清晰,逐步引导用户完成配置,同时预见到他们可能遇到的问题并提供解决方案。保持语言简洁,技术细节准确,确保用户能够顺利实施。</think>--- ### PostgreSQL 15 + repmgr 高可用集群配置指南 repmgr 是 PostgreSQL 的流复制管理工具,可自动化切换和故障转移。以下是关键配置步骤: --- #### 一、基础环境准 1. **节点规划**(示例) - **节点**: 192.168.1.10 (node1) - **节点1**: 192.168.1.11 (node2) - **节点2**: 192.168.1.12 (node3) 2. **前置条件** - 所有节点安装相同版本的 PostgreSQL 15 和 repmgr - 节点间 SSH 免密登录 - 防火墙开放 5432(PostgreSQL)和 22(SSH)端口 --- #### 二、节点配置 1. **修改 `postgresql.conf`** ```conf listen_addresses = '*' # 允许所有IP连接 wal_level = replica # WAL日志级别 max_wal_senders = 10 # 最大WAL发送进程 hot_standby = on # 启用热 shared_preload_libraries = 'repmgr' # 加载repmgr扩展 ``` 2. **创建 repmgr 专用用户** ```sql CREATE USER repmgr SUPERUSER LOGIN; CREATE DATABASE repmgr OWNER repmgr; ``` 3. **配置 `pg_hba.conf`** ```conf host repmgr repmgr 192.168.1.0/24 trust host replication repmgr 192.168.1.0/24 trust ``` --- #### 三、repmgr 配置文件 1. **节点 `repmgr.conf`** ```conf node_id=1 node_name=node1 conninfo='host=192.168.1.10 user=repmgr dbname=repmgr' data_directory='/var/lib/pgsql/15/data' failover=automatic promote_command='repmgr standby promote -f /etc/repmgr.conf' follow_command='repmgr standby follow -f /etc/repmgr.conf' ``` --- #### 四、节点配置 1. **初始化库** ```bash repmgr -h 192.168.1.10 -U repmgr -d repmgr standby clone ``` 2. **启动库服务** ```bash systemctl start postgresql-15 ``` 3. **注册节点** ```bash repmgr standby register -F ``` --- #### 五、集群管理命令 | 命令 | 功能描述 | |-------------------------------|------------------------------| | `repmgr cluster show` | 查看集群状态 | | `repmgr node status` | 检查当前节点状态 | | `repmgr standby switchover` | 手动触发切换 | | `repmgr node rejoin` | 故障节点重新加入集群 | --- #### 六、故障排查要点 1. **日志检查** - PostgreSQL 日志: `/var/lib/pgsql/15/data/log/postgresql-*.log` - repmgr 日志: `/var/log/repmgr/repmgr.log` 2. **常见错误处理** - **节点无法注册**: 检查 `pg_hba.conf` 权限配置 - **WAL 同步失败**: 验证 `max_wal_senders` 参数值 - **SSH 连接超时**: 确认防火墙规则和免密登录配置 --- #### 七、注意事项 1. **版本匹配** 需使用支持 PostgreSQL 15 的 repmgr 版本(建议 repmgr 5.3+) 2. **监控建议** 集成 `repmgr-check` 到监控系统,实时检测: ```bash repmgr daemon -d -f /etc/repmgr.conf --monitoring-history ``` 3. **份策略** 建议配合 `pgbackrest` 或 `barman` 实现物理--- 通过以上配置,即可构建基于 repmgr 的 PostgreSQL 高可用集群。实际部署时需根据业务负载调整 `max_connections` 和 `shared_buffers` 等参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值