Pigsty v1.5 发布与新特性

Pigsty v1.5 现已正式发布。此版本包含完整的 Docker 支持,无数使用数据库的软件均可开箱即用。其他改进包括:基础设施自我监控、更好的冷备份支持、兼容 Redis 与 GP 的新 CMD

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,添加新功能,scaledefault,允许为指标指定一个倍乘因子,以及指定默认值。
  • pg_bgwriter, pg_wal, pg_query, pg_db, pgbouncer_stat 关于时间的指标,单位由默认的毫秒或微秒统一缩放至秒。
  • pg_table 中的相关计数器指标,现在配置有默认值 0,替代原有的NaN
  • pg_class指标收集器默认移除,相关指标添加至 pg_tablepg_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 append
  • node_crontab: node crontab to be appended or overwritten
  • nameserver_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

后续计划

后续有几件工作有着较高优先级:

  1. 基于 Minio 与 JuiceFS 的对象存储与备份基础设施
  2. 基于 pg_probackup 的进阶冷备份管理方案
  3. 自签名百年证书,针对ETCD与各路HTTP API可选启用
  4. Pigsty精简版:基于DockerCompose的单机镜像(有监控无高可用,docker一键拉起)
  5. Pigsty API,使用CMDB,PostgREST与Kong共同打造管控接口
  6. Pigsty CLI,使用Pigsty API的二进制命令行工具

关于作者: qwephp

.

为您推荐