Postgres-Copy

PG主备库搭建与切换

主备库环境说明

主机名 IP 角色 端口
master 192.168.30.11 master 5432
slave1 192.168.30.12 slave1 5432

配置hosts

vim /etc/hostss

在主备服务器安装postgres数据库软件

由于前面写过类似的,这边就不在重复编写了。

初始化master数据库(若有库可省略)

initdb  -D /postgres/data
pg_ctl -D /postgres/data start

主库创建用户

创建用户用于复制WAL日志

CREATE USER repuser replication LOGIN CONNECTION LIMIT 3 ENCRYPTED PASSWORD '123456';

主备库库都需要创建.pgpass文件

vim /home/postgres/.pgpass

配置pg_hba.conf

在主库的pg_hba.conf最后一行增加如下:

host    replication     repuser         slave1                  md5

配置postgresql.conf

在主库上配置如下:

listen_addresses = '*'                     
port = 5432
max_connections = 100
superuser_reserved_connections = 10
full_page_writes = on
wal_log_hints = off
max_wal_senders = 50
hot_standby = on
log_destination = 'csvlog'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S'
log_statement = 'mod'
log_timezone = 'Asia/Shanghai'
timezone = 'Asia/Shanghai'
dynamic_shared_memory_type = posix
full_page_writes = on
wal_level = replica
archive_mode = on
archive_command = ''cp %p /postgres/arch/archived_log%f'
archive_timeout = 60s
#若要数据同步方式为同步,更改synchronous_standby_names参数,其后跟备库的application_name
synchronous_standby_names = 'slave1'   

其他可配置参数:

以下四个参数值,在备库上参数值不应小于主库上的值,否则会导致无法启动。

max_connections
max_prepared_transactions
max_locks_per_transaction
max_worker_processes

注:如果修改参数值大小:
将参数值改大,先修改所有备库,再修改主库
将参数值改小,先修改主库,再修改备库

创建上述配置所需归档路径(主库与备库都要创建)

mkidr /postgres/arch

重启数据库

pg_ctl -D /postgres/data restart

pg_basebackup 创建备库(主库要启动,并且打开防火墙)

在slave1端的postgres用户下执行

pg_basebackup -h 192.168.30.11 -p 5432 -U repuser -w -Fp -Xs -Pv -R -D /postgres/data

修改slave中data目录下的pg_hba.conf

修改备库postgresql.conf配置文件

vim /postgres/data/postgresql.conf

编辑内容如下

listen_addresses = '* '
wal_level = hot_standby
max_connections = 200    # 一般比主库大一些.
hot_standby = on
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on             # 如果有错误的数据复制,是否向 主进行范例.

修改备库postgresql.auto.conf配置文件(添加application_name参数)

vim /postgres/data/postgresql.auto.conf

编辑内容如下

primary_conninfo = 'application_name=slave1 user=repuser passfile=''/home/postgres/.pgpass'' host=192.168.30.11 port=5432 sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any'

验证查看进程、状态

主库

查看主库的WAL日志发送进程是否正常

ps -ef|grep walsender

备库

查看主库的WAL日志发送进程是否正常

ps -ef |grep walreceiver

主库查看复制状态

流同步复制

\x on;
select * from pg_stat_replication;

参数:
username:复制用户
client_addr:从库IP
sync_state:同步还是异步,这边是同步

测试数据

主库创建测试数据

psql
create table t1 (id int);
insert into t1 values(100);

备库查看测试数据

pqsl
select * from t1;

主从切换

1、主备库进程查看

主库

pg_controldata -D /postgres/data

备库

pg_controldata -D /postgres/data

2、停掉主库

pg_ctl -D /postgres/data stop

查看主库状态是否处于stop状态

pg_controldata -D /postgres/data |grep 'Database cluster state'

3、提升从库为主库

这个时候从库保持运行状态,不需要停掉

pg_ctl promote -D /postgres/data

pg12开始新增了一个pg_promote()函数,让我们可以通过SQL命令激活备库。

pg_promote()语法:

pg_promote(wait boolean DEFAULT true, wait_seconds integer DEFAULT 60)

两个参数:

wait: 表示是否等待备库的 promotion 完成或者 wait_seconds 秒之后返回成功,默认值为 true。
wait_seconds: 等待时间,单位秒,默认 60

查看状态

pg_controldata -D /postgres/data |grep 'Database cluster state'

4、尝试在原来的从库写入数据

insert into t1 values(100);

写入新增数据,从库(即原来的主库)启动后,模拟差异数据是否同步到从库

5、将原来的主库部署为从库

附:区分主库还是备库的方法

方法1:pg_controldata

主库

pg_controldata -D /postgres/data

备库

pg_controldata -D /postgres/data

从上述 Data cluster state参数可以清楚的将主库给分辨出来。

方法2:字典表pg_stat_replication

只有主库才能查到数据

select * from pg_stat_replication;

方法3.根据PG进程

进程中显示wal sender的是主库,显示wal receiver的是备库,如下:

主库

查看主库的WAL日志发送进程是否正常

ps -ef|grep walsender

备库

查看主库的WAL日志发送进程是否正常

ps -ef |grep walreceiver

方法4.通过pg_is_in_recovery函数

备库是t,主库是f。

select pg_is_in_recovery();

主库

备库

Contents
  1. 1. PG主备库搭建与切换
    1. 1.1. 主备库环境说明
    2. 1.2. 配置hosts
    3. 1.3. 在主备服务器安装postgres数据库软件
    4. 1.4. 初始化master数据库(若有库可省略)
    5. 1.5. 主库创建用户
    6. 1.6. 主备库库都需要创建.pgpass文件
    7. 1.7. 配置pg_hba.conf
    8. 1.8. 配置postgresql.conf
    9. 1.9. 其他可配置参数:
    10. 1.10. 创建上述配置所需归档路径(主库与备库都要创建)
    11. 1.11. 重启数据库
    12. 1.12. pg_basebackup 创建备库(主库要启动,并且打开防火墙)
    13. 1.13. 修改slave中data目录下的pg_hba.conf
    14. 1.14. 修改备库postgresql.conf配置文件
    15. 1.15. 修改备库postgresql.auto.conf配置文件(添加application_name参数)
    16. 1.16. 验证查看进程、状态
      1. 1.16.1. 主库
      2. 1.16.2. 备库
    17. 1.17. 主库查看复制状态
    18. 1.18. 测试数据
      1. 1.18.1. 主库创建测试数据
      2. 1.18.2. 备库查看测试数据
    19. 1.19. 主从切换
      1. 1.19.1. 1、主备库进程查看
      2. 1.19.2. 主库
      3. 1.19.3. 备库
      4. 1.19.4. 2、停掉主库
      5. 1.19.5. 3、提升从库为主库
        1. 1.19.5.1. pg12开始新增了一个pg_promote()函数,让我们可以通过SQL命令激活备库。
        2. 1.19.5.2. 查看状态
      6. 1.19.6. 4、尝试在原来的从库写入数据
      7. 1.19.7. 5、将原来的主库部署为从库
  2. 2. 附:区分主库还是备库的方法
    1. 2.1. 方法1:pg_controldata
      1. 2.1.1. 主库
      2. 2.1.2. 备库
    2. 2.2. 方法2:字典表pg_stat_replication
    3. 2.3. 方法3.根据PG进程
      1. 2.3.1. 主库
      2. 2.3.2. 备库
    4. 2.4. 方法4.通过pg_is_in_recovery函数
      1. 2.4.1. 主库
      2. 2.4.2. 备库
|