模块:NODE

配置目标服务器,纳管主机节点,并将其调整至描述的状态。也包括节点上的 VIP,HAProxy 以及监控组件。

纳管节点,将其调整至所需状态,并进行监控。 配置 | 管理 | 剧本 | 监控 | 参数


概念

节点是硬件资源的抽象,它可以是裸机、虚拟机、容器或者是 k8s pods:只要装着操作系统,可以使用 CPU/内存/磁盘/网络 资源就行。

在 Pigsty 中存在不同类型的节点,它们的区别主要在于安装了不同的模块

单机安装时,当前节点会被同时视作为管理节点、基础设施节点、PGSQL 节点,当然,它也是一个普通的节点。


普通节点

你可以使用 Pigsty 管理节点,并在其上安装模块。node.yml 剧本将调整节点至所需状态。以下服务默认会被添加到所有节点:

组件 端口 描述 状态
Node Exporter 9100 节点监控指标导出器 默认启用
HAProxy Admin 9101 HAProxy 管理页面 默认启用
Promtail 9080 日志收集代理 默认启用
Docker Daemon 9323 启用容器支持 按需启用
Keepalived - 负责管理主机集群 L2 VIP 按需启用
Keepalived Exporter 9650 负责监控 Keepalived 状态 按需启用

此外,您可以为节点选装 Docker 与 Keepalived(及其监控 keepalived exporter),这两个组件默认不启用。


ADMIN节点

在一套 Pigsty 部署中会有且只有一个管理节点,由 admin_ip 指定。在单机安装的配置过程中,它会被被设置为该机器的首要IP地址。

该节点将具有对所有其他节点的 ssh/sudo 访问权限:管理节点的安全至关重要,请确保它的访问受到严格控制。

通常管理节点与基础设施节点(infra节点)重合。如果有多个基础设施节点,管理节点通常是所有 infra 节点中的第一个,其他的作为管理节点的备份。


INFRA节点

一套 Pigsty 部署可能有一个或多个 基础设施节点(INFRA节点),在大型生产环境中可能会有 2 ~ 3 个。

配置清单中的 infra 分组列出并指定了哪些节点是INFRA节点,这些节点会安装 INFRA 模块(DNS、Nginx、Prometheus、Grafana 等…)。

管理节点通常是是INFRA节点分组中的第一台,其他INFRA节点可以被用作"备用"的管理节点。

组件 端口 域名 描述
Nginx 80 h.pigsty Web服务门户(也用作yum/atp仓库)
AlertManager 9093 a.pigsty 告警聚合分发
Prometheus 9090 p.pigsty 时间序列数据库(收存监控指标)
Grafana 3000 g.pigsty 可视化平台
Loki 3100 - 日志收集服务器
PushGateway 9091 - 接受一次性的任务指标
BlackboxExporter 9115 - 黑盒监控探测
DNSMASQ 53 - DNS 服务器
Chronyd 123 - NTP 时间服务器
PostgreSQL 5432 - Pigsty CMDB 和默认数据库
Ansible - - 运行剧本

PGSQL节点

安装了 PGSQL 模块的节点被称为 PGSQL 节点。节点和 PostgreSQL 实例是1:1部署的。

在这种情况下,PGSQL节点可以从相应的 PostgreSQL 实例上借用身份:node_id_from_pg 参数会控制这一点。

组件 端口 描述 状态
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 指标导出器 按需启用

配置

Pigsty使用IP地址作为节点的唯一身份标识,该IP地址应当是数据库实例监听并对外提供服务的内网IP地址

node-test:
  hosts:
    10.10.10.11: { nodename: node-test-1 }
    10.10.10.12: { nodename: node-test-2 }
    10.10.10.13: { nodename: node-test-3 }
  vars:
    node_cluster: node-test

该IP地址必须是数据库实例监听并对外提供服务的IP地址,但不宜使用公网IP地址。尽管如此,用户并不一定非要通过该IP地址连接至该数据库。 例如,通过SSH隧道或跳板机中转的方式间接操作管理目标节点也是可行的。 但在标识数据库节点时,首要IPv4地址依然是节点的核心标识符。这一点非常重要,用户应当在配置时保证这一点。 IP地址即配置清单中主机的inventory_hostname ,体现为<cluster>.hosts对象中的key。除此之外,每个节点还有两个额外的 身份参数

名称 类型 层级 必要性 说明
inventory_hostname ip - 必选 节点IP地址
nodename string I 可选 节点名称
node_cluster string C 可选 节点集群名称

nodenamenode_cluster 两个参数是可选的,如果不提供,会使用节点现有的主机名,和固定值 nodes 作为默认值。 在 Pigsty 的监控系统中,这两者将会被用作节点的 集群标识cls) 与 实例标识ins) 。

对于 PGSQL节点 来说,因为Pigsty默认采用PG:节点独占1:1部署,因此可以通过 node_id_from_pg 参数, 将 PostgreSQL 实例的身份参数( pg_clusterpg_seq) 借用至节点的inscls标签上,从而让数据库与节点的监控指标拥有相同的标签,便于交叉分析。

#nodename:                # [实例] # 节点实例标识,如缺失则使用现有主机名,可选,无默认值
node_cluster: nodes       # [集群] # 节点集群标识,如缺失则使用默认值'nodes',可选
nodename_overwrite: true          # 用 nodename 覆盖节点的主机名吗?
nodename_exchange: false          # 在剧本主机之间交换 nodename 吗?
node_id_from_pg: true             # 如果可行,是否借用 postgres 身份作为节点身份?

您还可以为主机集群配置丰富的功能参数,例如,使用节点集群上的 HAProxy 对外提供负载均衡,暴露服务,或者为集群绑定一个 L2 VIP。


管理

下面是 Node 模块中常用的管理操作:

更多问题请参考 FAQ:NODE


添加节点

要将节点添加到 Pigsty,您需要对该节点具有无密码的 ssh/sudo 访问权限。

您也可以选择一次性添加一个集群,或使用通配符匹配配置清单中要加入 Pigsty 的节点。

# ./node.yml -l <cls|ip|group>        # 向 Pigsty 中添加节点的实际剧本
# bin/node-add <selector|ip...>       # 向 Pigsty 中添加节点
bin/node-add node-test                # 初始化节点集群 'node-test'
bin/node-add 10.10.10.10              # 初始化节点  '10.10.10.10'

移除节点

要从 Pigsty 中移除一个节点,您可以使用以下命令:

# ./node-rm.yml -l <cls|ip|group>    # 从 pigsty 中移除节点的实际剧本
# bin/node-rm <cls|ip|selector> ...  # 从 pigsty 中移除节点
bin/node-rm node-test                # 移除节点集群 'node-test'
bin/node-rm 10.10.10.10              # 移除节点 '10.10.10.10'

您也可以选择一次性移除一个集群,或使用通配符匹配配置清单中要从 Pigsty 移除的节点。


创建管理员

如果当前用户没有对节点的无密码 ssh/sudo 访问权限,您可以使用另一个管理员用户来初始化该节点:

node.yml -t node_admin -k -K -e ansible_user=<另一个管理员>   # 为另一个管理员输入 ssh/sudo 密码以完成此任务

绑定VIP

您可以在节点集群上绑定一个可选的 L2 VIP,使用 vip_enabled 参数。

proxy:
  hosts:
    10.10.10.29: { nodename: proxy-1 } # 您可以显式指定初始的 VIP 角色:MASTER / BACKUP
    10.10.10.30: { nodename: proxy-2 } # , vip_role: master }
  vars:
    node_cluster: proxy
    vip_enabled: true
    vip_vrid: 128
    vip_address: 10.10.10.99
    vip_interface: eth1
./node.yml -l proxy -t node_vip     # 首次启用 VIP 
./node.yml -l proxy -t vip_refresh  # 刷新 vip 配置(例如指定 master)

其他常见管理任务

# Play
./node.yml -t node                            # 完成节点主体初始化(haproxy,监控除外)
./node.yml -t haproxy                         # 在节点上设置 haproxy
./node.yml -t monitor                         # 配置节点监控:node_exporter & promtail (以及可选的 keepalived_exporter)
./node.yml -t node_vip                        # 为没启用过 VIP 的集群安装、配置、启用L2 VIP
./node.yml -t vip_config,vip_reload           # 刷新节点L2 VIP配置
./node.yml -t haproxy_config,haproxy_reload   # 刷新节点上的服务定义
./node.yml -t register_prometheus             # 重新将节点注册到 Prometheus 中
./node.yml -t register_nginx                  # 重新将节点 haproxy 管控界面注册到 Nginx 中

# Task
./node.yml -t node-id        # 生成节点身份标识
./node.yml -t node_name      # 设置主机名
./node.yml -t node_hosts     # 配置节点 /etc/hosts 记录
./node.yml -t node_resolv    # 配置节点 DNS 解析器 /etc/resolv.conf
./node.yml -t node_firewall  # 配置防火墙 & selinux
./node.yml -t node_ca        # 配置节点的CA证书
./node.yml -t node_repo      # 配置节点上游软件仓库
./node.yml -t node_pkg       # 在节点上安装 yum 软件包
./node.yml -t node_feature   # 配置 numa、grub、静态网络等特性
./node.yml -t node_kernel    # 配置操作系统内核模块
./node.yml -t node_tune      # 配置 tuned 调优模板
./node.yml -t node_sysctl    # 设置额外的 sysctl 参数
./node.yml -t node_profile   # 配置节点环境变量:/etc/profile.d/node.sh
./node.yml -t node_ulimit    # 配置节点资源限制
./node.yml -t node_data      # 配置节点首要数据目录
./node.yml -t node_admin     # 配置管理员用户和ssh密钥
./node.yml -t node_timezone  # 配置节点时区
./node.yml -t node_ntp       # 配置节点 NTP 服务器/客户端
./node.yml -t node_crontab   # 添加/覆盖 crontab 定时任务
./node.yml -t node_vip       # 为节点集群设置可选的 L2 VIP

剧本

Pigsty 提供了两个与 NODE 模块相关的剧本,分别用于纳管与移除节点。

  • node.yml:纳管节点,并调整节点到期望的状态
  • node-rm.yml:从 pigsty 中移除纳管节点

此外, Pigsty 还提供了两个包装命令工具:node-addnode-rm,用于快速调用剧本。


node.yml

向 Pigsty 添加节点的 node.yml 包含以下子任务:

node-id       :生成节点身份标识
node_name     :设置主机名
node_hosts    :配置 /etc/hosts 记录
node_resolv   :配置 DNS 解析器 /etc/resolv.conf
node_firewall :设置防火墙 & selinux
node_ca       :添加并信任CA证书
node_repo     :添加上游软件仓库
node_pkg      :安装 rpm/deb 软件包
node_feature  :配置 numa、grub、静态网络等特性
node_kernel   :配置操作系统内核模块
node_tune     :配置 tuned 调优模板
node_sysctl   :设置额外的 sysctl 参数
node_profile  :写入 /etc/profile.d/node.sh
node_ulimit   :配置资源限制
node_data     :配置数据目录
node_admin    :配置管理员用户和ssh密钥
node_timezone :配置时区
node_ntp      :配置 NTP 服务器/客户端
node_crontab  :添加/覆盖 crontab 定时任务
node_vip      :为节点集群设置可选的 L2 VIP
haproxy       :在节点上设置 haproxy 以暴露服务
monitor       :配置节点监控:node_exporter & promtail
示例:使用 node.yml 初始化节点集群

asciicast


node-rm.yml

从 Pigsty 中移除节点的剧本 node-rm.yml 包含了以下子任务:

register       : 从 prometheus & nginx 中移除节点注册信息
  - prometheus : 移除已注册的 prometheus 监控目标
  - nginx      : 移除用于 haproxy 管理界面的 nginx 代理记录
vip            : 移除节点的 keepalived 与 L2 VIP(如果启用 VIP)
haproxy        : 移除 haproxy 负载均衡器
node_exporter  : 移除节点监控:Node Exporter
vip_exporter   : 移除 keepalived_exporter (如果启用 VIP)
promtail       : 移除 loki 日志代理 promtail
profile        : 移除 /etc/profile.d/node.sh 环境配置文件

监控

Pigsty 中的 NODE 模块提供了 6 个内容丰富的监控面板。

NODE Overview:当前环境中所有主机节点的大盘总览

Node Overview Dashboard

node-overview.jpg

NODE Cluster:某一个主机集群的详细监控信息

Node Cluster Dashboard

node-cluster.jpg

Node Instance:某一个主机节点的详细监控信息

Node Instance Dashboard

node-instance.jpg

NODE Alert:当前环境中所有主机节点的告警信息

Node Alert Dashboard

node-alert.jpg

NODE VIP:某一个主机L2 VIP的详细监控信息

Node VIP Dashboard

node-vip.jpg

Node Haproxy:某一个 HAProxy 负载均衡器的详细监控

Node Haproxy Dashboard

node-haproxy.jpg


参数

NODE 模块有11个参数组(Docker/VIP为可选项),共计 66 个相关参数:

完整参数列表
参数 参数组 类型 级别 说明
nodename NODE_ID string I node 实例标识,如缺失则使用主机名,可选
node_cluster NODE_ID string C node 集群标识,如缺失则使用默认值’nodes’,可选
nodename_overwrite NODE_ID bool C 用 nodename 覆盖节点的主机名吗?
nodename_exchange NODE_ID bool C 在剧本主机之间交换 nodename 吗?
node_id_from_pg NODE_ID bool C 如果可行,是否借用 postgres 身份作为节点身份?
node_write_etc_hosts NODE_DNS bool G/C/I 是否修改目标节点上的 /etc/hosts
node_default_etc_hosts NODE_DNS string[] G /etc/hosts 中的静态 DNS 记录
node_etc_hosts NODE_DNS string[] C /etc/hosts 中的额外静态 DNS 记录
node_dns_method NODE_DNS enum C 如何处理现有DNS服务器:add,none,overwrite
node_dns_servers NODE_DNS string[] C /etc/resolv.conf 中的动态域名服务器列表
node_dns_options NODE_DNS string[] C /etc/resolv.conf 中的DNS解析选项
node_repo_modules NODE_PACKAGE enum C/A 需要在节点上添加的的软件源模块列表,默认为 local
node_repo_remove NODE_PACKAGE bool C/A 配置节点软件仓库时,删除节点上现有的仓库吗?
node_packages NODE_PACKAGE string[] C 要在当前节点上安装的软件包列表
node_default_packages NODE_PACKAGE string[] G 默认在所有节点上安装的软件包列表
node_disable_firewall NODE_TUNE bool C 禁用节点防火墙?默认为 true
node_disable_selinux NODE_TUNE bool C 禁用节点 selinux?默认为 true
node_disable_numa NODE_TUNE bool C 禁用节点 numa,禁用需要重启
node_disable_swap NODE_TUNE bool C 禁用节点 Swap,谨慎使用
node_static_network NODE_TUNE bool C 重启后保留 DNS 解析器设置,即静态网络,默认启用
node_disk_prefetch NODE_TUNE bool C 在 HDD 上配置磁盘预取以提高性能
node_kernel_modules NODE_TUNE string[] C 在此节点上启用的内核模块列表
node_hugepage_count NODE_TUNE int C 主机节点分配的 2MB 大页数量,优先级比比例更高
node_hugepage_ratio NODE_TUNE float C 主机节点分配的内存大页占总内存比例,0 默认禁用
node_overcommit_ratio NODE_TUNE int C 节点内存允许的 OverCommit 超额比率 (50-100),0 默认禁用
node_tune NODE_TUNE enum C 节点调优配置文件:无,oltp,olap,crit,tiny
node_sysctl_params NODE_TUNE dict C 额外的 sysctl 配置参数,k:v 格式
node_data NODE_ADMIN path C 节点主数据目录,默认为 `/data``
node_admin_enabled NODE_ADMIN bool C 在目标节点上创建管理员用户吗?
node_admin_uid NODE_ADMIN int C 节点管理员用户的 uid 和 gid
node_admin_username NODE_ADMIN username C 节点管理员用户的名称,默认为 `dba``
node_admin_ssh_exchange NODE_ADMIN bool C 是否在节点集群之间交换管理员 ssh 密钥
node_admin_pk_current NODE_ADMIN bool C 将当前用户的 ssh 公钥添加到管理员的 authorized_keys 中吗?
node_admin_pk_list NODE_ADMIN string[] C 要添加到管理员用户的 ssh 公钥
node_timezone NODE_TIME string C 设置主机节点时区,空字符串跳过
node_ntp_enabled NODE_TIME bool C 启用 chronyd 时间同步服务吗?
node_ntp_servers NODE_TIME string[] C /etc/chrony.conf 中的 ntp 服务器列表
node_crontab_overwrite NODE_TIME bool C 写入 /etc/crontab 时,追加写入还是全部覆盖?
node_crontab NODE_TIME string[] C 在 /etc/crontab 中的 crontab 条目
vip_enabled NODE_VIP bool C 在此节点集群上启用 L2 vip 吗?
vip_address NODE_VIP ip C 节点 vip 地址的 ipv4 格式,启用 vip 时为必要参数
vip_vrid NODE_VIP int C 所需的整数,1-254,在同一 VLAN 中应唯一
vip_role NODE_VIP enum I 可选,master/backup,默认为 backup,用作初始角色
vip_preempt NODE_VIP bool C/I 可选,true/false,默认为 false,启用 vip 抢占
vip_interface NODE_VIP string C/I 节点 vip 网络接口监听,默认为 eth0
vip_dns_suffix NODE_VIP string C 节点 vip DNS 名称后缀,默认为空字符串
vip_exporter_port NODE_VIP port C keepalived exporter 监听端口,默认为 9650
haproxy_enabled HAPROXY bool C 在此节点上启用 haproxy 吗?
haproxy_clean HAPROXY bool G/C/A 清除所有现有的 haproxy 配置吗?
haproxy_reload HAPROXY bool A 配置后重新加载 haproxy 吗?
haproxy_auth_enabled HAPROXY bool G 启用 haproxy 管理页面的身份验证?
haproxy_admin_username HAPROXY username G haproxy 管理用户名,默认为 `admin``
haproxy_admin_password HAPROXY password G haproxy 管理密码,默认为 `pigsty``
haproxy_exporter_port HAPROXY port C haproxy exporter 的端口,默认为 9101
haproxy_client_timeout HAPROXY interval C haproxy 客户端连接超时,默认为 24h
haproxy_server_timeout HAPROXY interval C haproxy 服务器端连接超时,默认为 24h
haproxy_services HAPROXY service[] C 要在节点上对外暴露的 haproxy 服务列表
node_exporter_enabled NODE_EXPORTER bool C 在此节点上配置 node_exporter 吗?
node_exporter_port NODE_EXPORTER port C node exporter 监听端口,默认为 9100
node_exporter_options NODE_EXPORTER arg C node_exporter 的额外服务器选项
promtail_enabled PROMTAIL bool C 启用 promtail 日志收集器吗?
promtail_clean PROMTAIL bool G/A 初始化期间清除现有的 promtail 状态文件吗?
promtail_port PROMTAIL port C promtail 监听端口,默认为 9080
promtail_positions PROMTAIL path C promtail 位置状态文件路径

指标列表

Pigsty NODE 模块提供的完整监控指标列表与释义

常见问题

Pigsty NODE 主机节点模块常见问题答疑