Pigsty v1.5 现已正式发布。此版本包含完整的 Docker 支持,无数使用数据库的软件均可开箱即用。其他改进包括:基础设施自我监控、更好的冷备份支持、兼容 Redis 与 GP 的新 CMDB、ETCD 作为高可用 DCS、更好的日志收集与呈现。Github Star 突破 500。
v1.5 亮点
- 完善的Docker支持:在管理节点上默认启用并提供诸多开箱即用的软件模板:gitea,bytebase, pgadmin, pgweb, postgrest, minio等。
- 基础设施自我监控:Nginx, ETCD, Consul, Prometheus, Grafana, Loki 自我监控
- CMDB升级:兼容性改善,支持Redis集群/Greenplum集群元数据,配置文件可视化。
- 服务发现改进:可以使用Consul自动发现所有待监控对象,并纳入Prometheus中。
- 更好的冷备份支持:默认定时备份任务,添加
pg_probackup
备份工具,一键创建延时从库。 - ETCD现在可以用作PostgreSQL/Patroni的DCS服务,作为Consul的备选项。
- Redis剧本/角色改善:现在允许对单个Redis实例,而非整个Redis节点进行初始化与移除。
Docker 支持
Pigsty v1.5中最激动人心的特性莫过于Docker(以及k8s)支持,无数软件与工具都可以通过Docker的方式开箱即用:开箱即用的数据库 + 开箱即用的应用 = 开箱即用的软件解决方案。
很多软件都需要用到数据库,但数据库放入容器中仍然是一个充满争议的问题,基于Docker镜像的玩具数据库仍与生产级的数据库差着十万八千里。Pigsty可以将两者的优势融合:有状态的数据库使用Pigsty管理,运行于标准的物理机或虚拟机上,例如PGSQL与Redis;而无状态的应用使用Docker运行,这些应用的状态存储在Pigsty托管的外部数据库中。
在Pigsty v1.4.1中,Docker作为一种实验特性被加入,在1.5中,Docker将作为Pigsty默认的组件,在元节点上默认启用。普通的节点默认关闭,但您可以通过一个配置项,在所有节点上配置并启动Docker。
应用生态
Docker很棒,但重要的不是Docker或者Kubernetes本身,而是Docker所代表的巨大应用生态!
Pigsty挑选了一些常用软件,特别是那些使用PostgreSQL与Redis的软件,制作了一键拉起的教程与快捷方式,并提供了可以离线使用自动加载的镜像软件包 docker.tgz
。部署您自己的软件,从未如此简单!
代码托管平台
例如,Github被墙,而墙内的Gitee最近又搞了中国特色的开源审批制,让很多人都产生了自建Git代码托管服务的需求。如果您想要启动一个私有的代码托管服务,可以使用以下命令一键拉起 Gitea:
cd ~/pigsty~app/gitea; make up
该命令将使用以下的Docker Compose配置文件拉起Gitea镜像,并使用外部Pigsty默认的CMDB:pg-meta.gitea
作为自己的元数据存储。访问配置文件指定的域名或端口,即可访问你自己的代码托管服务!
version: "3" services: gitea: image: gitea/gitea container_name: gitea restart: always environment: DB_TYPE: postgres DB_HOST: 10.10.10.10:5432 DB_NAME: meta DB_USER: dbuser_meta DB_PASSWD: DBUser.Meta USER_UID: 1000 USER_GID: 1000 HTTP_PORT: 8889 volumes: - /data/gitea:/var/lib/gitea - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - "8889:8889" # web - "222:2222"# ssh
拉起的Gitea代码托管服务,试试从这里,而不是Github克隆Pigsty的源代码:
git clone http://git.pigsty.cc/vonng/pigsty
当然,你也可以使用同样的方式拉起其他的代码托管平台,例如Gogs或Gitlab。公开Demo地址:http://git.pigsty.cc
数据库管控平台
PgAdmin4是老牌的PostgreSQL管控工具,提供了很多实用有趣的功能,虽说对专家相当鸡肋,但对于新手还是很好用的一款管控软件。Pigsty提供了最新的6.9版本Pgadmin4支持,只需一行命令,即可启动镜像,并自动加载 Pigsty 中所有托管数据库实例列表。
cd ~/pigsty/app/pgadmin; make up ; make conf
你可以直接访问 http://adm.pigsty.cc ,用户名 [email protected] ,密码 pigsty,看看PGAdmin4的功能。
模式变更工具
Bytebase是一款为PostgreSQL设计的模式变更管理工具,采用Git工作流,工单-审批的方式来对数据库模式进行版本控制。而Bytebase本身的元数据也使用PostgreSQL存储。所以在Pigsty v1.5中集成了Bytebase的支持,使用以下命令一键拉起Bytebase:
cd ~/pigsty/app/bytebase; make up;
你可以直接访问 http://ddl.pigsty.cc ,用户名 [email protected] ,密码 pigsty,自行尝试一下ByteBase的功能。
网页客户端工具
有时候,用户想使用个人账号从生产数据库中小批量的查询一些数据,这时候基于浏览器的PostgreSQL客户端就会很好用。PGWEB就是这样的一个组件,你可以将其部署在元节点或专用堡垒机上,并设置特定的HBA规则来允许个人用户查询生产只读实例。使用以下命令拉起PGWEB镜像:
cd ~/pigsty/app/pgweb; make up;
你可以直接访问 http://cli.pigsty.cc ,并使用以下连接串连接至测试数据库:
postgres://test:[email protected]:5432/test?sslmode=disable
对象存储Minio
对象存储是云厂商提供的基础服务,在私有部署条件下,可以使用Minio快速搭建您自己的对象存储。他可以用于存储文档,图像,视频,备份,自动进行冗余备份与容灾。并对外提供标准的,S3兼容的API。
cd ~/pigsty/app/minio; make up;
你可以直接访问 http://sss.pigsty.cc ,用户名 admin ,密码 pigsty.minio,自行尝试一下Minio控制台的功能。
或者,你也可以试试,直接从Minio下载最新的Pigsty v1.5 源代码:
http://sss.pigsty.cc/pigsty/v1.5.0/pigsty.tgz
(非常不推荐从这里下载,这是个公开的Bucket,试试就行了)
在Minio的基础上,你可以进一步使用JuiceFS,将对象存储提供的大规模分布式对象存储转换为文件系统,供其他服务使用。
数据分析环境:Jupyter
Pigsty提供了一个趁手的的数据分析工具:Jupyter Lab,你可以基于此,使用Python与SQL进行组合数据处理与分析。Jupyter Lab默认并不是通过Docker启动的,而是由元节点受限的操作系统用户直接运行,以便于与数据库交互。
Demo网址,http://lab.pigsty.cc/ , 密码 pigsty ,使用 infra-jupyter.yml 在管理节点裸机上启用Jupyter Notebook。
数据库模式报表SchemaSPY
此外,还有一些趁手的工具也可以使用Docker或包装脚本,方便地使用。例如,当您想生成某一个数据库模式的详情报表时,不妨试试 SchemaSPY,例如,以下命令将生成Pigsty元数据库的模式报表
bin/schemaspy 10.10.10.10 meta pigsty
公开Demo地址:http://home.pigsty.cc/schema/meta/pigsty/
数据库日志分析报表
当你想查阅数据库日志的汇总摘要信息时,可以试试Pgbadger,以下命令将生成某节点PG实例日志的汇总摘要:
bin/pglog-summary 10.10.10.10
公开Demo地址,http://home.pigsty.cc/report
其他应用
此外,还有很多知名的软件应用都可以使用Pigsty + Docker一键拉起,后续将不断补充更多的教程与模板。
- Gitlab:使用PG的开源代码托管平台。
- Habour:使用PG的开源镜像仓库
- Jira:使用PG的开源项目管理平台。
- Confluence:使用PG的开源知识托管平台。
- Odoo:使用PG的开源ERP
- Mastodon:基于PG的社交网络
- Discourse:基于PG与Redis的开源论坛
- KeyCloak:开源SSO单点登录解决方案
更好的冷备份
数据故障大体可以分为两类:硬件故障/资源不足(坏盘/宕机),软件缺陷/人为错误(删库/删表)。基于主从复制的物理复制用于应对前者,延迟从库与冷备份通常用于应对后者。因为误删数据的操作会立刻被复制到从库上执行,所以热备份与温备份都无法解决诸如 DROP DATABASE,DROP TABLE这样的错误,需要使用冷备份或延迟从库。
在Pigsty 1.5中,对冷备份机制进行了改善:添加了定时任务机制每天制作全量冷备份(以前是给用户脚本自己做,现在想想还是送佛送到西比较好);改善了延迟从库的创建机制,只需声明即可自动创建;对于专家用户,还提供了pg_probackup
作为备份解决方案。此外,内置的minio Docker镜像将为后续的开箱即用的异地灾备中心奠定基础。
定时任务
Pigsty v1.5 支持了为节点配置定时任务,包括追加与覆盖 /etc/crontab
两种模式。你可以将制作基础物理冷备份,日志分析,模式转储,垃圾回收,分析统计任务以统一的,声明式的方式管理起来。例如,Pigsty Demo的管理节点上就配置有以下的定时任务。
其中最重要的就是第一条,默认在每天凌晨1点制作一个全量备份,加上Pigsty默认自带的最近一天WAL日志归档,您可以将数据库恢复至1天内的任意状态,为软件缺陷,人为故障导致的删库删表提供了有力的兜底。
延迟从库
在Pigsty v1.5中,创建延迟从库不再需要手工执行 patronictl edit-config 调整集群配置了,您只需像下面这样声明,即可为集群创建一个延迟从库(集群)。
关于Pigsty对于冷备份的支持,可以参考前一篇文章:云RDS:从删库到跑路
CMDB兼容性改进
Pigsty有一个可选的CMDB,允许您用元节点上的默认PostgreSQL数据库存储配置,而不是默认的配置文件 pigsty.yml
。
Pigsty CMDB最早于0.8版本引入,当时只是为了支持PostgreSQL而设计,当Pigsty开始支持Redis、GPSQL,以及更多种类的数据库时,就开始显得不合时宜了。因此在Pigsty v1.5中, 对CMDB进行了重新的设计。
你只要使用bin/inventory_load
即可将当前使用的配置文件加载入CMDB中,使用bin/inventory_cmdb
切换为CMDB模式。使用CMDB时,您可以直接通过Grafana的CMDB Overview面板,查阅可视化的配置清单:
你可以从CMDB Overview中看到PGSQL,REDIS,以及Greenplum/MatrixDB集群的成员信息。
你可以直接通过SQL来调整配置,但也可以通过另一种方式:即由PostgREST暴露的API来调整配置,例如创建新的集群,扩容缩容等。
PostgREST是一个自动根据 PostgreSQL 数据库模式生成 REST API的二进制组件。打包在Pigsty v1.5自带的Docker镜像包中。
例如,以下命令将使用docker拉起 postgrest ,监听本地 8884 端口,使用默认管理员用户,暴露Pigsty CMDB模式。
cd ~/pigsty/app/postgrest; make up;
更有趣的是,它还可以通过Swagger OpenAPI Spec自动生成API的定义,并自动使用 Swagger Editor暴露API文档,生成不同编程语言的客户端存根。
PostgREST不仅仅可以用来暴露CMDB的增删改查接口。如果你已经有了一个设计得当的数据库模式,那么使用PostgREST可以立即构建出一个后端REST API服务,无需手工编写繁琐重复的增删改查逻辑,复杂的逻辑可以通过存储过程对外暴露。
PostgREST暴露的API提供了简单的JWT认证功能,虽然大多数时候已然足够,但如果您需要更强大的API支持,可以考虑API网关Kong。它可以让任何已有API变成功能完备的接口服务。它可以为API启用多种认证签名机制,自动记录日志,设置Trace,进行限流与容端。Kong基于Nginx + Lua (OpenResty)实现,使用PostgreSQL与Redis存储元数据,使用以下命令,即可在Pigsty中启用Kong:
cd ~/pigsty/app/kong; make up;
基础设施监控
在Pigsty v1.5中,基础设施本身的监控进行了重大改进:INFRA,和NODES,PGSQL与REDIS现在采用一样的管理模式:基础设施通过infra_register
角色完成自身的服务注册,将自己添加到Prometheus的监控对象中。Grafana中相应添加了监控面板。
Pigsty v1.5的Home监控,基础设施作为嫩绿色的组件,与NODES,REDIS,PGSQL采用同种方式列入Instance中。此外,Infra服务也会注册至Service Registry(Consul),并可通过服务发现自动管理。
INFRA Overview 提供了所有基础设施组件基本状态与快速导航
Prometheus Overview:时序数据库自监控
Grafana Overview:监控面板自监控
Loki Overview:日志收集组件自监控
ETCD作为DCS
在Pigsty v1.5中,你可以使用ETCD作为Consul的替代,用于PostgreSQL数据库高可用所需的DCS。
与Consul相比,ETCD少了服务发现,内建DNS,健康检查,以及开箱即用的UI,但是ETCD无需Agent部署简单,依托K8s生态的流行度更高,比Consul少一个失效点,更好的指标可观测性。只需指定 pg_dcs_type: etcd
,即可使用ETCD作为DCS。此外,您可以同时使用Consul与Etcd,两者并行不悖:例如使用ETCD作为DCS,而使用Consul进行服务发现。
Pigsty 1.5针对ETCD与Consul进行了开箱即用的监控面板:DCS Overview
目前ETCD作为DCS属于最小可用功能实现,并没有添加CA证书与TLS支持,将在后续版本安全性加固专项中补充。
更好的日志收集与呈现
在Pigsty v1.5中,默认为每一个上游服务启用单独的访问日志,所有字段均由Loki解析,可以直接进行分析。如果您有网站挂在Pigsty上,可以立刻进行交互式日志流量分析与统计。
NGINX Overview:展示Nginx指标与日志
其他改进
监控系统
监控面板
- CMDB Overview:可视化Pigsty CMDB Inventory。
- DCS Overview:查阅Consul与ETCD集群的监控指标。
- Nginx Overview:查阅Pigsty Web访问指标与访问日志。
- Grafana Overview:Grafana自我监控
- Prometheus Overview:Prometheus自我监控
- INFRA Dashboard进行重制,反映基础设施整体状态
监控架构
- 现在允许使用 Consul 进行服务发现(当所有服务注册至Consul时)
- 现在所有的Infra组件会启用自我监控,并通过
infra_register
角色注册至Prometheus与Consul中。 - 指标收集器 pg_exporter 更新至 v0.5.0,添加新功能,
scale
与default
,允许为指标指定一个倍乘因子,以及指定默认值。 pg_bgwriter
,pg_wal
,pg_query
,pg_db
,pgbouncer_stat
关于时间的指标,单位由默认的毫秒或微秒统一缩放至秒。pg_table
中的相关计数器指标,现在配置有默认值0
,替代原有的NaN
。pg_class
指标收集器默认移除,相关指标添加至pg_table
与pg_index
收集器中。pg_table_size
指标收集器现在默认启用,默认设置有300秒的缓存时间。
部署方案
- 新增可选软件包
docker.tgz
,带有常用应用镜像:Pgadmin, Pgweb, Postgrest, ByteBase, Kong, Minio等。 - 新增角色ETCD,可以在DCS Servers指定的节点上自动部署ETCD服务,并自动纳入监控。
- 允许通过
pg_dcs_type
指定PG高可用使用的DCS服务,Consul(默认),ETCD(备选) - 允许通过
node_crontab
参数,为节点配置定时任务,例如数据库备份、VACUUM,统计收集等。 - 新增了
pg_checksum
选项,启用时,数据库集群将启用数据校验和(此前只有crit
模板默认启用) - 新增了
pg_delay
选项,当实例为Standby Cluster Leader时,此参数可以用于配置一个延迟从库 - 新增了软件包
pg_probackup
,默认角色replicator
现在默认赋予了备份相关函数所需的权限。 - Redis部署现在拆分为两个部分:Redis节点与Redis实例,通过
redis_port
参数可以精确控制一个具体实例。 - Loki 与 Promtail 现在使用
frpm
制作的 RPM软件包进行安装。 - DCS3配置模板现在使用一个3节点的
pg-meta
集群,与一个单节点的延迟从库。
软件升级
- 升级 PostgreSQL 至 14.3
- 升级 Redis 至 6.2.7
- 升级 PG Exporter 至 0.5.0
- 升级 Consul 至 1.12.0
- 升级 vip-manager 至 v1.0.2
- 升级 Grafana 至 v8.5.2
- 升级 Loki & Promtail 至 v2.5.0,使用frpm打包。
问题修复
- 修复了Loki 与 Promtail 默认配置文件名的问题
- 修复了Loki 与 Promtail 环境变量无法正确展开的问题
- 对英文文档进行了一次完整的翻译与修缮,文档依赖的JS资源现在直接从本地获取,无需互联网访问。
API变化
New Variable
node_data_dir
: major data mount path, will be created if not exist.node_crontab_overwrite
: overwrite/etc/crontab
instead of appendnode_crontab
: node crontab to be appended or overwrittennameserver_enabled
: enable nameserver on this meta node?prometheus_enabled
: enable Prometheus on this meta node?grafana_enabled
: enable grafana on this meta node?loki_enabled
: enable Loki on this meta node?docker_enable
: enable docker on this node?consul_enable
: enable consul server/agent?etcd_enable
: enable etcd server/clients?pg_checksum
: enable pg cluster data-checksum?pg_delay
: recovery min apply delay for standby leader
Reforge
Now *_clean
are boolean flags to clean up existing instances during init.
Now *_safeguard
are boolean flags to avoid purging running instances when executing any playbook.
pg_exists_action
->pg_clean
pg_disable_purge
->pg_safeguard
dcs_exists_action
->dcs_clean
dcs_disable_purge
->dcs_safeguard
Rename
node_ntp_config
->node_ntp_enabled
node_admin_setup
->node_admin_enabled
node_admin_pks
->node_admin_pk_list
node_dns_hosts
->node_etc_hosts_default
node_dns_hosts_extra
->node_etc_hosts
node_dns_server
->node_dns_method
node_local_repo_url
->node_repo_local_urls
node_packages
->node_packages_default
node_extra_packages
->node_packages
node_packages_meta
->node_packages_meta
node_meta_pip_install
->node_packages_meta_pip
node_sysctl_params
->node_tune_params
app_list
->nginx_indexes
grafana_plugin
->grafana_plugin_method
grafana_cache
->grafana_plugin_cache
grafana_plugins
->grafana_plugin_list
grafana_git_plugin_git
->grafana_plugin_git
haproxy_admin_auth_enabled
->haproxy_auth_enabled
pg_shared_libraries
->pg_libs
dcs_type
->pg_dcs_type
后续计划
后续有几件工作有着较高优先级:
- 基于 Minio 与 JuiceFS 的对象存储与备份基础设施
- 基于
pg_probackup
的进阶冷备份管理方案 - 自签名百年证书,针对ETCD与各路HTTP API可选启用
- Pigsty精简版:基于DockerCompose的单机镜像(有监控无高可用,docker一键拉起)
- Pigsty API,使用CMDB,PostgREST与Kong共同打造管控接口
- Pigsty CLI,使用Pigsty API的二进制命令行工具