PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统(RDBMS),被业界誉为“先进的开源数据库”,支持NoSQL数据类型,主要面向企业复杂查询SQL的OLTP业务场景。
并且提供PostGIS地理信息引擎,也是我本次使用它的原因。经常在网上看到“PostgreSQL —— 世界上最流行的数据库”
这一次 从零开始 搭建PG主从架构,做读写分离。

1. 配置PostgreSQL下载源

首先准备两台服务器,安装PostgreSQL主从。版本选择这块,选了中间版本13 (详细版本是:13.12)。各版本信息可以在官网查看:https://www.postgresql.org/docs/

1
2
3
4
5
// 首先下载PostgreSQL的RPM文件包
wget --no-check-certificate https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

// 安装RPM包
rpm -ivh pgdg-redhat-repo-latest.noarch.rpm

2. 安装PostgreSQL

根据自己业务需要,除了sever包之外,这里我还会多安装两个包。(如果不需要可以不装)

  • postgresql13-server:数据库
  • postgresql13-contrib:自定义函数需要通过contrib模块进行扩展
  • pg_cron_13:PostgreSQL定时任务插件
1
2
// 安装
yum install postgresql13-server postgresql13-contrib pg_cron_13 -y

自定义数据存储目录

默认的存储目录是/var/lib/pgsql/13/data。可以修改为自定义

1
vim /usr/lib/systemd/system/postgresql-13.service


修改默认的存储目录,然后重新加载一次服务

1
systemctl daemon-reload

配置服务器postgres用户密码

因为安装PG数据库之后 会自动创建postgres用户,可以设置一下密码

1
2
// 设置postgres用户密码,回车之后输入密码确认即可
passwd postgres

至此 在两台机器上 都执行完成这些命令之后,准备工作就差不多完成了。

主库搭建

首先初始化数据库,并配置启动

1
2
3
4
5
6
// 初始化数据库
/usr/pgsql-13/bin/postgresql-13-setup initdb
// 启动
systemctl start postgresql-13.service
// 设置服务开机自启动
systemctl enable postgresql-13.service

修改配置文件

配置文件有很多选项需要优化,优化放到最后说,搭建我们只需要注意三个配置即可

1
2
// 编辑postgresql.conf
vim /var/lib/pgsql/13/data/postgresql.conf

listen_addresses为*,max_connections调大到500,wal_level决定多少信息写入到 WAL中。默认值是replica

1
2
3
listen_addresses = '*'
max_connections = 500
wal_level = replica

创建主从复制账号

登录到PG,并创建用于主从复制的账号

1
2
3
4
5
6
7
8
9
10
11
// 登录postgres用户
su - postgres

// 当显示-bash-4.2$时表示成功登录,然后输入以下命令进入PostgreSQL交互终端
psql

// 为用户postgres设置密码
ALTER USER postgres WITH PASSWORD 'admin123';

// 创建数据库账号slavereplica,并设置密码及登录权限和备份权限。
CREATE ROLE slavereplica login replication encrypted password 'slaver123';

在pg_hba.conf 中增加一行从库节点机器IP段。自己查看服务器IP和内网网段。方法配置trust表示直接信任

1
vim /var/lib/pgsql/13/data/pg_hba.conf
1
host    replication     slavereplica    192.168.0.0/16           trust
1
2
// 全部配置完成之后重新启动
systemctl restart postgresql-13.service

主库的配置就全部完成了,接下来是从库的操作了

从库搭建

从库的配置比较简单了,迁移主库数据就可以了

1
2
3
4
5
6
7
8
// 初始化数据库
/usr/pgsql-13/bin/postgresql-13-setup initdb

// 从节点 清空data 目录
rm -rf /var/lib/pgsql/13/date/*

// 复制主节点data数据: IP为主库的机器IP
sudo -u postgres pg_basebackup -h 192.168.31.190 -p 5432 -U slavereplica -X stream -D /var/lib/pgsql/13/data -R -P

备份完成,会在数据库实例目录下自动生成standby.signal“信号”文件,并在postgresql.auto.conf文件写入了主库的连接信息

1
2
3
4
5
// 启动从库
systemctl start postgresql-13.service

// 验证是否为从节点,会得到t,即true,为从节点
sudo -u postgres /usr/pgsql-13/bin/psql -c "select pg_is_in_recovery()"
1
2
3
4
pg_is_in_recovery 
-------------------
t
(1 row)

同时在主库机器执行以下命令 可以查看到集群状态

1
sudo -u postgres /usr/pgsql-13/bin/psql -c "select * from pg_stat_replication"

用户访问权限配置

如果需要外网访问,需要配置权限。
编辑pg_hba.conf文件,新增一行 允许所有用户所有库所有IP访问

1
host    all             all             0.0.0.0/0               scram-sha-256

这是最省事的方法,但是不太安全,建议是单个用户单个配置

  • 第一列:类型 (host固定)
  • 第二列:数据库 (all表示所有数据库,可以单独设置库名)
  • 第三列:用户 (all表示所有用户,可以单独设置用户)
  • 第四列:IP-CIDR表达式 (0.0.0.0/0表示不限制)
  • 第五列:认证方式 (scram-sha-256=密码认证;trust=直接信任)

postgresql.conf配置优化

数据库的配置,需要根据服务器性能合理配置。这里推荐一个参考项目:填入机器配置,可以自动生成对于的数据库配置信息(可以参考)
项目地址:https://pgtune.leopard.in.ua

配置信息说明

持续完善中。。。

1
2
3
4
5
max_connections = 1000	# 最大连接数
shared_buffers = 4GB # 建议的设置值为机器总内存大小的1/4
effective_cache_size = 8GB # 缓存数据大小

max_worker_processes = 8 # 最大后台进程数

pgadmin管理端

数据库管理工具这一块,可以使用pgadmin。用docker可以快速搭建好,这样就可以通过web端在游览器管理数据库了
https://www.pgadmin.org/download/pgadmin-4-container/

Docker命令如下:配置了管理员的登录邮箱和密码

1
2
3
4
5
6
docker run --name "pgadmin4" \
-p 8080:80 \
-e "PGADMIN_DEFAULT_EMAIL=admin@163.com" \
-e "PGADMIN_DEFAULT_PASSWORD=admin123" \
-e "PGADMIN_LISTEN_ADDRESS=0.0.0.0" \
-d dpage/pgadmin4

启动成功之后,登录pgadmin并配置数据库的连接信息之后,就可以在WEB端对数据库进行监控和管理了。