搭建 PostgreSQL 主从架构

操作场景

PostgreSQL 是一个开源对象关系型数据库管理系统,并侧重于可扩展性和标准的符合性。PostgreSQL 面向企业复杂 SQL 处理的 OLTP 在线事务处理场景,支持 NoSQL 数据类型(JSON/XML/hstore),支持 GIS(Geographic Information System 或 Geo-Information system)地理信息处理,在可靠性、数据完整性方面有良好声誉,适用于互联网网站、位置应用系统、复杂数据对象处理等应用场景。

本文指导您在 CentOS 7 操作系统的云服务器实例上搭建 PostgreSQL。

示例软件版本

本文搭建的 PostgreSQL 组成及版本使用说明如下:

Linux:Linux 操作系统,本文以 CentOS 7.6 为例。

PostgreSQL:关系型数据库管理系统,本文以 PostgreSQL 12 为例。

前提条件

已创建两台云服务器实例(一台云服务器实例作为主节点,另一台云服务器实例作为从节点)。 具体步骤请参见 通过购买页创建实例

新建的两台云服务器实例已配置安全组规则:放通5432端口。 具体步骤请参见 添加安全组规则

操作步骤

配置主节点

  1. 登录主节点实例。

  2. 执行以下命令,升级所有包、系统版本和内核。

yum update -y

  1. 依次执行以下命令,安装 PostgreSQL。 本文以使用 PostgreSQL 12 版本为例,您可按需选择其他版本。

wget --no-check-certificate https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

复制代码
rpm -ivh pgdg-redhat-repo-latest.noarch.rpm

yum install postgresql12-server postgresql12-contrib -y

/usr/pgsql-12/bin/postgresql12-setup initdb

  1. 执行以下命令,启动服务。

systemctl start postgresql-12.service

  1. 执行以下命令,设置服务开机自启动。

systemctl enable postgresql-12.service

  1. 执行以下命令,登录 postgres 用户。

su - postgres

  1. 执行以下命令,进入 PostgreSQL 交互终端。

psql

  1. 执行以下命令,为用户 postgres 设置密码,增强安全性。

ALTER USER postgres WITH PASSWORD '自定义密码';

  1. 执行以下命令,创建数据库账号,并设置密码及登录权限和备份权限。

create role 账户名 login replication encrypted password '自定义密码';

本文以创建数据库账号 replica,密码 123456 为例,则执行以下命令。

create role replica login replication encrypted password '123456';

  1. 执行以下命令,查询账号是否创建成功。

SELECT usename from pg_user;

返回如下结果,表示已创建成功。

usename


postgres

replica

(2 rows)

  1. 执行以下命令,查询权限是否创建成功。

SELECT rolname from pg_roles;

返回如下结果,表示已创建成功。

rolname


pg_signal_backend

postgres

replica

(3 rows)

  1. 输入 \q ,按 Enter,退出 SQL 终端。

  2. 输入 exit ,按 Enter,退出 PostgreSQL。

  3. 执行以下命令,打开 pg_hba.conf 配置文件,设置 replica 用户白名单。

vim /var/lib/pgsql/12/data/pg_hba.conf

  1. 按 i 切换至编辑模式,在 IPv4 local connections 段添加如下两行内容:

host all all <从节点的VPC IPv4网段> md5 #允许 VPC 网段中 md5 密码认证连接

host replication replica <从节点的VPC IPv4网段> md5 #允许用户从 replication 数据库进行数据同步

例如,数据库账号为 replica,从节点的 VPC IPv4 网段为 xx.xx.xx.xx/16,则在 IPv4 local connections 段添加如下内容:

host all all xx.xx.xx.xx/16 md5

host replication replica xx.xx.xx.xx/16 md5

  1. Esc ,输入 :wq,保存文件返回。

  2. 执行以下命令,打开 postgresql.conf 文件。

vim /var/lib/pgsql/12/data/postgresql.conf

  1. i 进入编辑模式,分别找到以下参数,并将参数修改为以下内容:

listen_addresses = '*' #监听的内网 IP 地址

max_connections = 100 #最大连接数,从库的 max_connections 必须要大于主库的

wal_level = hot_standby #启用热备模式

synchronous_commit = on #开启同步复制

max_wal_senders = 32 #同步最大的进程数量

wal_sender_timeout = 60s #流复制主机发送数据的超时时间

  1. Esc ,输入 :wq,保存文件返回。

  2. 执行以下命令,重启服务。

systemctl restart postgresql-12.service

配置从节点

  1. 登录从节点实例。

  2. 执行以下命令,升级所有包、系统版本和内核。

yum update -y

  1. 依次执行以下命令,安装 PostgreSQL。

wget --no-check-certificate https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

复制代码
rpm -ivh pgdg-redhat-repo-latest.noarch.rpm
复制代码
yum install postgresql12-server postgresql12-contrib -y
  1. 执行以下命令,使用 pg_basebackup 基础备份工具制定备份目录。

pg_basebackup -D /var/lib/pgsql/12/data -h <主节点公网 IP> -p 5432 -U replica -X stream -P

根据提示,输入数据库账号对应的密码,按 Enter。返回如下结果,表示备份成功。

复制代码
Password:

24526/24526 kB (100%), 1/1 tablespace

  1. 执行以下命令,拷贝 master 配置相关文件。

cp /usr/pgsql-12/share/recovery.conf.sample /var/lib/pgsql/12/data/recovery.conf

  1. 执行以下命令,打开 recovery.conf 文件。

vim /var/lib/pgsql/12/data/recovery.conf

  1. i 切换至编辑模式,分别找到如下参数,并修改为如下内容:

standby_mode = on #声明此节点为从库

primary_conninfo = 'host=<主节点公网 IP> port=5432 user=数据库账号 password=数据库密码' #对应主库的连接信息

recovery_target_timeline = 'latest' #流复制同步到最新的数据

  1. Esc ,输入 :wq,保存文件返回。

  2. 执行以下命令,打开 postgresql.conf 文件。

vim /var/lib/pgsql/12/data/postgresql.conf

  1. i 切换至编辑模式,分别找到如下参数,并修改为如下内容:

max_connections = 1000 # 最大连接数,从库的 max_connections 必须要大于主库的

hot_standby = on # 开启热备

max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间

wal_receiver_status_interval = 1s # 从节点向主节点报告自身状态的最长间隔时间

hot_standby_feedback = on # 如果有错误的数据复制向主进行反馈

  1. Esc ,输入 :wq,保存文件返回。

  2. 执行以下命令,修改数据目录的属组和属主。

复制代码
chown -R postgres.postgres /var/lib/pgsql/12/data
  1. 执行以下命令,启动服务。

systemctl start postgresql-12.service

  1. 执行以下命令,设置服务开机自启动。
复制代码
systemctl enable postgresql-12.service

验证部署

您可以通过如下操作验证是否部署成功:

  1. 执行以下命令,从节点备份目录。

pg_basebackup -D /var/lib/pgsql/12/data -h <主节点公网 IP> -p 5432 -U replica -X stream -P

输入数据库密码并按 Enter,返回如下结果,则表示已备份成功。

复制代码
Password:

24526/24526 kB (100%), 1/1 tablespace

  1. 在主节点中,执行以下命令,查看 sender 进程。

ps aux |grep sender

  1. 在从节点中,执行以下命令,查看 receiver 进程。
复制代码
ps aux |grep receiver

返回如下结果,即表示可成功查看到 receiver 进程。



  1. 在主节点中,依次执行以下命令,进入 PostgreSQL 交互终端,在主库中查看从库状态。
复制代码
su - postgres
复制代码
psql
复制代码
select * from pg_stat_replication;

返回如下结果,即表示可成功查看到从库状态。



相关推荐
乘云数字DATABUFF3 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--5 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森5 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜6 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB7 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode8 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220709 天前
如何搭建本地yum源(上)
运维
大树8812 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠12 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质12 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务