PostgreSQL集群篇——1、PG环境安装准备

本文介绍了在面临高并发问题时,选择PostgreSQL的同步流复制解决方案来提升数据库的可用性和数据一致性。文章详细阐述了从选择流复制技术到决定使用PostgreSQL13.1版本的过程,并提供了详细的编译安装步骤,包括环境配置、编译安装、环境变量设置、数据库初始化以及服务自启动配置等。最后,文章指出已完成基础环境准备,接下来将进行流复制集群的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PostgreSQL集群篇——1、PG环境安装准备

标签

PostgreSQL,PG,集群,DBA,架构师,PG安装,编译安装

背景

PostgreSQL官方文档中讲到了多种高可用、负载均衡和复制特性解决方案,如下图所示:

特性共享磁盘故障转移文件系统复制预写式日志传送逻辑复制基于触发器的主-备复制基于语句的复制中间件异步多主控机复制同步多主控机复制
最通用的实现NASDRBD内建流复制内建逻辑复制,pglogicalLondiste,Slonypgpool-IIBucardo
通信方法共享磁盘磁盘块WAL逻辑解码表行SQL表行表行和行锁
不要求特殊硬件
允许多个主控机服务器
无主服务器负载
不等待多个服务器with sync offwith sync off
主控机失效将永不丢失数据with sync onwith sync on
复制体接受只读查询with hot
每个表粒度
不需要冲突解决

我们在集群环境中使用这些技术,首先需要考虑的是我们目前面临的是什么问题,例如我现在面临的就是高并发问题如何来解决,按照上述图表中我选择了流复制解决方案。

在流复制解决方案中分为同步、异步两种,异步流复制通常采用的是基于wal日志来传送的方式进行,从节点通常比主节点要少一个wal日志块的数据,这给我们并发查询造成了影响,因此这里我们需要采用同步流复制解决方案,其采用的是数据流的方式,就像小溪一样,水一直流淌着,多条分支最终汇总到一处,同时接收处也在一直存储着。

流复制是从2010年推出pg9.0版本以后开始的,其版本到目前经历的阶段如下:

版本方式描述
PostgreSQL9.0流式物理复制开始支持流式物理复制,用户可以通过流式复制构建只读备库
PostgreSQL9.1同步流复制开始支持同步复制,只支持一个同步流复制节点,同步流复制能保证数据的0丢失
PostgreSQL9.2级联流复制开始支持联流复制,备库下面还可以再连接备库,形成级联架构
PostgreSQL9.2流式虚拟备库开始支持虚拟备库,即备库中没有数据文件,只包含wal文件。
PostgreSQL9.4逻辑复制开始支持逻辑复制,逻辑复制可以应对部分表复制的功能。
PostgreSQL9.6同步流复制改版同步流复制允许多个备用服务器以提高可靠性。
PostgreSQL10使用发布/订阅进行逻辑复制
PostgreSQL11-13持续优化

本次我们将采用PostgreSQL13.1版本进行搭建同步流复制环境,数据库安装我们采用了编译安装,如不清楚怎样安装,请查看之前的文章《PostgreSQL集群篇——1、PG环境安装准备》

环境

PostgreSQL集群篇整体采用3台虚拟机进行搭建,相关情况如下:

服务器IPCPU内存存储作用
10.28.1.1814核8G200G主master节点,
10.28.1.1824核8G200G从slave节点,
10.28.1.2104核8G200GVIP节点,虚拟IP

产品简介

内容:

安装脚本:

1、设置服务器使用的时区并校准时间
sudo tzselect
 #输入 4 9 1 1
 sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
 sudo apt-get update
 sudo apt-get install ntpdate -y
 sudo ntpdate us.pool.ntp.org
2、安装必要的编译环境
sudo apt-get install gcc make libreadline-dev zlib1g-dev -y
3、创建好准备安装的目录并创建pg基础用户,并将pg基础目录授权给该用户
sudo mkdir /pg
 # 授权pg用户目录操作权限,这里在安装完成后权限应是postgres用户
 sudo groupadd postgres
 sudo useradd -g postgres postgres -s "/bin/bash" -m
 sudo passwd postgres
 sudo chown -R postgres:postgres /pg

这里我们创建用户的同时对其进行设置了密码,设置一个密码,安全性上更有保障,同时默认密码随机,如果一直使用sudo su则会缺少环境变量,后续会带来不必要的麻烦。同时后续我们切换用户会使用su 直接切换不会增加sudo。

4、从官网下载PostgreSQL最新稳定版本,这里使用编译安装进行可控式安装

源码下载

su postgres
 mkdir /pg/install
 cd /pg/install
 wget https://ftp.postgresql.org/pub/source/v13.1/postgresql-13.1.tar.gz
5、开始进行编译
tar -zxf postgresql-13.1.tar.gz
 cd postgresql-13.1/
 ./configure --prefix=/pg
 # 编译主程序
 make
 # 编译文档与contrib
 make world
 # 安装主程序
 make install
 # 安装全部
 make install-world
 # 安装完成后清除源码中编译生成的文件,将其还原为发布时的源码包。便于后续时间需要使用时再次编译
 make distclean
  • make 编译主程序

  • make world 在编译主程序的同时将其文档与contrib共享库包全部编译

  • make install 安装主程序

  • make install-world 安装文档与contrib共享库,当我们把所有共享库都安装上并不代表数据库已经可用这些,而是需要我们在库中根据需要进行create extension启用插件。因此这里我们直接将原带的插件,对其性能不会

6、设置环境变量
sudo vim /etc/profile
 #在文件最底部增加
 export PGHOME=/pg
 export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
 export PATH=$PGHOME/bin:$PATH  # 主程序目录
 export PGDATA=$PGHOME/data      # 数据存储目录
 export MANPATH=$PGHOME/share/man:$MANPATH  # 共享包库
 export LANG=en_US.utf8
 ## wq 保存
 sudo reboot

这里我们在设置完成系统环境变量后直接进行了重启,而没有使用当前会话生效命令( source /etc/profile)是因其下面我们要多次切换用户,这时需要每次都执行一次过于麻烦。索性直接重启一次,所有会话下直接生效。

7、开始进行初始化数据库w
su postgres
 pg_ctl initdb

备注:这里我们进入postgres用户后直接使用了pg_ctl命令,是因为上面设置了系统环境变量PATH,其次我们切换用户时使用的是su,如果使用sudo su 进入用户会导致系统环境变量丢失,如果想使用该命令需要再去单独设置root用户的环境变量。


执行到这里后我们可以使用pg_ctl start 与pg_ctl stop 进行测试数据库是否正常启动停止,下面我们将开始对其服务器自启动进行设置,增加到日常linux服务管理中。


8、创建日志库,并添加系统启动项
cd /pg
 mkdir logfiles
9、进行编写服务器启动服务
exit    # 退出当前的postgres用户
sudo vim /etc/systemd/system/postgresql.service

文件内容如下:

[Unit]
 Description=PostgreSQL database server
 Documentation=man:postgres(1)
 After=network.target
 
 [Service]
 Type=forking
 User=postgres
 Group=postgres
 Environment=PGSTARTTIMEOUT=300
 Environment=PGDATA=/pg/data
 ExecStart=/pg/bin/pg_ctl start -D ${PGDATA} -s -w -t ${PGSTARTTIMEOUT} -l /pg/logfiles/pg_service_log
 ExecStop=/pg/bin/pg/pg_ctl stop -D ${PGDATA} -s -m -l /pg/logfiles/pg_service_log
 ExecRestart=/pg/bin/pg_ctl restart -D ${PGDATA} -s -l /pg/logfiles/pg_service_log
 ExecReload=/pg/bin/pg_ctl reload -D ${PGDATA} -s -l /pg/logfiles/pg_service_log
 KillMode=mixed
 KillSignal=SIGINT
 TimeoutSec=360
 
 [Install]
 WantedBy=multi-user.target
:wq  #保存文件
 sudo systemctl daemon-reload
10、测试使用postgresql服务进行启动数据库
systemctl start postgresql
 systemctl restart postgresql
 systemctl stop postgresql
 systemctl restart postgresql
ps -aux|grep postgres
 su postgres
 tail -1000f /pg/logfiles/pg_service_log  # 查看服务启停日志

至此集群环境下我们需要使用的基础pg环境已准备就绪,下一篇我们将开始对其这两台进行搭建流复制集群设置。

本文声明

88x31.png

知识共享许可协议 本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。

<think>嗯,用户需要PostgreSQL集群部署的教程或最佳实践,我需要结合站内引用给出清晰的步骤。用户明确引用了几个关键信息点:主从复制配置(引用1)、配置文件修改位置(引用2)、Patroni高可用方案示例(引用3)、PostgreSQL的核心优势(引用4)以及主节点重启和slave数据同步命令(引用5)。用户是数据库运维或开发人员,实际需求可能是搭建生产环境的高可用集群。深层需求可能包括:避免配置踩坑、确保故障切换可靠性、性能优化。引用3提到的Patroni方案值得重点展开,因为这是当前主流的生产级方案。先从基础知识切入,确保用户理解主从复制的必要性——引用4提到的高可用性和海量数据支撑能力。部署步骤分为传统手动方式和自动化工具两类:1.传统方式重点参考引用1和5的主从配置,强调postgresql.conf的wal_level/hot_standby等参数设置,以及pg_basebackup同步数据的命令细节2.自动化方案重点用引用3的Patroni示例,说明如何通过systemd管理集群状态需要提醒配置文件路径差异(引用2提到/usr/pgsql-*/bin目录结构),避免版本兼容问题。操作风险方面,引用5的rm-rf命令危险,必须加注"确保数据备份"的警告。最后主动延伸高可用测试方法(主节点故障模拟)和性能优化建议,覆盖用户可能的后续问题。</think> 以下是基于引用内容整理的PostgreSQL集群部署核心步骤及最佳实践,涵盖主从复制与高可用部署方案: ### 一、基础主从复制集群部署 #### 1. 主节点配置 ```bash # 修改postgresql.conf [^1][^2] wal_level = replica max_wal_senders = 10 hot_standby = on # 创建复制用户 CREATE USER rep REPLICATION LOGIN ENCRYPTED PASSWORD '密码'; ``` ```bash # 修改pg_hba.conf [^1] host replication rep slave_ip/32 md5 ``` ```bash # 重启主节点 [^5] sudo systemctl restart postgresql-14 ``` #### 2. 从节点配置 ```bash # 同步数据(在主节点操作)[^5] rm -rf /home/postgres/data/ # 注意:确保目录为空 pg_basebackup -h master_ip -p 5432 -U rep -Fp -Xs -Pv -R -D /home/postgres/data/ ``` ```bash # 自动生成standby.signal文件[^1] # 检查postgresql.auto.conf包含: primary_conninfo = 'host=master_ip port=5432 user=rep password=xxx' ``` ### 二、高可用方案(基于Patroni) #### 1. 核心组件部署 ```yaml # /etc/patroni.yml 示例 [^3] scope: pg_cluster name: node1 restapi: listen: 0.0.0.0:8008 etcd: hosts: [etcd_node1:2379, etcd_node2:2379] bootstrap: dcs: ttl: 30 retry_timeout: 10 postgresql: use_pg_rewind: true parameters: max_connections: 100 postgresql: listen: 0.0.0.0:5432 data_dir: /var/lib/pgsql/13/data ``` #### 2. 服务管理 ```bash # 启动Patroni集群 [^3] systemctl enable patroni systemctl start patroni # 查看节点状态 patronictl -c /etc/patroni.yml list ``` ### 三、最佳实践建议 1. **性能优化** ```bash # postgresql.conf 关键参数 [^4] shared_buffers = 25% RAM # 建议系统内存的25% maintenance_work_mem = 1GB # 大表维护时提升VACUUM效率 max_parallel_workers = 8 # 利用多核CPU处理查询 ``` 2. **高可用保障** - 使用**etcd/ZooKeeper**管理集群状态(引用3) - 配置**pg_rewind**支持节点重新加入(避免全量同步) - 启用**同步提交**保证数据一致性: ```sql ALTER SYSTEM SET synchronous_commit = remote_write; ``` 3. **灾难恢复** ```bash # 持续归档配置 wal_level = replica archive_mode = on archive_command = 'scp %p backup_server:/pg_wal/%f' ``` ### 四、集群验证方法 ```sql -- 主节点检查复制状态 SELECT client_addr, state, sync_state FROM pg_stat_replication; -- 从节点验证只读状态 SELECT pg_is_in_recovery(); ``` > **重要提示**: > - 主备节点需保持**时间同步**(NTP服务) > - 生产环境建议使用**VIP**或**HAProxy**实现连接池负载均衡 > - 测试环境可用pgpool-II实现自动故障转移 --- ### 相关延伸问题 1. PostgreSQL流复制延迟如何监控与优化? 2. Patroni集群如何实现滚动升级? 3. 集群环境下如何安全地进行大版本升级? 4. PostgreSQL读写分离如何结合中间件实现? [^1]: PostgreSQL主从复制基础配置 [^2]: 关键配置文件路径说明 [^3]: Patroni高可用集群部署示例 [^4]: PostgreSQL集群性能优势解析 [^5]: 节点数据同步操作命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CN華少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值