PostgreSQL 13 异步流复制(#2.1)-202103
简述:本章重点是异步流复制的学习。学习异步流复制前,我们先简单了解一下流复制的工作协助和启动顺序,这样才有助于我们更清晰的认识流复制配置的过程。
环境:
OS:RedHat 8.3
DB:PostgreSQL 13.1
Master:192.168.108.128
Replica:192.168.108.129
流复制中3个过程协作工作简介:
1.主库服务器上walsender进程把WAL数据发送到备库服务器
2.备库服务器上starup和walreceiver进程接受并重放这些WAL数据
3.walsender和walreceiver使用单个TCP连接进行通信
流复制进程启动顺序简介:
1.primary and standby servers
2.standby server start a startup process
3.standby server start walreceiver process
4.standby server walreceiver sends a connection request to primary server
5.when primary server receives a connection request, starts a walsender process and a tcp connection is established between the walsender and walreceiver
6.walreceiver sends the latest LSN of standby’s database cluster
7.if standby’s LSN<primary’s LSN, the walsender sends WAL data from be former LSN to the latter LSN. The standby server replays the received WAL data. In this phase, the standby catches up with the primary.
8.streaming replication begins to work
参考:http://www.interdb.jp/pg/pgsql11.html
1.主库
1.1 安装postgresql db软件/初始化数据库
# 参考:《PostgreSQL 13 源码安装(#1.1)-202103》
1.2 监听设置
# 配置postgresql.conf
# listen_addresses:控制允许哪些ip地址访问,可以是一个ip,也可用是多个IP。高可用架构中一般情况使用vip连接,所以设置为’*’允许所有地址访问数据库
listen_addresses =‘*’
1.3 WAL模式设置
# 配置postgresql.conf
# wal_level 有3种模式,其中replica模式记录了WAL归档,复制,备库中启用只读查询等操作所需的WAL信息。WAL信息包含多少:minimal<replica<logical
wal_level = replica
1.4 主库被访问控制
# 配置pg_bha.conf
# 允许备库(192.168.108.129)使用repl用户通过md5口令认证连接replication数据库[replication是PostgreSQL用于复制的特殊伪数据库的名称]
host replication repl 192.168.108.129/32 md5
1.5 创建复制数据库用户及赋权
# 创建一个具有复制权限的角色
create role repl login replication encrypted password 'repl123!';
1.6 主库重启激活修改的参数
pg_ctl -D $PGDATA stop -m fast
pg_ctl -D $PGDATA -l logfile start
2.备库
2.1 安装postgresql db软件
# 参考:《PostgreSQL 13 源码安装(#1.1)-202103》
2.2 创建~/.pgpass(用于免密登录)
touch .pgpass
chmod 0600 .pgpass
vi ~/.pgpass
192.168.108.128:5432:replication:repl:repl123!
2.3 使用pg_basebackup基准数据恢复-R 自动创建standby.signal
pg_basebackup -h 192.168.108.128 -U repl -D /db/pg13/data/slavedb -Xs -P -R
# /db/pg13/data/slavedb是从库创建一个新目录,用来恢复主库的cluster databases
# -h 主库ip地址
# -U 指定连接主库的用户
# -D 从库复制数据的目录
# -Xs 主库备份时,以流式传输WAL日志内容
# -P 进度报告
# -R 创建一个standby.signal空文件,用于在集群中激活standby server,有这个standby.signal文件即为备库;另外也可以把主库一些连接信息primary_conninfo写入备库postgresql.auto.conf
参考:https://www.digitalocean.com/community/tutorials/how-to-set-up-physical-streaming-replication-with-postgresql-12-on-ubuntu-20-04
2.4 备库连接主库字符串查看
2.4.1 pg_basebackup -R 自动产生standby.signal
# standby.signal为空。如主备切换时,会自动删除这个文件。standby.signal空文件,用于在集群中激活standby server,有这个standby.signal文件即为备库
cat standby.signal
2.4.2 pg_basebackup -R 把主库一些连接信息primary_conninfo写入备库postgresql.auto.conf
cat postgresql.auto.conf
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=repl passfile=''/home/pg13/.pgpass'' channel_binding=disable host=192.168.108.128 port=5432 sslmode=disable sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
# In PostgreSQL 12 and newer versions, standby_mode is gone, replaced by standby.signal to trigger a standby state at recovery.
# primary_conninfo:Specifies a connection string to be used for the standby server to connect with a sending server.
# user:PostgreSQL连接数据库用户
# channel_binding:disable是阻止使用通道绑定
# host:连接的主机名称
# port:端口
# sslmode:disable是仅尝试使用non-SSL连接
# sslcompression:通过ssl连接发送数据;0是禁止压缩,1是压缩
# ssl_min_protocol_version:允许最小的SSL/TLS协议版本
# gssencmode:是否使用GSS TCP/IP;disable是仅尝试non-GSSAPI-encrypted加密连接
# krbsrvname:当使用Kerberos service时,用postgres身份进行GSSAPI认证
# target_session_attrs:any所有连接均可以接受
# passfile:用于存储密码的文件
参考:https://www.postgresql.org/docs/13/libpq-connect.html#LIBPQ-CONNSTRING
3.重启cluster databases
3.1 备库启动激活修改的参数和流复制
pg_ctl -D $PGDATA -l logfile start
pg_ctl -D $PGDATA stop -m fast
# 重启不是必须的,但重启可以把我们所有修改的参数生效,索性重启了。先主后从,这个顺序不能变。
4.流复制验证
4.1 主库
\x
select * from pg_stat_replication;
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 18026
usesysid | 16384
usename | repl
application_name | walreceiver
client_addr | 192.168.108.129
client_hostname |
client_port | 34840
backend_start | 2021-03-30 13:55:13.460422+08
backend_xmin |
state | streaming
sent_lsn | 0/6000060
write_lsn | 0/6000060
flush_lsn | 0/6000060
replay_lsn | 0/6000060
write_lag |
flush_lag |
replay_lag |
sync_priority | 0
sync_state | async
reply_time | 2021-03-30 13:56:13.650865+08
4.2 从库
\x
select * from pg_stat_wal_receiver;
postgres=# select * from pg_stat_wal_receiver;
-[ RECORD 1 ]---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid | 19398
status | streaming
receive_start_lsn | 0/6000000
receive_start_tli | 1
written_lsn | 0/6000060
flushed_lsn | 0/6000060
received_tli | 1
last_msg_send_time | 2021-03-30 13:56:43.711174+08
last_msg_receipt_time | 2021-03-30 13:56:43.708336+08
latest_end_lsn | 0/6000060
latest_end_time | 2021-03-30 13:55:13.462654+08
slot_name |
sender_host | 192.168.108.128
sender_port | 5432
conninfo | user=repl passfile=/home/pg13/.pgpass channel_binding=disable dbname=replication host=192.168.108.128 port=5432 fallback_application_name=walreceiver sslmode=disable sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any
4.3 主库创建测试database,测试备库的流复制状况
4.3.1 主库
Create database asyncdb;
\l
4.3.2 备库
\l
-[ RECORD 1 ]-----+--------------
Name | asyncdb
Owner | pg13
Encoding | UTF8
Collate | en_US.utf8
Ctype | en_US.utf8
5. 异步流复制已完成配置。