赞
踩
基于pg_basebackup的主备库搭建,pg_basebackup命令的使用方法如下:
pg_basebackup [option...]
此命令后可以跟多个选项,各选项的具体说明如下。
su - postgres
vi pg_hba.conf
host replication all 0.0.0.0/0 md5
# 必须打开
full_page_writes = on
archive_mode = on
listen_addresses = '*'
# 必须设置为非零值,且比备库数量多
max_wal_senders = 10
# 参数设置为“replica”或“logical”。
wal_level = replica
# 默认值太小,备库容易失效,增大该值
min_wal_size = 2GB
create user replicator replication login connection limit 5 password 'replicator';
pg_basebackup -h 10.10.100.54 -U replicator -F p -P -X stream -R -D /app/postgresql/data -l backup20221117
hot_standby = on
/app/postgresql/bin/pg_ctl -D /app/postgresql/data -l /app/postgresql/log/logfile start
由于我是编译安装修改了数据库的块大小,所以必须保证两个库的编译参数完全一样,否则无法启动备库
./configure --prefix=/app/postgresql --with-perl --with-python --with-blocksize=32 --with-wal-blocksize=32 --with-segsize=10
先停主库,再停备库
然后将原来备库参数加入主库配置文件
在主库创建文件standby.signal
并修改
primary_conninfo = 'user=replicator password=replicator channel_binding=disable host=10.10.100.62 port=5432 sslmode=disable sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
删除备库standby.signal
先起备库再起主库
修改配置文件
修改配置文件postgresql.conf
wal_log_hints = on
或者初始化数据库时加入-k参数
原备库执行命令
pg_ctl promote
原主库执行
pg_rewind -D /app/postgresql/data --source-server='host=10.10.100.54 port=5432 user=postgres password=postgres'
原主库创建文件
touch /app/postgresql/data/standby.signal
启动备库
PostgreSQL异步流复制的缺点是当主库损坏的时候,激活备库后会丢失一些数据,这对于一些不允许丢失数据的应用来说是不可接受的,所以PostgreSQL从9.1版本开始提供同步流复制的功能,解决了主备库切换时丢失数据的问题。同步复制要求WAL日志写入Standby数据库后commit才能返回,所以Standby库出现问题时,会导致主库被hang住。解决这个问题的方法是启动两个Standby数据库,这两个Standby数据库只要有一个是正常运行的就不会让主库hang住。所以在实际应用中,同步流复制,总是有一个主库和两个以上的Standby备库。
即使是同步复制,如果因主库发生临时故障激活了其中一个备库,要想把原主库转换成新主库的备库,仍然需要用pg_rewind处理一下才行,这是因为虽然是同步复制,但并不是把主库的WAL日志完全同步地传输到备库,同步只是到事务提交时才保证其已经传输到了备库,一些未提交事务的WAL日志可能还没有传输到备库,因此激活备库时,还是会丢失一些WAL日志。当然对于用户来说,未提交事务的WAL日志丢失,并不会导致用户数据的丢失。
同步复制的配置主要是在主库上配置参数“synchronous_standby_names”,该参数指定多个Standby的名称,各个名称用逗号分隔,而Standby名称是在Standby连接到主库时由连接参数“application_name”指定的。
主库修改配置文件postgresql.conf
# 表示有任意一台备库进行同步之后即可返回,可根据需要修改,我只有一个备库所以这么写
synchronous_standby_names = 'ANY 1 (postgresql2)'
wal_level = hot_standby
synchronous_commit = on
# 最大有几个备库
max_wal_senders = 10
hot_standby_feedback = true
synchronous_standby_names:
synchronous_commit:
由上面说明即可联想到同步复制,synchronous_commit的可选值为“on”“remote_apply”“remote_write”
修改配置文件postgresql.auto.conf
primary_conninfo = 'application_name=postgresql2 user=replicator password=replicator channel_binding=disable host=10.10.100.54 port=5432 sslmode=disable sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any'
primary_conninfo = 'application_name=postgresql2 user=replicator password=replicator host=10.10.100.54 port=5432 sslmode=disable sslcompression=1'
select application_name,client_addr,state, sync_priority, sync_state from pg_stat_replication;
由于我写的是’ANY 1 (postgresql2)',所以查询状态显示不准确
主库
select application_name,client_addr,state, sync_priority, sync_state from pg_stat_replication;
备库
select * from pg_stat_wal_receiver;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。