本文最后更新于 2024年3月26日 下午
简介
Pigsty 是一个更好的本地自建且开源 RDS for PostgreSQL 替代,具有以下特点:
开箱即用的 PostgreSQL 发行版,深度整合地理、时序、分布式、图、向量、分词、AI等 150 余个扩展插件!
运行于裸操作系统之上,无需容器支持,支持主流操作系统: EL7/8/9 及其衍生发行版, Ubuntu 20.04/22.04 以及 Debian 11/12。(推荐使用Rocky Linux)
基于现代的 Prometheus 与 Grafana 技术栈,提供令人惊艳,无可比拟的数据库观测能力:画廊 & 演示站点
基于 patroni, haproxy, 与etcd,打造故障自愈的高可用架构:硬件故障自动切换,流量无缝衔接。
基于 pgBackRest 与可选的 MinIO 集群提供开箱即用的 PITR 时间点恢复,为软件缺陷与人为删库兜底。
基于 Ansible 提供声明式的 API 对复杂度进行抽象,以 Database-as-Code 的方式极大简化了日常运维管理操作。
Pigsty用途广泛,可用作完整应用运行时,开发演示数据/可视化应用,大量使用 PG 的软件可用 Docker 模板一键拉起。
提供基于 Vagrant 的本地开发测试沙箱环境,与基于 Terraform 的云端自动部署方案,开发测试生产保持环境一致。
部署并监控专用的 Redis(主从,哨兵,集群),MinIO,Etcd,Haproxy,MongoDB(FerretDB) 集群
官方文档:https://pigsty.cc/doc/#/zh/README
项目地址:https://github.com/Vonng/pigsty
本教程说明
一个非常简单的入门教程,用于构建一个三节点的PG集群(开启VIP),且支持扩展时序数据库timescaledb,主要用于Zabbix的后端数据库。
基于Pigsty 2.5.1 、Rocky Linux 9.3 编写。
安装
初始化元节点(管理监控节点)
准备一个全新的符合要求 的 Linux x86_64 ,使用带有root权限或有sudo权限的用户执行安装脚本。
(官方推荐使用Rocky Linux 8.8,配置建议2C4G 100G硬盘)
1
| curl https://get.pigsty.cc/latest | bash
|
PS:安装后会移除系统自带yum源,建议提前安装所需软件。
该命令会下载并解压 Pigsty 源码至用户Home,按提示完成 准备,配置,安装三个步骤即可完成安装。
1 2 3 4 5 6 7 8 9
| cd ~/pigsty # 进入 Pigsty 源码目录,完成后续 准备、配置、安装 三个步骤 ./bootstrap # 确保 Ansible 正常安装,如果存在 /tmp/pkg.tgz 离线软件包,便使用它。 ./configure # 执行环境检测,并生成相应的推荐配置文件,如果你知道如何配置 Pigsty 可以跳过。 ./install.yml # 根据生成的配置文件开始在当前节点上执行安装,使用离线安装包大概需要10分钟完成。 # 可以在里面修改默认信息pigsty.yml,如域名和默认密码等。
|
安装完成后,您可以通过域名或80/443端口通过 Nginx 访问 WEB 界面,通过 5432 端口访问元节点默认的 PostgreSQL 数据库服务。
IP地址规划
IP地址 |
主机名 |
角色 |
172.18.77.33 |
pg-meta-1 |
元节点 |
172.18.77.101 |
pg-cu1-1 |
PG集群主机节点 |
172.18.77.102 |
pg-cu1-2 |
PG集群主机节点 |
172.18.77.103 |
pg-cu1-3 |
PG集群主机节点 |
172.18.77.99 |
vip |
Keepalived 虚拟IP |
PS:Keepalived 集群需要在同一广播域。(其实就是基于VRRP协议)
DNS 解析配置
你需要修改hosts文件,增加以上解析。或者在内网dns配置上述解析。解析的IP为元节点IP即可。
Pigsty 会自动给纳入管理的节点填写hosts文件。
1 2
| 172.18.77.33 h.pigsty a.pigsty p.pigsty g.pigsty # pigsty dns #示例
|
访问Web 界面
主页域名为 h.pigsty ,g.pigsty 为Grafana ,全局应用默认账号密码为 admin/pigsty。
(如果自己电脑要用浏览器访问,注意配置DNS解析或hosts文件)
部署三节点PG高可用集群
编辑Pigsty 配置文件,增加主机节点信息
1 2 3 4
| cd ~/pigsty # 进入pigsty 主目录,所有操作都在此目录执行。 vim pigsty.yml # 编辑配置文件,增加三台主节点和集群配置。
|
增加PG集群和VIP配置信息
1、集群名字为pg-cu1
2、配置172.18.77.101为默认主节点,其他为从节点。
3、开启vip-manager keepalived配置,配置VIP地址为 172.18.22.99。配置每台关联VIP的网卡为ens33。(网卡名字注意修改)
4、vip-manager的VIP是绑定PG主节点
5、此段配置在children 下增加,与默认的pg-meta同级别。
1 2 3 4 5 6 7 8 9 10
| pg-cu1: hosts: 172.18.77.101: { pg_seq: 1, pg_role: primary } 172.18.77.102: { pg_seq: 2, pg_role: replica } 172.18.77.103: { pg_seq: 3, pg_role: replica } vars: pg_cluster: pg-cu1 pg_vip_enabled: true pg_vip_address: 172.18.77.99 pg_vip_interface: ens33
|
增加PG数据库、用户、HBA配置。
1、增加zabbix、grafana 数据库,Zabbix 开启timescaledb扩展,并配置所属用户。并与pgbouncer同步创建。
2、增加zabbix、grafana 用户并配置密码、角色。并与pgbouncer同步创建。
3、配置用户的HBA规则,允许任意IP访问,并配置pgbouncer和HBA
4、pg_libs 配置PG加载的插件列表,这里加载了timescaledb插件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| pg-cu1: hosts: 172.18.77.101: { pg_seq: 1, pg_role: primary } 172.18.77.102: { pg_seq: 2, pg_role: replica } 172.18.77.103: { pg_seq: 3, pg_role: replica } vars: pg_cluster: pg-cu1 pg_databases: - name: zabbix pgbouncer: true extensions: - { name: timescaledb } owner: zabbix - name: grafana pgbouncer: true owner: grafana pg_users: - name: zabbix password: Passwd.zabbix pgbouncer: true roles: [dbrole_admin] comment: Zabbix - name: grafana password: pgbouncer: true roles: [dbrole_admin] comment: grafana pg_hba_rules: - { user: 'zabbix' ,db: all ,addr: 0.0.0.0/0 ,auth: pwd ,title: 'zabbix用户不限制登录'} - { user: 'grafana' ,db: all ,addr: 0.0.0.0/0 ,auth: pwd ,title: 'grafana用户不限制登录'} pgb_hba_rules: - { user: 'zabbix' ,db: all ,addr: 0.0.0.0/0 ,auth: pwd ,title: 'zabbix用户不限制登录'} - { user: 'grafana' ,db: all ,addr: 0.0.0.0/0 ,auth: pwd ,title: 'grafana用户不限制登录'} pg_libs: 'timescaledb, pg_stat_statements, auto_explain' pg_vip_enabled: true pg_vip_address: 172.18.77.99 pg_vip_interface: ens33
|
全部配置展示(仅参考) 用于Zabbix服务器的时序数据库
1、注意全局密码已经修改为PG-PWD-01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| all: children: infra: { hosts: { 172.18.77.33: { infra_seq: 1 } } } etcd: { hosts: { 172.18.77.33: { etcd_seq: 1 } }, vars: { etcd_cluster: etcd } } pg-meta: hosts: { 172.18.77.33: { pg_seq: 1, pg_role: primary } } vars: pg_cluster: pg-meta pg_databases: [ { name: meta ,baseline: cmdb.sql ,comment: pigsty meta database ,schemas: [ pigsty ] ,extensions: [{name: postgis, schema: public}] }] pg_users: - { name: dbuser_meta ,password: DBUser.Meta ,pgbouncer: true ,roles: [ dbrole_admin ] ,comment: pigsty admin user } - { name: dbuser_view ,password: DBUser.Viewer ,pgbouncer: true ,roles: [ dbrole_readonly ] ,comment: read-only viewer for meta database } pg_libs: 'pg_stat_statements, auto_explain' node_crontab: [ '00 03 * * * postgres /pg/bin/pg-backup full' ] bj-zjy-pg-cu1: hosts: 172.18.77.101: { pg_seq: 1, pg_role: primary } 172.18.77.102: { pg_seq: 2, pg_role: replica } 172.18.77.103: { pg_seq: 3, pg_role: replica } vars: pg_cluster: pg-cu1 pg_databases: - name: zabbix pgbouncer: true extensions: - { name: timescaledb } owner: zabbix - name: grafana pgbouncer: true owner: grafana pg_users: - name: zabbix password: Passwd.Zabbix pgbouncer: true roles: [dbrole_admin] comment: Zabbix - name: grafana password: Passwd.grafana pgbouncer: true roles: [dbrole_admin] comment: grafana pg_hba_rules: - { user: 'zabbix' ,db: all ,addr: 0.0.0.0/0 ,auth: pwd ,title: 'zabbix用户不限制登录'} - { user: 'grafana' ,db: all ,addr: 0.0.0.0/0 ,auth: pwd ,title: 'grafana用户不限制登录'} pgb_hba_rules: - { user: 'zabbix' ,db: all ,addr: 0.0.0.0/0 ,auth: pwd ,title: 'zabbix用户不限制登录'} - { user: 'grafana' ,db: all ,addr: 0.0.0.0/0 ,auth: pwd ,title: 'grafana用户不限制登录'} pg_libs: 'timescaledb, pg_stat_statements, auto_explain' vip_enabled: true vip_address: 172.18.77.99 vip_vrid: 35 vip_role: backup vip_preempt: true vip_interface: ens33 vip_dns_suffix: '' vip_exporter_port: 9650 vars: version: v2.5.1 admin_ip: 172.18.77.33 region: china infra_portal: home : { domain: h.pigsty } grafana : { domain: g.pigsty ,endpoint: "${admin_ip}:3000" , websocket: true } prometheus : { domain: p.pigsty ,endpoint: "${admin_ip}:9090" } alertmanager : { domain: a.pigsty ,endpoint: "${admin_ip}:9093" } blackbox : { endpoint: "${admin_ip}:9115" } loki : { endpoint: "${admin_ip}:3100" } repo_remove: true node_repo_remove: true grafana_admin_password: PG-PWD-01 pg_admin_password: PG-PWD-01 pg_monitor_password: PG-PWD-01 pg_replication_password: PG-PWD-01 patroni_password: PG-PWD-01 haproxy_admin_password: PG-PWD-01 ...
|
配置元节点密钥免密登录主机节点
Pigsty 会在元节点自动生成一对公私钥,将其拷贝到所有主机节点。
1 2 3 4
| ssh-copy-id 172.18.77.101 # 执行后输入yes,然后再手动输入主机节点的登录密码即可。 ssh 172.18.77.101 # 确认可直接登录即可,所有主机节点都要操作。
|
将集群节点纳入Pigsty 管理并部署PG集群
节点纳入管理
PG集群初始化部署(注意:会根据CPU内存等配置自动优化PG参数,建议提前固定好虚拟机配置)
PG集群架构图
硬件故障由 patroni、etcd 和 Haproxy 提供的自愈高可用架构来兜底,在主库故障的情况下,默认会在 30 秒内执行自动故障转移(Failover)。 客户端无需修改配置重启应用:Haproxy 利用 patroni 健康检查进行流量分发,读写请求会自动分发到新的集群主库中,并避免脑裂的问题。 这一过程十分丝滑,例如在从库故障,或主动切换(switchover)的情况下,客户端只有一瞬间的有感知查询闪断。
软件故障、人为错误和 数据中心级灾难由 pgbackrest 和可选的 MinIO 集群来兜底。这为您提供了本地/云端的 PITR 能力,并在数据中心爆炸的情况下提供了跨地理区域复制,与异地容灾功能。
管理和使用
默认用户
Pigsty 也有四个默认用户(系统用户):
超级用户 (postgres),集群的所有者和创建者,与操作系统 dbsu 名称相同。
复制用户 (replicator),用于主-从复制的系统用户。
监控用户 (dbuser_monitor),用于监控数据库和连接池指标的用户。
管理用户 (dbuser_dba),执行日常操作和数据库更改的管理员用户。
这4个默认用户的用户名/密码通过4对专用参数进行定义,并在很多地方引用:
pg_dbsu:操作系统 dbsu 名称,默认为 postgres,最好不要更改它
pg_dbsu_password:dbsu 密码,默认为空字符串意味着不设置 dbsu 密码,最好不要设置。
pg_replication_username:postgres 复制用户名,默认为 replicator
pg_replication_password:postgres 复制密码,默认为 DBUser.Replicator
pg_admin_username:postgres 管理员用户名,默认为 dbuser_dba
pg_admin_password:postgres 管理员密码的明文,默认为 DBUser.DBA
pg_monitor_username:postgres 监控用户名,默认为 dbuser_monitor
pg_monitor_password:postgres 监控密码,默认为 DBUser.Monitor
在生产部署中记得更改这些密码,不要使用默认值!
在部署前,可以在pigsty.yml 里面修改。
配置用户
1
| bin/pgsql-user <cls> <username> # pgsql-user.yml -l <cls> -e username=<username>
|
配置HBA
1 2
| bin/pgsql-hba <cls> # 重新加载指定集群 `<cls>` 的 hba 规则 bin/pgsql-hba <cls> ip1 ip2... # 重新加载特定实例的 hba 规则
|
创建数据库
1
| bin/pgsql-db <cls> <dbname> # pgsql-db.yml -l <cls> -e dbname=<dbname>
|
数据库集群访问端口说明
组件 |
端口 |
描述 |
状态 |
备注 |
Postgres |
5432 |
Pigsty CMDB |
默认启用 |
|
Pgbouncer |
6432 |
Pgbouncer 连接池服务 |
默认启用 |
|
Patroni |
8008 |
Patroni 高可用组件 |
默认启用 |
|
Haproxy Primary |
5433 |
主连接池:读/写服务 |
默认启用 |
|
Haproxy Replica |
5434 |
副本连接池:只读服务 |
默认启用 |
|
Haproxy Default |
5436 |
主直连服务* |
默认启用 |
|
Haproxy Offline |
5438 |
离线直连:离线读服务 |
默认启用 |
|
Haproxy service |
543x |
PostgreSQL 定制服务 |
按需定制 |
|
Haproxy Admin |
9101 |
监控指标和流量管理 |
默认启用 |
|
PG Exporter |
9630 |
PG 监控指标导出器 |
默认启用 |
|
PGBouncer Exporter |
9631 |
PGBouncer 监控指标导出器 |
默认启用 |
|
Node Exporter |
9100 |
节点监控指标导出器 |
默认启用 |
|
Promtail |
9080 |
收集数据库组件与主机日志 |
默认启用 |
|
vip-manager |
- |
将 VIP 绑定到主节点 |
按需启用 |
|
Docker Daemon |
9323 |
Docker 守护进程 |
按需启用 |
|
keepalived |
- |
为整个集群绑定 L2 VIP |
按需启用 |
|
Keepalived Exporter |
9650 |
Keepalived 指标导出器 |
按需启用 |
|
PS:个人推荐使用 5436端口,并通过VIP地址访问数据库集群。(绕过pgbouncer)
使用pgbouncer 则可以使用5433端口,并通过VIP地址访问集群。
默认管理员账号为dbuser_dba。