PostgreSQL12-主从复制

2020-06-22  本文已影响0人  hollson

注意:PostgreSQL 12对主从复制实现和配置做了重大改进,如废弃了recovery.conf,并将参数转换为普通的PostgreSQL配置参数,使得配置群集和复制更加简单。

PostgreSQL数据库支持多种复制解决方案,以构建高可用性,可伸缩,容错的应用程序,其中之一是预写日志(WAL)传送。该解决方案允许使用基于文件的日志传送或流复制,或者在可能的情况下,将两种方法结合使用来实现备用服务器。

使用流复制时,备用(复制从属)数据库服务器被配置为连接到主服务器/主服务器,主服务器/主服务器在生成WAL记录时将其流传输到备用服务器,而无需等待WAL文件被填充。

默认情况下,流复制是异步的,其中在将事务提交到主服务器后将数据写入备用服务器。这意味着在主服务器中提交事务与更改在备用服务器中变得可见之间存在很小的延迟。这种方法的一个缺点是,如果主服务器崩溃,则可能无法复制任何未提交的事务,这可能导致数据丢失。

示例环境:

Postgresql master  database server:     10.20.20.1
Postgresql standby database server:     10.20.20.2

一. 配置主服务器

1. 修改监听端口

su - postgres
psql -c "ALTER SYSTEM SET listen_addresses TO '*';"/
ls -l /var/lib/pgsql/12/data/  # 会生成一个postgresql.auto.conf文件

ALTER SYSTEM SET会将配置保存在一个postgresql.conf.auto中,与postgresql.conf并存,系统会优先使用.auto配置。

2. 创建复制角色

# su – postgres
createuser --replication -P -e replicator # -P:设置密码,-e:回显
exit

3. 角色授权
vim /var/lib/pgsql/12/data/pg_hba.conf

host    replication     replicator      10.20.20.2/24     md5

4. 重启服务

systemctl restart postgresql-12.service

5. 设置防火墙(非必选)

firewall-cmd --add-service=postgresql --permanent
firewall-cmd --reload

二. 配置从服务器

1. 将主机基础数据备份到从机

# 先停掉服务,备份下本地数据,并清除本地数据
systemctl stop postgresql-12.service
su - postgres
tar -zcvf /var/lib/pgsql/12/data.tar.gz /var/lib/pgsql/12/data #备份一下
rm -rf /var/lib/pgsql/12/data/*
# 使用pg_basebackup工具备份
pg_basebackup -h 10.20.20.1 -D /var/lib/pgsql/12/data -U replicator -P -v  -R -X stream -C -S pgstandby1
exit

备份过程完成后,会在data目录下创建了一个standby.signal,并将primary_conninfo写入postgresql.auto.conf

ls -l /var/lib/pgsql/12/data/
cat /var/lib/pgsql/12/data/postgresql.auto.conf

如果postgresql.conf中的hot_standby参数设置为on(默认值),并且数据目录中存在Standby.signal文件,则replication slave将在“热备”模式下运行。

2. 验证主机(master)复制插槽信息

# su - postgres
$ psql -c "SELECT * FROM pg_replication_slots;"
$ exit

pg_replication_slots视图会看到名为pgstandby1的复制插槽信息。

3. 启动从服务(standby)

#systemctl start postgresql-12

三. 测试主从服务

1. 查看从服务(WAL接收器进程)状态:

psql -c "\x" -c "SELECT * FROM pg_stat_wal_receiver;"
扩展显示已打开.
-[ RECORD 1 ]---------+----------------------------
pid                   | 3240
status                | streaming
receive_start_lsn     | 0/3000000
receive_start_tli     | 1
received_lsn          | 0/3013BF8
received_tli          | 1
last_msg_send_time    | 2020-06-22 18:12:29.985512+08
last_msg_receipt_time | 2020-06-22 18:12:29.761575+08
latest_end_lsn        | 0/3013BF8
latest_end_time       | 2020-06-22 17:02:51.977569+08
slot_name             | pgstandby1
sender_host           | 10.20.20.1
sender_port           | 5432
conninfo              | user=replicator password=******** dbname=replication host=10.20.20.1 port=5432 fallback_application_name=walreceiver sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any

查看进程信息,会有walsender的相关信息。

$ ps aux | grep postgres
postgres   ... postgres: walsender replicator 10.20.20.2(38418) streaming 0/3013BF8
...

2. 查看主服务(WAL发送器进程)状态:

psql -c "\x" -c "SELECT * FROM pg_stat_replication;"
-[ RECORD 1 ]----+------------------------------
pid              | 4647
usesysid         | 16384
usename          | replicator
application_name | walreceiver
client_addr      | 10.20.20.2
client_hostname  |
client_port      | 38418
backend_start    | 2020-06-22 16:54:54.391772+08
backend_xmin     |
state            | streaming                    # ☆☆☆服务状态☆☆☆
sent_lsn         | 0/3013BF8
write_lsn        | 0/3013BF8
flush_lsn        | 0/3013BF8
replay_lsn       | 0/3013BF8
write_lag        |
flush_lag        |
replay_lag       |
sync_priority    | 0
sync_state       | async                       # ☆☆☆同步状态☆☆☆
reply_time       | 2020-06-22 18:18:20.293569+08

查看进程信息,会有walreceiver的相关信息。

$ ps aux | grep postgres
postgres   ...postgres:  walreceiver   streaming 0/3013BF8
...

3. 数据测试

master创建replica_demo数据库,在standby上可以看到同步效果

[master] #CREATE DATABASE replica_demo;
[standby]#\l

参考链接

https://www.tecmint.com/configure-postgresql-streaming-replication-in-centos-8/

上一篇下一篇

猜你喜欢

热点阅读