PostgreSQl 12主从流复制及归档配置

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: PostgreSQl 12主从流复制及归档配置

大家好,我是小姜。一名落魄的低层运维工程师。


上一篇文章说道PostgreSQL 12 的源码部署,这里我们说一下PostgreSQl 12的主从流复制和归档配置。


主从复制的两种形式


1) 基于文件的日志传送


创建一个高可用性(HA)集群配置可采用连续归档,集群中主服务器工作在连续归档模式下,备服务器工作在连续恢复模式下(1台或多台可随时接管主服务器),备持续从主服务器读取WAL文件。连续归档不需要对数据库表做任何改动,可有效降低管理开销,对主服务器的性能影响也相对较低。直接从一个数据库服务器移动WAL记录到另一台服务器被称为日志传送,PostgreSQL通过一次一文件(WAL段)的WAL记录传输实现了基于文件的日志传送。日志传送所需的带宽取根据主服务器的事务率而变化;日志传送是异步的,即WAL记录是在事务提交后才被传送,那么在一个窗口期内如果主服务器发生灾难性的失效则会导致数据丢失,还没有被传送的事务将会被丢失;数据丢失窗口可以通过使用参数archive_timeout进行限制,可以低至数秒,但同时会增加文件传送所需的带宽。archive_timeout强制N秒以后进行一次归档,若设置太小,很快就会超过wal_keep_segments 的值,导致数据覆盖丢失,因此不要盲目设置。


2)流复制


PostgreSQL在9.x之后引入了主从的流复制机制,所谓流复制,就是备服务器通过tcp流从主服务器中同步相应的数据,主服务器在WAL记录产生时即将它们以流式传送给备服务器,而不必等到WAL文件被填充。默认情况下流复制是异步的,这种情况下主服务器上提交一个事务与该变化在备服务器上变得可见之间客观上存在短暂的延迟,但这种延迟相比基于文件的日志传送方式依然要小得多,在备服务器的能力满足负载的前提下延迟通常低于一秒;在流复制中,备服务器比使用基于文件的日志传送具有更小的数据丢失窗口,不需要采用archive_timeout来缩减数据丢失窗口;PostgreSQL 12开始,在执行通过流复制来配置主备数据库的时候,不再需要配置额外配置recovery.conf文件了。取而代之的是在备库环境的$PGDATA路径下配置一个standby.signal文件,注意该文件是一个普通的文本文件,内容为空。理解起来就是,该文件是一个标识文件。如果备库通过执行pg_ctl promote提升为主库的话,那么该文件将自动消失。


注意:全部操作都以postgres用户进行。


配置主从流复制和归档


1)两台机器做免密登录


我们备份和还原过程中所用的archive_command和restore_command命令都以postgres用户运行,因此我们需要针对postgres用户实现ssh无密码登录。


# 用postgres用户登录到主pgsql服务器
ssh-keygen -t rsa  # 一路回车
scp /home/postgres/.ssh/id_rsa.pub postgres@10.10.22.152:/home/postgres/.ssh/authorized_keys
或者拷贝id_rsa.pub文件到从pgsql上,然后到从上执行以下命令
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 
# 登录从pgsql服务器查看权限
chmod 700 /home/postgres/.ssh
chmod 600 /home/postgres/.ssh/authorized_keys
# 测试登录
ssh postgres@10.10.22.152
# 从pgsql库
ssh-keygen -t rsa  # 一路回车
scp /home/postgres/.ssh/id_rsa.pub postgres@10.10.22.151:/home/postgres/.ssh/authorized_keys
# 登录从pgsql服务器查看权限
chmod 700 /home/postgres/.ssh
chmod 600 /home/postgres/.ssh/authorized_keys
# 测试登录
ssh postgres@10.10.22.152


2)主库配置


# 创建用户
ceate user replica with replication login password 'replication';
alter user replica with password 'replication';
# 修改pg_hba.conf
host  replication  replica 10.10.0.0/16  md5
# 修改配置文件
$ vim /data/postgresql-12/data/postgresql.conf
# 监听所有IP
listen_addresses = "0.0.0.0"
# 最大连接数,据说从机需要大于或等于该值
max_connections = 200
# 设置主pgsql为生成wal的主机,9.6开始没有hot_standby(热备模式)
wal_level = replica
# 开启连续归档
archive_mode = on
#归档命令。-o "StrictHostKeyChecking no" 作用是取消第一次连接输入yes或者no
archive_command = 'scp -o "StrictHostKeyChecking no" %p pgslave.ptcloud.t.home:/data/postgresql-12/archive/%f'
# archive_command = 'test ! -f /data/postgresql-12/archive/%f && scp %p pgslave.ayunw.cn:/data/postgresql-12/archive/%f'
archive_cleanup_command = '/usr/local/postgresql-12/bin/pg_archivecleanup -d /data/postgresql-12/data/pg_wal %r >> /data/postgresql-12/log/archive_cleanup.log 2>&1'
# 最多有16个流复制连接。
max_wal_senders = 16
# 设置流服务保留的最多wal(老版本叫xlog)文件个数
wal_keep_segments = 256
# 数据堆清理的最大进程
autovacuum_max_workers = 2
max_worker_processes = 16
max_logical_replication_workers = 10
# 日志设置
log_destination = 'stderr'
logging_collector = on
log_directory = '/data/postgresql-12/log'
log_filename = 'postgresql-%w.log'
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 1GB
log_min_messages = error
# 执行超过300ms的sql语句会记录到pgsql的日志文件,类似于慢日志
# 一般设置300ms就好,慢日志会打到pgsql日志文件,方便查问题
log_min_duration_statement = 300
log_checkpoints = on
log_connections = on
log_disconnections = on
log_error_verbosity = verbose
log_hostname = on
log_line_prefix = '%m [%p] '
log_lock_waits = on 
log_statement = 'ddl'
# 主库设置完成后,需要root用户重启PG服务才能使以上配置生效
systemctl daemon-reload
systemctl restart postgresql
su - postgres
psql
# 主库创建具有流复制权限的用户replica
CREATE user replica login replication encrypted password 'replication';
postgres=# \du;
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 replica   | Replication                                                | {}
# 主库增加主从复制的信任访问(pg_hba.conf)
$ vim /data/postgresql-12/data/pg_hba.conf
# replication privilege.
host    replication     replica         10.10.0.0/16            trust
# 重启服务
systemctl daemon-reload
systemctl restart postgresql
systemctl status postgresql


3)从库配置


# 停止从库,删除从pgsql数据目录中的数据
# 备份数据目录
mkdir -p /opt/pgsqldata_backup
mv /data/postgresql-12/data/* /opt/pgsqldata_backup
pg_ctl -D /data/postgresql-12/data -l logfile stop
rm -rf /data/postgresql-12/data/*


4)从库做基础备份


从主服务器上copy数据到从服务器,这一步叫做“基础备份”


su - postgres
$ pg_basebackup -h 10.10.22.151 -p 5432 -U replica -W -R -Fp -Xs -Pv -D /data/postgresql-12/data/
Password:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/8000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_13370"
31384/31384 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/8000100
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: base backup completed


参数说明:

  • -h 启动的主库数据库地址
  • -p 主库数据库端口
  • -U 流复制用户
  • -W 使用密码验证,要用replica的密码
  • -Fp 备份输出正常的数据库目录
  • -Xs 使用流复制的方式进行复制
  • -Pv 输出复制过程的详细信息
  • -R 为备库创建recovery.conf文件。但是pgsql 10以后的新版本的pgsql不需要这个文件了。
  • -D 指定创建的备库的数据库目录


5) 配置从库的配置文件


注意:这时候,从库数据目录下的postgresql.conf文件是刚才从主的pgsql上同步过来的,并不是pgsql的配置文件,你需要将原先老的从库上的配置文件拿过来用。


$ cd /data/postgresql-12/data/
$ mv postgres.conf  postgres.conf_master.bak
$ cp /opt/pgsqldata_backup/postgres.conf postgres.conf
$ vim /data/postgresql-12/data/postgres.conf
# 监听所有IP
listen_addresses = "0.0.0.0"
# 最大连接数,从pgsql需要大于或等于主的值
max_connections = 300
restore_command = 'cp /data/postgresql-12/archive/%f %p'
archive_cleanup_command = '/usr/local/postgresql-12/bin/pg_archivecleanup -d /data/postgresql-12/data/pg_wal %r && /usr/local/postgresql-12/bin/pg_archivecleanup -d /data/postgresql-12/archive %r >> /data/postgresql-12/log/archive_cleanup.log 2>&1'
# 9.6开始没有hot_standby(热备模式)
wal_level = replica
# 最多有16个流复制连接。
max_wal_senders = 16
# 设置比主库大,可以设置为2倍的数值
wal_keep_segments = 512
max_logical_replication_workers = 10
autovacuum_max_workers = 2
# 和主的值保持一致即可
max_worker_processes = 16
# 说明这台机器不仅用于数据归档,还可以用于数据查询
hot_standby = on
#流备份的最大延迟时间
max_standby_streaming_delay = 30s 
# 向主机汇报本机状态的间隔时间
wal_receiver_status_interval = 10s 
# 出现错误复制,向主机反馈
hot_standby_feedback = on
# 日志设置
log_destination = 'stderr'
logging_collector = on
log_directory = '/data/postgresql-12/log'
log_filename = 'postgresql-%w.log'
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 1GB
log_min_messages = error
# 执行超过300ms的sql语句会被记录到pgsql的日志文件中
log_min_duration_statement = 300
log_checkpoints = on
log_connections = on
log_disconnections = on
log_error_verbosity = verbose
log_hostname = on
log_line_prefix = '%m [%p] '
log_lock_waits = on 
log_statement = 'ddl'


6) 重启从库


要保证从库的数据目录是postgres属主和属组,且权限为0700


su - postgres
pg_ctl -D /data/postgresql-12/data restart


验证pgsql主从


# 登录主库
su - postgres
postgres=# psql
postgres=# select client_addr,sync_state from pg_stat_replication;
 client_addr  | sync_state
--------------+------------
 10.10.22.152 | async
(1 row)
select pid, usename, application_name, client_addr, 
      backend_start, client_port, state, sync_state from pg_stat_replication;
  pid  | usename | application_name | client_addr |         backend_start         | client_port |   state   | sync_state
-------+---------+------------------+-------------+-------------------------------+-------------+-----------+------------
 28356 | repl    | walreceiver      | 10.10.22.152 | 2021-12-30 17:00:59.357653+08 |       48660 | streaming | async
(1 row)


以上说明10.10.22.152服务器是从节点,在接收异步流复制


到这里,主流复制和归档配置完成。


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
存储 关系型数据库 数据库
用Patroni配置PostgreSQL高可用集群
Patroni是Zalando开发的数据库高可用管理软件,用于编排和自动化PostgreSQL集群的管理过程。Patroni 需要一系列其他组件的支持,通过利用第三方分布式一致性软件,组建并实现数据库高可用方案。
用Patroni配置PostgreSQL高可用集群
|
关系型数据库 MySQL Nacos
nacos数据库使用PostgreSQL及集群配置
从Nacos2.2版本开始,Nacos提供了数据源扩展插件,以便让需要进行其他数据库适配的用户自己编写插件来保存数据。
|
弹性计算 关系型数据库 数据库
搭建PostgreSQL主从架构
PostgreSQL是一个关系型数据库管理系统(RDBMS),支持NoSQL数据类型(JSON/XML/hstore)。本教程介绍如何在两台CentOS 7操作系统的ECS实例上搭建PostgreSQL主从架构。
|
3月前
|
关系型数据库 MySQL Linux
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
在Linux中,如何配置数据库服务器(如MySQL或PostgreSQL)?
|
4月前
|
SQL 分布式计算 关系型数据库
实时计算 Flink版产品使用问题之在使用FlinkCDC与PostgreSQL进行集成时,该如何配置参数
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
实时计算 Flink版产品使用问题之在使用FlinkCDC与PostgreSQL进行集成时,该如何配置参数
|
4月前
|
安全 关系型数据库 Linux
|
5月前
|
缓存 关系型数据库 数据库
postgresql.conf配置详解
postgresql.conf配置详解
|
6月前
|
关系型数据库 数据库 PostgreSQL
postgresql|【基于pg_basebackup命令的归档备份和恢复---热备冷恢复方式】
postgresql|【基于pg_basebackup命令的归档备份和恢复---热备冷恢复方式】
283 0
|
安全 关系型数据库 Go
远程连接PostgreSQL:配置指南与安全建议
远程连接PostgreSQL:配置指南与安全建议
691 0
|
6月前
|
关系型数据库 网络安全 数据安全/隐私保护
你会开启Postgresql 的SSL单向认证 配置?
你会开启Postgresql 的SSL单向认证 配置?
325 0
你会开启Postgresql 的SSL单向认证 配置?