pg物理复制

参考地址

参考博客

异步流复制

但在Master库事务提交后,Standby库等待流数据的时刻发生Master宕机,会导致丢失最后一个事务的数据
在这里插入图片描述

主库pg_hba.conf

/var/lib/pgsql/10/data/pg_hba.conf

host    replication     all             127.0.0.1/32            trust #trust代表无条件地允许联接而不需要口令
host    replication     all             ::1/128                 trust #代表ipv6地址放行
host    replication     all             0.0.0.0/0                 trust #放行任意用户和IP地址复制 多用于测试
host    replication     replicator      192.168.64.12/32        md5 #replicator 代表创建数据同步的用户为replicator
host    replication     replicator      192.168.64.13/32        md5 #要求客户端提供一个 MD5 加密的口令进行认证

主库postgresql.conf

新建归档目录 mkdir -p /data/arch_dir /data/arch_dir_master
vi /var/lib/pgsql/10/data/postgresql.conf

wal_level= logical
max_wal_senders = 10   # at least the number of standby
archive_mode = on  #归档模式打开
archive_command =  'test ! -f /data/arch_dir/%f && cp %p /data/arch_dir/%f'  #归档命令
synchronous_standby_names = ''   #standby application name, in recover.conf
hot_standby=on #对外提供查询服务
  • synchronous_standby_names=’’ 表示采用异步复制方式
  • synchronous_standby_names=‘pg1’
    表示会等到pg1同步后并且提交完成之后主才会提交,如果从无响应那么主会hung住.
  • synchronous_standby_names=‘pg1,pg2’ 主会从第一个pg1开始尝试不行的话再去试pg2

附: synchronous_standby_names配了参数即同步,特点为可靠性有保证,但会影响应用可用性网络慢,执行响应也慢

主库recovery.done与从库recovery.conf

主库 /var/lib/pgsql/10/data/recovery.done .done文件是主库上的指向从库,不被启用
从库 /var/lib/pgsql/10/data/recovery.conf .conf文件是从库上使用的,他会指向主库
vi /var/lib/pgsql/10/data/recovery.done

standby_mode=on #设置为从库模式
restore_command = 'cp /data/arch_dir_master/%f %p'  #恢复模式
primary_conninfo='application_name=pg2 host=192.168.231.191 port=5432 user=postgres password=postgres' #指向主的信息其中application_name=pg2代表本机的应用名称为pg2
archive_cleanup_command ='pg_archivecleanup /data/arch_dir_master %r'  #归档清理命令
recovery_target_timeline = 'latest'  #恢复最新的

重启主库

su - postgres 	#切换到用户postgres
/usr/pgsql-10/bin/pg_ctl -D /var/lib/pgsql/10/data/ -l logfile restart	#重启动数据库

备库创建

备库创建通过主库热备实现

主库上执行热备锁定

su - postgres
[postgres@hmcf-02 pgdata]$ psql
psql (10.6)
Type "help" for help.

postgres=# select pg_start_Backup('backuptag',true);
 pg_start_backup
-----------------
 0/2000060
(1 row)

postgres=#

备库上执行来源主库拷贝的数据

#192.168.232.190 为主库
[root@hmcf-03 data]# scp -r 192.168.232.190:/var/lib/pgsql/10/data   /var/lib/pgsql/10/data
#给data目录赋予postgres的用户权限
[root@hmcf-03 data]# chown -R postgres.postgres /var/lib/pgsql/10/data/

主库热备锁定停止-主库执行

postgres=# select pg_stop_backup();
NOTICE:  pg_stop_backup complete, all required WAL segments have been archived
 pg_stop_backup
----------------
 0/2000168
(1 row)

从库清理主库无用文件


[postgres@hmcf-03 data]$ rm -rf /var/lib/pgsql/10/data/pg_wal
[postgres@hmcf-03 data]$ rm -rf /var/lib/pgsql/10/data/postmaster.pid
[postgres@hmcf-03 data]$ mkdir -p /data/arch_dir /data/arch_dir_master

修改备库的recovery文件

cd /var/lib/pgsql/10/data
[postgres@hmcf-03 pgdata]$ mv recovery.done recovery.conf
内容如下
[postgres@hmcf-03 pgdata]$ cat recovery.conf
standby_mode=on
restore_command = 'cp /data/arch_dir_master/%f %p'
primary_conninfo='application_name=pg1 host=192.168.232.190 port=5432 user=postgres password=postgres'
archive_cleanup_command ='pg_archivecleanup /data/arch_dir_master %r'
recovery_target_timeline = 'latest'

准备恢复需要的wal和归档文件来源于主库

[root@hmcf-03 data]# scp -r 192.168.232.190:/var/lib/pgsql/10/data/pg_wal  /var/lib/pgsql/10/data/
000000010000000000000002.00000060.backup.done                                                                                                       100%    0     0.0KB/s   00:00
000000010000000000000002.done                                                                                                                       100%    0     0.0KB/s   00:00
000000010000000000000002                                                                                                                            100%   16MB  67.7MB/s   00:00
000000010000000000000002.00000060.backup                                                                                                            100%  293   454.4KB/s   00:00
000000010000000000000003                                                                                                                            100%   16MB  88.5MB/s   00:00
000000010000000000000004                                                                                                                            100%   16MB  11.0MB/s   00:01
#给拷贝过来的赋用户权限postgres
[root@hmcf-03 data]# chown -R postgres.postgres /var/lib/pgsql/10/data

[root@hmcf-03 data]# scp -r 192.168.232.190:/data/arch_dir /data/arch_dir_master
root@192.168.64.12's password:
Permission denied, please try again.
root@192.168.64.12's password:
000000010000000000000001                                                                                                                            100%   16MB   6.4MB/s   00:02
000000010000000000000002.00000060.backup                                                                                                            100%  293   229.1KB/s   00:00
000000010000000000000002
[root@hmcf-03 data]# chown -R postgres.postgres /data/arch_dir_master

启动备库,观察备库日志

/usr/pgsql-10/bin/pg_ctl -D /var/lib/pgsql/10/data/ -l logfile restart	# 重启动数据库
备库上执行写操作测试
[postgres@hmcf-03 ~]$ psql
psql (10.6)
Type "help" for help.

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |
 template0 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

postgres=# create table a(name text);
2019-11-23 18:15:46.078 CST [16175] ERROR:  cannot execute CREATE TABLE in a read-only transaction
2019-11-23 18:15:46.078 CST [16175] STATEMENT:  create table a(name text);
ERROR:  cannot execute CREATE TABLE in a read-only transaction
postgres=#
master上测试
[postgres@hmcf-02 ~]$ psql
psql (10.6)
Type "help" for help.
postgres=# create table a(name text);
CREATE TABLE
postgres=#
postgres=# select * from pg_stat_replication;
  pid  | usesysid |  usename   | application_name |  client_addr  | client_hostname | client_port |         backend_start         | backend_xmin |   state   | sent_lsn  | write_lsn |
 flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state
-------+----------+------------+------------------+---------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+
-----------+------------+-----------+-----------+------------+---------------+------------
 17226 |    16384 | replicator | pg1              | 192.168.64.13 |                 |       34786 | 2019-11-23 18:14:08.190221+08 |              | streaming | 0/301E9B8 | 0/301E9B8 |
 0/301E9B8 | 0/301E9B8  |           |           |            |             0 | async
(1 row)

postgres=#

同步复制

同步复制只需在异步复制的基础上,修改主库的/var/lib/pgsql/10/data/postgresql.conf里面的synchronous_standby_names 参数,对应参数值为standby备库上recovery.conf里面的primary_conninfo中的application_name。

然后重新reload加载配置即可

su - postgres 	#切换到用户postgres
/usr/pgsql-10/bin/pg_ctl -D /var/lib/pgsql/10/data/ -l logfile restart	#重启动数据库

查看验证

[postgres@hmcf-02 pgdata]$ psql
psql (10.6)
Type "help" for help.

postgres=# select * from pg_stat_replication;
  pid  | usesysid |  usename   | application_name |  client_addr  | client_hostname | client_port |         backend_start         | backend_xmin |   state   | sent_lsn  | write_lsn |
 flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state
-------+----------+------------+------------------+---------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+
-----------+------------+-----------+-----------+------------+---------------+------------
 17226 |    16384 | replicator | pg1              | 192.168.64.13 |                 |       34786 | 2019-11-23 18:14:08.190221+08 |              | streaming | 0/301E9B8 | 0/301E9B8 |
 0/301E9B8 | 0/301E9B8  |           |           |            |             1 | sync
(1 row)

postgres=#

可以看到此时standby的同步状态变成了sync了,由异步流变成了同步流复制.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值