系统架构
Pigsty的架构在部署上分为两个部分:
Pigsty的部署对象也可以分为两种:
- 元节点(Meta):部署基础设施,执行控制逻辑,每个Pigsty部署至少需要一个元节点,可复用为普通节点。
- 数据库节点(Node):用于部署数据库集群/实例,Pigsty采用节点与数据库实例一一对应的独占式部署。
以Pigsty附带的四节点沙箱环境为例,Pigsty中涉及的主要组件及其分布如下图所示:
图:Pigsty沙箱中包含的节点与组件
上图中 meta
即为元节点,部署有额外的基础设施组件。 node-1
,node-2
,node-3
为普通数据库节点,部署有数据库集群pg-test
。
meta
被复用为普通数据库节点,部署有单主数据库集群pg-meta
。
基础设施
每一套 环境(Environment) 中,都需要有一些基础设施,才能使整个系统正常工作。
基础设施通常由专业的运维团队或云厂商负责,但Pigsty作为一个开箱即用的产品解决方案,将基本的基础设施集成至供给方案中。
包括:
- 域名基础设施:Dnsmasq
- 时间基础设施:NTP
- 监控基础设施:Prometheus
- 报警基础设施:Altermanager
- 可视化基础设施:Grafana
- 本地源基础设施:Yum/Nginx
- 分布式配置存储:etcd/consul
基础设施部署于 元节点 上。一套环境中包含一个或多个元节点,用于基础设施部署。
除了**分布式配置存储(DCS)**之外,所有基础设施组件都采用副本式部署;如果有多个元节点,元节点上的DCS(etcd/consul)会共同作为DCS Server。
元节点
在每套环境中,Pigsty最少需要一个元节点,该节点将作为整个环境的控制中心。
元节点负责各种管理工作:保存状态,管理配置,发起任务,收集指标,等等。
整个环境的基础设施组件,Nginx,Grafana,Prometheus,Alertmanager,NTP,DNS Nameserver,DCS都将部署在元节点上。
同时,元节点也将用于部署元数据库 (Consul 或 Etcd),用户也可以使用已有的外部DCS集群。
如果将DCS部署至元节点上,建议在生产环境使用3个元节点,以充分保证DCS服务的可用性。
DCS外的基础设施组件都将以对等副本的方式部署在所有元节点上。
元节点的数量要求最少1个,推荐3个,建议不超过5个。
元节点上运行的服务如下所示:
组件 | 端口 | 默认域名 | 说明 |
---|---|---|---|
Grafana | 3000 | g.pigsty |
Pigsty监控系统图形界面 |
Prometheus | 9090 | p.pigsty |
监控时序数据库 |
AlterManager | 9093 | a.pigsty |
报警聚合管理组件 |
Consul | 8500 | c.pigsty |
分布式配置管理,服务发现 |
Consul DNS | 8600 | - | Consul提供的DNS服务 |
Nginx | 80 | pigsty |
所有服务的入口代理 |
Yum Repo | 80 | yum.pigsty |
本地Yum源 |
Haproxy Index | 80 | h.pigsty |
所有Haproxy管理界面的访问代理 |
NTP | 123 | n.pigsty |
环境统一使用的NTP时间服务器 |
Dnsmasq | 53 | - | 环境统一使用的DNS域名解析服务器 |
数据库集群
生产环境的数据库以集群为单位进行组织,集群是一个由主从复制所关联的一组数据库实例所构成的逻辑实体。每个数据库集群是一个自组织的业务服务单元,由至少一个数据库实例组成。
集群是基本的业务服务单元,下图展示了沙箱环境中的复制拓扑。其中pg-meta-1
单独构成一个数据库集群pg-meta
,而pg-test-1
,pg-test-2
,pg-test-3
共同构成另一个逻辑集群pg-test
。
pg-meta-1
(primary)
pg-test-1 -------------> pg-test-2
(primary) | (replica)
|
^-------> pg-test-3
(replica)
下图从数据库集群的视角重新排列pg-test
集群中相关组件的位置。
图:从数据库集群的逻辑视角看架构
Pigsty是数据库供给方案,可以按需创建高可用数据库集群。只要集群中有任意实例存活,集群就可以对外提供完整的读写服务与只读服务。Pigsty可以自动进行故障切换,业务方只读流量不受影响;读写流量的影响视具体配置与负载,通常在几秒到几十秒的范围。
在Pigsty中,每个“数据库实例”在使用上是幂等的,采用类似NodePort的方式对外暴露服务。默认情况下,访问任意实例的5433端口即可访问主库,访问任意实例的5434端口即可访问从库。用户也可以灵活地同时使用不同的方式访问数据库。
数据库节点
数据库节点负责运行数据库实例,数据库实例采用独占式部署,一个节点上有且仅有一个数据库实例。
一个典型的数据库节点上运行的服务如下所示:
组件 | 端口 | 说明 |
---|---|---|
Postgres | 5432 | Postgres数据库服务 |
Pgbouncer | 6432 | Pgbouncer连接池服务 |
Patroni | 8008 | Patroni高可用组件 |
Consul | 8500 | 分布式配置管理,服务发现组件Consul的本地Agent |
Haproxy Primary | 5433 | 集群读写服务(主库)代理 |
Haproxy Replica | 5434 | 集群只读服务(从库)代理 |
Haproxy Admin | 9101 | Haproxy 监控指标与管理页面 |
PG Exporter | 9630 | Postgres监控指标导出器 |
PGBouncer Exporter | 9631 | Pgbouncer监控指标导出器 |
Node Exporter | 9100 | 机器节点监控指标导出器 |
Consul DNS | 8600 | Consul提供的DNS服务 |
vip-manager | x | 将VIP绑定至集群主库上 |