PostgreSQL实战之物理复制和逻辑复制(五)

目录

PostgreSQL实战之物理复制和逻辑复制(五)

5 流复制主备切换

5.1 判断主备角色的五种方法

5.2 主备切换之文件触发方式

5.3 主备切换之pg_ctl promote方式

5.4 pg_rewind


PostgreSQL实战之物理复制和逻辑复制(五)

5 流复制主备切换

        流复制的主库和备库角色不是静态存在的,在维护过程中可以对两者进行角色切换,例如当主库硬件故障或主库系统参数调整需要重启操作系统时,通常进行流复制主备切换,这一小节将介绍手工主备切换,主备切换的方式有两种,一种是通过创建触发器文件方式触发主备切换,另一种方式通过pg_ct| promot命令触发主备切换。
        目前PostgreSQL高可用方案大多基于流复制环境进行部署,流复制主备切换是PostgreSQL高可用方案的基础。

5.1 判断主备角色的五种方法


        进行流复制主备切换之前首先得知道当前数据库的角色,这里提供五种方法判断数据库角色,测试环境为一主一备,这些方法同样适用于一主多备环境,对于级联复制或逻辑复制的场景不完全适用,但基本思想是一致的。
        方式一:操作系统上查看WAL发送进程或WAL接收进程
之前介绍了流复制部署过程,大家知道流复制主库上有WAL发送进程,流复制备库上有WAL接收进程,根据这个思路,在数据库主机上执行以下命令,如果输出wa| sender ..streaming进程则说明当前数据库为主库:

[postgresepghost1 ~]$ ps -ef | grep "wa|" | grep -v "grep"
postgres 16666 166610 sep06 ? 00:00:09 postgres: wa| writer process
postgres 16672 166610 sep06 ? 00:00:13 postgres: wa| sender process repuser
192.168.28.75(57872)streaming 3/9C34BCB8
如果输出 wa| receiver .. streaming进程则说明当前数据库为备库,如下所示:
[postgres@pghost2 ~] $ ps -ef | grep "wa|" | grep -v "grep"
postgres 2729122567osep06 ?   00:00:32 postgres: wa| receiver process
    streaming 3/9C355788

           方式二:数据库上查看WAL发送进程或WAL接收进程
同样,也可以在数据库层面查看WAL发送进程和 WAL接收进程,例如在主库上查询pg_stat_rep|ication视图,如果返回记录说明是主库,备库上查询此视图无记录,如下所示:

postgres=# SELECT pid,usename,app|ication_name,c|ient_addr,state,sync_state
           FROM pg_stat_rep|ication ;
pid        |   usename  | app|ication_name |  client_addr |   state   | sync_state
-----------+------------+------------------+ -----+-------+------------------------
16672        |  repuser   |       node2      |192.168.28.75 | streaming | sync
(1 row)

同样,在备库上查看pg_stat_wal_receiver视图,如果返回记录说明是备库,流复制主库上此视图无记录,如下所示:

postgres=# SELECT pid,status,|ast_msg_send_time,|ast_msg_receipt_time,conninfo
           FROM pg_stat_wal_receiver ;
-[ RECORD1 ]------------+---------------------------------------------------
pid                        |    17551
status                    |     streaming
last_msg_send_time        |    2017-10-07 09:22:07.479282+08
last_msg_receipt_time   |     2017-10-07 09:22:07.480277+08
conninfo                |   user=repuser passfi|e=/home/postgres/.pgpass dbname=
    replication host=192.168.28.74 port=1921 application_name=slavel fallback_application_name=walreceiver sslmode=disab|e ss|compression=1 target_session_attrs=any

        方式三:通过系统函数查看
登录数据库执行以函数,如下所示:

postgres=# SELECT pg_is_in_recovery();
pg_is_in_recovery
-----------------
t
(1 row)

如果返回t说明是备库,返回f说明是主库。方式四:查看数据库控制信息
通过pg_controldata命令查看数据库控制信息,内容包含WAL日志信息、checkpoint,数据块等信息,通过Database cluster state信息可判断是主库还是备库,如下所示:

[postgresepghost1 ~]$ pg_controldata | grep clusterDatabase cluster state :
in production

以上查询结果返回in production表示为主库,返回in archive recovery表示是备库,如下所示:

[postgres@pghost2 ~] $ pg_controldata | grep clusterDatabase cluster state :
in archive recovery 

        方式四:查看数据库控制信息

通过pg_controldata命令查看数据库控制信息,内容包含WAL日志信息、checkpoint、数据块等信息,通过Database cluster state信息可判断是主库还是备库,如下所示:

[postgres@pghost1 ~] $ pg_controldata | grep cluster
Database cluster state:                in production

以上查询结果返回in production表示为主库,返回in archive recovery表示是备库,如下所示:

[postgres@pghost2 ~] $ pg_controldata | grep cluster
Database cluster state:                    in archive recovery

        方式五:通过recovery.conf 配置文件查看
根据之前小节流复制部署过程,在备库SPGDATA目录下会创建recovery.conf配置文件,如果存在这个文件说明是备库,如果SPGDATA目录不存在此文件或此文件后缀名是recovery.done 则说明是主库。

5.2 主备切换之文件触发方式

PostgreSQL9.0版本流复制主备切换只能通过创建触发文件方式进行,本章将介绍这种主备切换方式,测试环境为一主一备异步流复制环境,pghostl上的数据库为主库,pghost2上的数据库为备库,文件触发方式的手工主备切换主要步骤如下:
1)配置备库recovery.conf文件 trigger_file参数,设置激活备库的触发文件路径和名称。
2)关闭主库,建议使用-m fast模式关闭。
3)在备库上创建触发文件激活备库,如果recovery.conf变成recovery.done表示备库已经切换成主库。
4)这时需要将老的主库切换成备库,在老的主库的$PGDATA目录下创建recovery.conf文件(如果此目录下不存在recovery.conf文件,可以根据$PGHOME/recovery.conf.sample模板文件复制一个,如果此目录下存在recovery.done文件,需将recovery.done文件重命名为recovery.conf),配置和老的从库一样,只是primary_conninfo参数中的IP换成对端IP。
5)启动老的主库,这时观察主、备进程是否正常,如果正常表示主备切换成功。首先在备库上配置recovery.conf,如下所示:

recovery_target_timeline = 'latest'
standby_mode = on
primary_conninfo = 'host=192.168.28.74  port=1921  user=repuser'
trigger_file = '/database/pg10/pg_root/.postgresql.trigger.1921'

trigger_file可以配置成普通文件或隐藏文件,调整以上参数后需重启备库使配置参数生效。
之后关闭主库,如下所示:

[postgres@pghost1 ~]$ pg_ctl stop -m fastwaiting for server to shut down . . . . done
server stopped

在备库上创建触发文件激活备库,如下所示:

[postgres@pghost2 pg_root] $ ll recovery.conf
--rw-r--r-- 1 postgres postgres 5.8K Sep 8 20:47 recovery.conf
[postgres@pghost2 pg_root]$ touch /database/pg10/pg_root/.postgresql.trigger.1921

触发器文件名称和路径需和recovery.conf配置文件trigger_file保持一致,再次查看recovery文件时,发现后辍由原来的.conf变成了.done。

[postgres@pghost2 pg_root]$ ll recovery .done
-rw一r——r-- 1 postgres postgres 5.8K Sep 8 20:47 recovery.done

查看备库数据库日志,如下所示:

根据备库以上信息,由于关闭了主库,首先日志显示连接不上主库,接着显示发现了触发文件,之后显示恢复成功,数据库切换成读写模式。
这时根据pg_controldata输出进行验证,如下所示:

[postgres@pghost2 pg_root] $ pg_controldata | grep clusterDatabase cluster state :
in production

以上显示数据库角色已经是主库角色,在pghost2上创建一张名为test_alived的表并插入数据,如下所示:

postgres=# CREATE TABLE test_alived2(id int4) ;
CREATE TABLE
postgres=#INSERT INTO test_alived2 VALUES(1);
INSERT 0 1

之后,根据步骤4)的内容我们准备将老的主库切换成备库角色,在老的主库上配置recovery.conf,如下所示:

recovery_target_timeline = ' latest'
standby mode = on
primary_conninfo = 'host=192.168.28.75  port=1921 user=repuser'  
trigger_file ='/database/pg10/pg_root/.postgresql.trigger.1921'

以上配置和 pghost2上的recovery.done配置文件一致,只是primary_conninfo参数的host选项配置成对端主机IP。
之后在pghost1上的postgres主机用户家目录创建~/.pgpass文件,如下所示:

[postgres@pghost1 ~]$ touch ~/.pgpass
[postgres@pghost1 ~]$ chmod 600~/.pgpass

并在~l.pgpass文件中插入以下内容:

192.168.28.74:1921 :replication : repuser:re12a345
192.168.28.75:1921 :replication : repuser:rel2a345

之后启动pghost1 上的数据库,如下所示:

[postgres@pghost1 ~] $ pg_ctl start

启动后观察数据库日志,发现数据库启动正常,查看数据库表,发现test_alived2表也有了,如下所示:

postgres=# SELECT * from test_alived2 ;
id
-------
(1 row)

同时,pghost1上已经有了WAL接收进程,pghost2上有了WAL发送进程,说明老的主库已经成功切换成备库,以上是主备切换的所有步骤。

5.3 主备切换之pg_ctl promote方式

 上一节介绍了以文件触发方式进行主备切换,PostgreSQL9.1版本开始支持pg_ctlpromote触发方式,相比文件触发方式操作更方便,promote命令语法如下:

pg_ctl promote [-D datadir]

-D是指数据目录,如果不指定会使用环境变量$PGDATA设置的值。promote命令发出后,运行中的备库将停止恢复模式并切换成读写模式的主库。
pg_ctl promote主备切换步骤和文件触发方式大体相同,只是步骤1中不需要配置recovery.conf配置文件中的trigger_file参数,并且步骤3中换成以pg_ctl promote方式进行主备切换,如下:
1)关闭主库,建议使用-m fast模式关闭。
2)在备库上执行pg_ctl promote命令激活备库,如果recovery.conf变成recovery.done表示备库已切换成为主库。
3)这时需要将老的主库切换成备库,在老的主库的SPGDATA目录下创建recovery.conf文件(如果此目录下不存在recovery.conf文件,可以根据$PGHOME/recovery.conf.sample模板文件复制一个,如果此目录下存在recovery.done文件,需将recovery.done文件重命名为recovery.conf),配置和老的从库一样,只是 primary_conninfo参数中的IP换成对端IP。
4)启动老的主库,这时观察主、备进程是否正常,如果正常表示主备切换成功。
以上是pg_ctl promote主备切换的主要步骤,这一小节不进行演示了,下一小节介绍pg_rewind工具时会给出使用pg_ctl promote进行主备切换的示例。

5.4 pg_rewind

pg_rewind 是流复制维护时一个非常好的数据同步工具。
使用pg_rewind的前提条件为以下之一:
(1)postgresql.conf配置文件wal_log_hints参数设置成on。
(2)数据库安装时通过initdb初始化数据库时使用了--data-checksums选项,这个选项开启后会在数据块上进行检测以发现I/O错误,此选项只能在 initdb时设置,开启后性能有损失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

auspicious航

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值