腾讯云Linux云服务器搭建PostgreSQL主从架构完全指南
引言:为什么需要主从架构
在现代企业的技术架构中,数据库承载着最为核心的业务数据,其稳定性和可用性直接关系到整个系统的生命线。一次意外的宕机、一块磁盘的物理损坏,甚至一次人为的误操作,都可能导致服务中断、数据丢失,进而带来难以估量的经济损失和品牌信誉危机。笔者在运维岗位上也经历过凌晨三点被宕机警报惊醒的窘境:单机部署的PostgreSQL一旦故障,业务全面停摆,每次数据恢复都需要以小时计算,那种无力感和焦虑至今记忆犹新。
PostgreSQL作为一款功能强大、开源免费的企业级关系型数据库,自9.0版本起便原生支持基于WAL日志的流复制机制。通过部署一主一从或多从的主从架构,我们能够实现近乎实时的数据同步,在主库发生故障时快速切换到备库接管服务,将业务中断时间从小时级缩短到分钟级。腾讯云提供了两种PostgreSQL部署方式:一种是开箱即用的云数据库PostgreSQL服务,默认支持双机高可用一主一从架构;另一种是在云服务器CVM上自行搭建PostgreSQL,这种方式更加灵活可控,便于根据业务需求进行深度定制。本文聚焦于后者,手把手带你完成在腾讯云Linux云服务器上搭建PostgreSQL主从流复制架构的完整流程。
需要先登录腾讯云控制台,点击:腾讯云控制台,还没有账号,点击:注册后再关联,已有账号点击:登录后再关联
第一部分:主从架构的核心原理
1.1 什么是主从复制
PostgreSQL的主从复制架构涉及两个或多个数据库服务器:一个主服务器负责处理所有的写操作以及读操作,一个或多个备服务器负责接收并应用来自主服务器的数据变更,以保持与主服务器的数据一致性。当主服务器发生故障时,备服务器可以迅速接管服务,从而保障业务的连续性。
1.2 WAL日志机制:复制的基石
PostgreSQL的主备同步机制基于预写式日志(Write-Ahead Logging, WAL)进行。WAL日志文件记录了数据库的每一个修改操作,其核心工作流程如下:
- 主数据库将所有数据变更首先写入WAL日志文件
- 主数据库通过WAL Sender进程将WAL日志发送给从数据库
- 从数据库通过WAL Receiver进程接收来自主数据库的WAL日志,并将其写入本地存储
- 从数据库将接收到的WAL日志应用到自身的数据库实例中,使数据与主数据库保持一致
WAL日志文件通常以16MB为一个文件块进行存储,这些文件块被称为WAL段。这种基于日志的复制机制确保了数据在主库和备库之间保持同步,是PostgreSQL实现高可用性和数据冗余的核心技术支撑。
1.3 同步模式的选择
PostgreSQL支持两种主要的同步模式:异步复制和同步复制。在异步复制模式下,主服务器在执行完写操作后立即向应用程序返回响应,然后再向备服务器复制数据。这种方式下主服务器的性能不受备服务器状态的影响,但如果主服务器在数据发送到备库之前发生故障,可能会造成数据丢失。在同步复制模式下,主服务器在执行写操作后必须等待至少一个备服务器确认接收并应用了这些变更,才能向应用程序返回响应。这种方式可以保证数据的强一致性,但可能因网络延迟或备服务器性能问题而影响主服务器的写入性能。腾讯云数据库PostgreSQL同时支持异步复制和半同步复制两种方式。在实际生产环境中,需要根据业务对数据一致性和性能的不同需求来选择合适的同步模式。
第二部分:腾讯云环境准备
2.1 云服务器选型与规格建议
在腾讯云上搭建PostgreSQL主从架构,首先需要准备两台Linux云服务器,分别作为主库和备库。两台服务器建议部署在同一个地域和可用区,以确保网络延迟最低;如果追求更高的容灾能力,也可以部署在不同的可用区甚至不同地域。服务器的配置需要根据业务的数据量和并发请求量进行评估,通常建议主备库采用相同的规格配置,避免因硬件性能差异导致同步延迟。磁盘方面,PostgreSQL的数据目录建议使用高性能的云硬盘,并预留足够的存储空间用于存放WAL日志归档文件。
2.2 操作系统与PostgreSQL版本要求
主备库的操作系统建议保持一致,可以选择CentOS 7/8/9、TencentOS或者Ubuntu 20.04及以上版本。PostgreSQL的版本必须在主备库之间完全一致,否则可能导致兼容性问题。本文以CentOS 7.9和PostgreSQL 14为例进行演示。
2.3 网络与安全组配置
在腾讯云控制台中,需要为两台云服务器配置安全组规则,放行PostgreSQL的默认端口5432,允许主备库之间的通信。如果启用了防火墙,还需要在两台服务器上分别关闭防火墙或添加端口放行规则。此外,建议配置好主备库之间的时间同步服务,避免因系统时间不一致导致复制异常。
第三部分:PostgreSQL安装部署
3.1 主库PostgreSQL安装
登录主库云服务器,执行以下命令完成PostgreSQL 14的安装:
# 添加PostgreSQL官方YUM仓库
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 安装PostgreSQL 14服务器及扩展包
sudo yum install -y postgresql14-server postgresql14-contrib
# 初始化数据库
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
# 启动PostgreSQL服务并设置开机自启
sudo systemctl enable --now postgresql-14对于Ubuntu/Debian系统,安装命令略有不同:
# 导入GPG密钥
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# 添加PostgreSQL官方APT仓库
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# 更新包列表并安装
sudo apt update
sudo apt install -y postgresql-14 postgresql-contrib-143.2 备库PostgreSQL安装
登录备库云服务器,按照与主库完全相同的方式安装相同版本的PostgreSQL。需要注意的是,备库安装完成后不需要执行初始化操作,数据将通过后续的pg_basebackup从主库同步。
第四部分:主库配置
4.1 修改postgresql.conf核心参数
主库的配置文件位于/var/lib/pgsql/14/data/postgresql.conf,需要修改以下核心参数:
# 监听所有网络接口,允许备库连接
listen_addresses = '*'
# WAL日志级别设置为replica,这是流复制的基本要求
wal_level = replica
# 开启归档模式,便于WAL日志的持久化存储
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/14/archive/%f'
# 最大并发WAL发送进程数,应大于从库数量
max_wal_senders = 10
# 复制插槽最大数量,建议与max_wal_senders保持一致
max_replication_slots = 10
# 保留WAL日志的大小,防止从库同步滞后导致日志被清理
wal_keep_size = 1GB
# WAL发送超时时间
wal_sender_timeout = 60s
# 开启热备模式,允许备库提供只读查询服务
hot_standby = on修改完成后,需要创建归档目录并设置正确的权限:
sudo mkdir -p /var/lib/pgsql/14/archive
sudo chown -R postgres:postgres /var/lib/pgsql/14/archive4.2 配置pg_hba.conf客户端认证
pg_hba.conf文件位于/var/lib/pgsql/14/data/目录下,用于控制客户端的连接认证。需要添加一条允许复制用户从备库IP进行连接认证的记录:
# 允许复制用户从备库所在网段进行复制连接
host replication replica 192.168.31.0/24 md5其中,replication表示这是一条用于复制连接(流复制)的记录;replica是复制用户名;192.168.31.0/24表示允许来自该IP网段的连接;md5表示使用MD5加密的密码认证。
4.3 创建复制专用用户
使用psql命令连接到PostgreSQL,创建用于主从复制的专用用户:
sudo -u postgres psql
CREATE ROLE replica WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'your_strong_password';
\q该用户必须具备REPLICATION权限,这是进行流复制的前提条件。
4.4 重启主库使配置生效
所有配置修改完成后,需要重启PostgreSQL服务使配置生效:
sudo systemctl restart postgresql-14第五部分:从库数据同步与启动
5.1 停止备库服务并清理数据目录
在备库上,首先需要停止PostgreSQL服务(如果已启动),并清理数据目录,为从主库同步数据做准备:
sudo systemctl stop postgresql-14
sudo rm -rf /var/lib/pgsql/14/data/*5.2 使用pg_basebackup同步主库数据
pg_basebackup是PostgreSQL提供的物理备份工具,支持13及以上版本,可以从主库获取完整的数据备份并直接用于初始化备库。在备库上执行以下命令:
pg_basebackup \
-h 主库IP地址 \
-p 5432 \
-U replica \
-D /var/lib/pgsql/14/data \
-X stream \
-P \
-v \
-R各参数含义如下:-h指定主库的IP地址;-p指定主库的端口;-U指定复制用户名;-D指定备库的数据目录;-X stream表示以流式方式传输WAL日志;-P显示进度信息;-v输出详细日志;-R会自动生成standby.signal文件并配置primary_conninfo连接信息,这是PostgreSQL 12及以上版本中备库启动的关键配置。
5.3 备库配置验证
pg_basebackup执行完成后,备库数据目录中会自动生成standby.signal文件,表明该实例将以备库模式运行。同时,postgresql.auto.conf文件中会自动写入primary_conninfo连接信息。可以手动检查这些文件是否正确:
# 检查standby.signal文件是否存在
ls -la /var/lib/pgsql/14/data/standby.signal
# 查看primary_conninfo配置
cat /var/lib/pgsql/14/data/postgresql.auto.conf如果自动生成的配置不完整,可以手动编辑postgresql.auto.conf文件补充连接信息:
primary_conninfo = 'host=主库IP地址 port=5432 user=replica password=your_strong_password'5.4 启动备库
完成上述配置后,启动备库的PostgreSQL服务:
sudo systemctl start postgresql-14备库启动后会自动连接到主库,开始接收并应用WAL日志,完成数据的同步。
第六部分:主从复制状态监控
6.1 在主库上查看复制状态
登录主库,通过pg_stat_replication视图可以查看所有备库的复制状态:
sudo -u postgres psql -c "SELECT pid, usename, application_name, client_addr, state, sync_state, pg_wal_lsn_diff(sent_lsn, replay_lsn) AS replay_lag_bytes FROM pg_stat_replication;"该查询返回的关键字段包括:pid为WAL sender进程ID;usename为复制用户名;application_name为备库的应用名称;client_addr为备库的IP地址;state为复制状态;sync_state为同步模式;replay_lag_bytes为备库回放延迟的字节数。
6.2 在备库上查看接收状态
登录备库,通过pg_stat_wal_receiver视图可以查看WAL接收进程的状态:
sudo -u postgres psql -c "SELECT status, receiver_pid, conninfo, slot_name, sender_host, last_msg_send_time, last_msg_receipt_time FROM pg_stat_wal_receiver;"6.3 腾讯云监控服务
腾讯云为云数据库PostgreSQL提供了丰富的监控指标,包括备库日志落盘延迟等关键指标。对于在CVM上自建的PostgreSQL,可以结合腾讯云的云监控服务,自定义采集复制延迟等指标并配置告警策略。此外,也可以通过定期执行SQL查询的方式,将复制状态信息接入到企业的统一监控平台中。
第七部分:故障转移操作
7.1 手动故障转移
当主库发生故障需要将备库提升为新的主库时,可以在备库上执行以下操作:
# 在备库上执行提升操作
sudo -u postgres pg_ctl promote -D /var/lib/pgsql/14/data执行完成后,备库将退出备库模式,转变为独立的主库,可以正常接受写操作。此时需要将应用程序的数据库连接地址修改为新的主库地址,并重新配置新的备库。
7.2 使用pg_rewind恢复旧主库
如果旧主库在故障后恢复了服务,可以使用pg_rewind工具将其重新配置为新的备库。pg_rewind能够将旧主库的数据目录回退到与新主库一致的状态,避免全量重新同步。
7.3 自动故障转移方案
对于生产环境,建议引入自动故障转移方案。常用的方案包括使用Patroni结合ZooKeeper或etcd实现集群状态同步和自动故障转移。腾讯云数据库PostgreSQL服务默认支持双机高可用架构,在主库故障时会自动触发主备切换。对于自建方案,Pgpool-II也是一个常用的选择,可以实现负载均衡与故障转移。
第八部分:常见问题与解决方案
8.1 备库无法连接主库
首先检查主库的安全组和防火墙是否放行了5432端口。然后确认主库的listen_addresses参数是否设置为'*'或备库的IP地址。最后检查pg_hba.conf中是否正确配置了允许备库IP进行复制连接的规则。
8.2 复制延迟过大
复制延迟过大通常由以下原因引起:主库写入压力过大、网络带宽不足、备库硬件性能不足、或WAL日志保留策略不合理。解决方案包括:适当增加wal_keep_size参数值以保留更多WAL日志;检查主库的max_wal_senders是否足够;优化备库的恢复配置;必要时升级服务器规格。
8.3 备库max_connections小于主库
在PostgreSQL主从复制中,备库的max_connections参数值需要大于或等于主库,否则可能导致备库无法正常启动或复制中断。如果遇到此问题,需要在备库的postgresql.conf中调大max_connections的值,然后重启备库。
8.4 WAL日志被提前清理
如果备库同步滞后时间过长,主库的WAL日志可能会在备库完成应用之前被清理,导致备库无法继续同步。解决方案包括:设置合理的wal_keep_size参数值;使用复制槽机制确保主库保留备库所需的WAL日志;配置WAL归档存储,将WAL日志备份到持久化存储中。
8.5 主从版本不一致
主库和备库的PostgreSQL主版本号必须完全一致,否则可能导致复制失败。在部署前务必确认两台服务器安装的是相同版本的PostgreSQL。
结语
在腾讯云Linux云服务器上搭建PostgreSQL主从架构,是保障数据库高可用性和数据安全性的关键举措。通过本文的详细讲解,读者应当已经掌握了从环境准备、PostgreSQL安装部署、主库配置、从库数据同步到复制状态监控与故障处理的完整技术链路。主从架构不仅能够有效消除单点故障风险,还能通过读写分离进一步提升系统的整体吞吐能力。
当然,生产环境的高可用体系建设是一个持续演进的过程。在完成基础的主从架构搭建之后,还可以进一步探索自动故障转移、跨地域灾备、负载均衡等更高级的架构方案。希望本文能够帮助各位读者在腾讯云上构建出稳定、可靠、高性能的PostgreSQL数据库服务,让数据多一份副本,让服务少一分风险。
常见问题解答
问1:主从复制对PostgreSQL版本有什么要求?
答:主库和备库的PostgreSQL主版本号必须完全一致,否则可能导致兼容性问题。本文使用的pg_basebackup工具仅支持13及以上版本。
问2:异步复制和同步复制应该如何选择?
答:如果业务对性能要求较高且可以容忍极短暂的数据不一致,选择异步复制;如果业务对数据一致性要求极高,即使牺牲部分写入性能也要保证数据不丢失,则应选择同步复制。
问3:备库启动后如何确认复制是否正常?
答:可以在主库上查询pg_stat_replication视图查看复制状态,或在备库上查询pg_stat_wal_receiver视图查看WAL接收状态。正常状态下state字段应为streaming。
问4:备库的max_connections为什么必须大于或等于主库?
答:因为备库需要接收来自主库的所有连接信息,如果备库的max_connections小于主库,可能导致备库无法正常启动或复制过程中断。
问5:主库故障后如何将备库提升为新主库?
答:在备库上执行pg_ctl promote命令即可将备库提升为独立的主库。之后需要更新应用程序的数据库连接配置,并重新配置新的备库。
问6:如何防止WAL日志被提前清理导致备库同步失败?
答:可以通过设置合理的wal_keep_size参数值、使用复制槽机制、或配置WAL归档存储等方式来防止WAL日志被提前清理。




