
数据库运维云原生高可用监控【免费下载链接】pigstyEnterprise-Grade OSS PostgreSQL Distribution with HA, PITR, IaC, Monitor, 12 kernel forks and 575 PG extensions. Best-of-breed products integrated as a platform. Self-host Postgres like a Pro!项目地址https://gitcode.com/GitHub_Trending/pi/pigsty点击查看免费下载node是 Pigsty 基础设施中的地基角色负责把一台裸 Linux 主机初始化为可承载 PostgreSQL、Redis、Kafka 等集群负载的标准化节点。本文以 roles/node/README.md 为主体结合 roles/node/tasks 下各任务源码与 roles/node/templates 模板系统讲解该角色的执行流程、Tag 体系、全部核心变量、内核调优原理与生产安全基线读完你既能直接套用角色配置也能理解每条规则背后的源码实现。角色定位与工作范围node角色负责对目标 Linux 节点完成以下八类基础配置是其他所有 Pigsty 角色pgsql、redis、kafka等得以正常运行的前提名称与 DNS主机名hostname、/etc/hosts静态记录、/etc/resolv.conf解析器安全防火墙firewalld/ufw、SELinux、sudo 配置证书安装并信任 Pigsty 私有 CA 证书软件包配置本地/上游 yum/apt 软件源并安装软件包调优内核参数、sysctl、hugepages 大页、tuned 性能 profile管理用户创建 admin 管理员用户、分发 SSH 密钥时间时区、chrony NTP 同步、crontab 计划任务VIP可选的基于 keepalived 的 L2 虚拟 IP该角色与node_id节点身份推导、node_monitor节点监控、node_remove节点组件卸载、haproxy负载均衡四个角色紧密协作形成完整的节点生命周期管理链路。Playbook 与文件结构角色对应两个顶层 PlaybookPlaybook说明node.yml完整的节点初始化全量执行node-rm.yml移除节点相关组件反操作角色目录结构如下完整目录见 roles/noderoles/node/ ├── defaults/ │ └── main.yml # 默认变量唯一事实来源 ├── files/ │ └── ... # 静态文件脚本/配置 ├── meta/ │ └── main.yml # 角色依赖声明 ├── tasks/ │ ├── main.yml # 入口按顺序 import 各子任务 │ ├── dns.yml # [node_hosts, node_resolv] DNS 配置 │ ├── sec.yml # [node_sec] 安全设置 │ ├── cert.yml # [node_ca] CA 证书安装 │ ├── pkg.yml # [node_repo, node_pkg, node_uv] 软件包 │ ├── tune.yml # [node_feature, node_kernel, node_tune, node_sysctl] │ ├── admin.yml # [node_admin] 管理用户 │ ├── time.yml # [node_timezone, node_ntp, node_crontab] │ └── vip.yml # [node_vip] keepalived VIP └── templates/ ├── chrony.conf.j2 # chrony 时间同步配置模板 ├── keepalived.conf.j2 # keepalived 高可用模板 └── tuned-*.conf # tuned 性能 profileoltp/olap/crit/tiny从入口文件 roles/node/tasks/main.yml 可以清晰看到执行顺序先由前置角色node_id推导身份 → 设置主机名 → 配置 DNS → 安全加固 → 安装 CA 证书 → 配置软件源与安装包 → 内核调优 → 创建管理用户 → 时间同步 → 最后按vip_enabled条件判断是否启用 keepalived VIPvip.yml仅在vip_enabled|bool为真时被导入。注意 roles/node/tasks/vip.yml 中 keepalived 的安装被前置在pkg.yml的node_viptag 下见 roles/node/tasks/pkg.yml与配置分离。Tag 体系按需精细化执行node角色内置了从粗到细的三层 Tag 层级支持用./node.yml -l target -t tag只执行某一段逻辑这在批量变更、故障修复和局部重跑时非常有用node (full role) │ ├── node_name # 设置主机名 ├── node_hosts # 配置 /etc/hosts ├── node_resolv # 配置 /etc/resolv.conf │ ├── node_sec # 安全配置 │ ├── node_firewall # 防火墙 │ └── node_selinux # SELinux │ ├── node_ca # 安装 CA 证书 │ ├── node_repo / node_install # 配置软件源 │ ├── node_repo_remove # 移除既有源 │ ├── node_repo_add # 添加上游源 │ └── node_repo_cache # 刷新包缓存 ├── node_pkg # 安装软件包 │ ├── node_pkg_default # 默认包 │ └── node_pkg_extra # 额外包 ├── node_uv # 配置 uv python venv │ ├── node_feature # CPU/内核特性 ├── node_kernel # 内核模块 ├── node_tune # tuned profile │ └── node_tune_active # 激活 tuned profile ├── node_sysctl # sysctl 参数 │ ├── node_profile # Shell profile ├── node_alias # Shell 别名 ├── node_pip # Python pip 配置 ├── node_ulimit # 资源限制 ├── node_data # 数据目录 ├── node_admin # 管理用户 │ ├── node_admin_pk_list # 额外公钥 │ └── node_admin_pk_current # 当前用户公钥 │ ├── node_timezone # 时区 ├── node_ntp # NTP 同步 │ ├── node_ntp_install # 安装 chrony │ ├── node_ntp_config # 渲染 chrony 配置 │ └── node_ntp_launch # 启动 chrony ├── node_crontab # crontab 条目 │ └── node_vip # VIP 配置可选 ├── vip_check # 校验 VIP 参数 ├── vip_config # keepalived 配置 ├── vip_launch # 启动 keepalived └── vip_reload # 重载 keepalived核心变量详解所有默认值均以 roles/node/defaults/main.yml 为唯一事实来源下面按功能域逐一展开。变量中的admin_ip占位符会在渲染时被替换为管理机真实 IP。身份Identity变量默认值说明nodename自动节点名缺省时用主机名node_clusternodes节点集群名nodename_overwritetrue是否用nodename覆盖目标主机名nodename_exchangefalse是否在 play 主机间交换节点名写入/etc/hostsnode_id_from_pgtrue若适用是否用 PostgreSQL 身份作为节点身份DNS变量默认值说明node_write_etc_hoststrue是否修改目标节点/etc/hostsnode_default_etc_hosts[${admin_ip} i.pigsty]/etc/hosts静态记录node_etc_hosts[]额外静态记录node_dns_methodaddDNS 服务器处理方式add/none/overwritenode_dns_servers[${admin_ip}]/etc/resolv.conf中的 nameservernode_dns_options[options single-request-reopen timeout:1]resolv.conf 选项安全Security变量默认值说明node_selinux_modepermissiveSELinux 模式enforcing/permissive/disablednode_firewall_modezone防火墙模式zone信任内网受限公网/off关闭/none跳过、自管理node_firewall_intranet10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12视为内网的 CIDR 段node_firewall_public_port[22, 80, 443]对公网暴露的 TCP 端口软件包与 uv Python变量默认值说明node_repo_moduleslocal要启用的上游软件源模块逗号分隔可多个node_repo_removetrue是否先移除目标节点既有软件源备份到backup/目录node_packages[openssh-server]以 latest 版本安装的软件包node_default_packages[]默认安装的基础软件包node_uv_env/data/venvuv venv 路径置空字符串则跳过node_pip_packages在 venv 中通过 pip 安装的包Admin 管理用户变量默认值说明node_admin_enabledtrue是否创建 admin 用户node_admin_usernamedbaadmin 用户名node_admin_uid88admin 用户 UID/GIDnode_admin_sudonopasssudo 权限模式见下方说明node_admin_ssh_exchangetrue是否在集群节点间交换 SSH 公钥node_admin_pk_currenttrue是否把当前用户公钥加入 adminauthorized_keysnode_admin_pk_list[]额外要添加的 SSH 公钥列表node_data/data节点主数据目录node_aliases{}额外 shell 别名k:v 字典sudo 模式node_admin_sudonopass免密全量 sudo默认all全量 sudo但需要密码limit免密执行受限命令集systemctl、journalctl、cat、less、tail、head这三种模式的实现直接体现在 roles/node/tasks/admin.yml 的/etc/sudoers.d/{{ node_admin_username }}渲染逻辑中nopass写入%admin ALL(ALL) NOPASSWD: ALLall写入%admin ALL(ALL) ALLlimit则只放行上述六个命令且文件写入后会用visudo -cf校验语法保证不会因配置错误锁死 sudo。时间Time变量默认值说明node_timezone时区空串跳过node_ntp_enabledtrue是否启用 chronydnode_ntp_servers[pool pool.ntp.org iburst]chrony 配置中的 NTP 服务器node_crontab_overwritetrue覆盖还是追加/etc/crontabnode_crontab[]要写入的 crontab 条目调优Tuning变量默认值说明node_tuneoltp要应用的 tuned profilenode_hugepage_count02MB 大页数量优先于 rationode_hugepage_ratio0大页内存比例0 默认禁用node_overcommit_ratio0内存 overcommit 比例node_sysctl_params{fs.nr_open: 8388608}额外 sysctl 参数k:v 格式node_disable_numafalse禁用 NUMA需重启生效node_disable_swapfalse禁用 swap谨慎使用node_static_networktrue重启后保持 DNS 解析器设置node_disk_prefetchfalse在 HDD 上启用磁盘 prefetch 提升性能node_kernel_modules[softdog, ip_vs, ip_vs_rr, ip_vs_wrr, ip_vs_sh]开机加载的内核模块tuned profilenode_tuneoltp面向事务处理优化低延迟、高吞吐默认olap面向分析型负载更大缓冲、顺序 I/Ocrit面向关键负载的均衡配置tiny小/测试系统的极简调优none跳过调优VIP可选高可用变量默认值说明vip_enabledfalse是否启用 keepalived VIPvip_address无带 CIDR 的 VIP 地址必填vip_vrid无VRRP 路由器 ID1-254必填vip_rolebackup初始角色master/backupvip_preemptfalse是否启用抢占vip_interfaceauto监听网卡auto自动探测vip_auth_passVRRP 认证密码空则自动生成cluster-vridvip_dns_suffixVIP DNS 名称后缀关键约束启用 VIP 必须同时设置vip_address与vip_vrid多个配置了相同vip_address的节点会组成 VRRP 集群实现故障自动切换。vip_auth_pass为空时默认使用node_cluster-vip_vrid作为认证口令。源码级执行流程解析DNS 配置幂等写入与主机名交换roles/node/tasks/dns.yml 的实现有几个值得注意的细节/etc/hosts中以# pigsty dns结尾的记录会被先清理再重写幂等而nodename_exchange写入的记录以# pigsty meta结尾重跑时不会被清除从而避免重复渲染丢失集群互访记录。node_default_etc_hosts与node_etc_hosts中的${admin_ip}占位符在写入前被替换为真实管理机 IP。/etc/resolv.conf的生成使用awk读取已有 nameserver按 token 读取以保护 IPv6 地址完整在add模式下会追加保留既有的 nameserver排除与node_dns_servers重复及admin_ip本身同时注入node_dns_options中的解析选项。安全加固SELinux 与防火墙roles/node/tasks/sec.yml 用一个幂等 shell 块处理 SELinux先写/etc/selinux/config持久化再用setenforce做运行时切换disabled状态不执行。防火墙逻辑按 OS 分支处理RHEL/Rockyfirewalldoff模式直接systemctl disable --now firewalldzone模式下将node_firewall_intranet中的 CIDR 加入trusted区内网全放行将node_firewall_public_port端口暴露在public区最后firewall-cmd --runtime-to-permanent持久化。Debian/Ubuntuufwufw allow from cidr放行内网ufw allow port/tcp放行公网端口。CA 证书信任roles/node/tasks/cert.yml 将角色ca生成的files/pki/ca/ca.crt复制到/etc/pki/ca.crt然后按发行版链接进系统信任库RHEL 软链到/etc/pki/ca-trust/source/anchors/并执行update-ca-trustDebian/Ubuntu 软链到/usr/local/share/ca-certificates/并执行update-ca-certificates。任务对update-ca-certificates的 warning: skipping 警告做了容错避免 Ubuntu 上非零退出码导致误判失败。软件源与软件包管理roles/node/tasks/pkg.yml 是三段式流程移除旧源node_repo_remove把既有/etc/yum.repos.d/*.reporpm或/etc/apt/sources.list*deb整体挪到backup/目录仅备份不删除。写入新源按node_repo_modules中每个模块渲染对应的.repo/.list文件。模板根据os_version、os_arch、regiondefault/china/europe选择 baseurl并处理$releasever的细节——例如 RHEL 10 的 EPEL 使用10z版本、PGDG 源在特定小版本上使用完整版本号作为目标版本。刷新缓存rpm 系yum makecachedeb 系apt update。随后安装默认包与node_packageslatestDebian 系还会先写入policy-rc.d抑制服务自动启动。若vip_enabled则在此处追加安装keepalived与keepalived-exporter。最后node_uv块创建/data/venv虚拟环境china区域额外写入阿里云 PyPI 镜像/etc/uv/uv.toml并按node_pip_packages安装 Python 包。内核调优tuned profile 与 sysctlroles/node/tasks/tune.yml 先按需执行特征脚本disable_numa.sh、static_network.sh、disk_prefetch.sh位于 roles/node/files再modprobe加载node_kernel_modules并写入/etc/modules-load.d/实现开机持久化。四个 tuned profile 模板tuned-oltp.conf、tuned-olap.conf、tuned-crit.conf、tuned-tiny.conf被统一渲染到/etc/tuned/profile/tuned.conf然后tuned-adm profile {{ node_tune }}激活。以默认的 roles/node/templates/tuned-oltp.conf 为例其核心策略包括CPUgovernorperformance、energy_perf_biasperformance、force_latency1以功耗换延迟内存transparent_hugepagesnever关闭 THP这是 PostgreSQL 社区的经典建议、vm.swappiness1、dirty_background_ratio3、dirty_ratio15比内核默认更激进地刷脏页OLTP 写密集场景内核kernel.numa_balancing0、kernel.sched_autogroup_enabled0、fs.file-max16777216、fs.nr_open8388608模板注释特别强调fs.nr_open必须 ≥ systemd unit 的LimitNOFILE否则部分服务可能启动失败——这正是 defaults 里默认保留该参数的用意网络net.core.somaxconn65535、TCP 收发缓冲上限 4MiB、tcp_tw_reuse1、tcp_fin_timeout15、tcp_keepalive_time60等针对 25G 网卡的 OLTP 场景做了专门注释说明磁盘调度器对vd[a-z]/xvd[a-z]/nvme*设备统一elevatornoneNVMe 额外设置readahead64、nomerges2。大页hugepage参数由模板动态计算优先node_hugepage_count其次node_hugepage_ratio二者都不得超过内存的 90%防止配置错误导致 OOM最终写入/etc/sysctl.d/hugepage.conf并sysctl -p生效。最后node_sysctl_params中的键值对通过 Ansiblesysctl模块逐项应用并持久化。Admin 用户与 SSH 密钥分发roles/node/tasks/admin.yml 按六个阶段执行写入/etc/profile.d/node.sh→ 渲染node_aliases→china区域写入清华 PyPI 镜像/etc/pip.conf→ 部署/etc/security/limits.d/limits.conf来自 roles/node/files/limits.conf→ 创建/data目录 → 创建 admin 用户/组。用户创建的关键点admin 用户 UID/GID 固定为 88生成 SSH 密钥对generate_ssh_keyyes写入 roles/node/files/ssh.config 作为.ssh/config其中StrictHostKeyCheckingno由 lineinfile 显式保证node_admin_ssh_exchange开启时会把每台节点的id_rsa.pub通过authorized_key模块交换到所有 play 主机delegate_to循环实现集群免密互访——这是 Ansible 批量管理其他角色的前提最后按node_admin_pk_list与node_admin_pk_current注入额外公钥和当前用户公钥with_fileglob: ~/.ssh/id*.pub。时间同步与 crontabroles/node/tasks/time.yml 设置时区后安装并配置 chrony。模板 roles/node/templates/chrony.conf.j2 渲染node_ntp_servers并做了巧妙处理若 NTP 服务器指向${admin_ip}即管理机则非管理机节点把管理机作为时钟源、管理机自身跳过该行从而在无外网环境下形成层级时间同步同时内置makestep 10 120前三次更新允许大步调整与对127.0.0.1/32、192.168.0.0/16、10.0.0.0/8的本地 NTP 访问放行。crontab 部分无条件启动cron/crond服务按os_package区分再根据node_crontab_overwrite决定是追加node_crontab条目到/etc/crontab还是整体覆盖覆盖时附带标准 crontab 注释头。VIPkeepalived 高可用roles/node/tasks/vip.yml 先assert校验vip_address、vip_vrid1-254与vip_role然后自动探测网卡通过ip -o -4 addr show匹配inventory_hostname对应的接口支持vip_interface: auto。模板 roles/node/templates/keepalived.conf.j2 的关键设计用 JMESPath 查询hostvars中所有vip_address相同的节点生成unicast_peer单播对等列表避免依赖组播/VLAN 广播并自动排除自身vip_rolemaster时优先级 128backup为 100vip_preemptfalse时写入nopreempt防止抢回vip_auth_pass为空时默认使用node_cluster-vip_vrid作为auth_pass配置写入/etc/keepalived/keepalived.conf0600随后systemd启动/重载 keepalived。平台支持与差异该角色支持RHEL/Rocky 8-10、Ubuntu 22/24/26与Debian 12-13部分功能有 OS 专属实现可从各任务文件的分支逻辑印证THP 禁用由 tuned profile 统一处理跨平台静态网络RHEL 用/etc/sysconfig/Debian 用 systemd-resolved防火墙RHEL 用 firewalldDebian/Ubuntu 用 ufw安全基线默认值 vs 生产建议角色默认配置在开发便利与基础安全之间取了平衡点。文档明确给出的生产环境加固建议如下设置默认值生产建议node_admin_sudonopass使用limit或all实现最小权限node_selinux_modepermissive关键系统考虑enforcingnode_firewall_modezone保持zone仅自管理防火墙时才用nonenode_firewall_public_port[22, 80, 443]仅在必要时追加端口如 5432vip_auth_pass自动生成显式设置强密码推荐的生产配置片段node_admin_sudo: limit # 免密仅限受控命令 node_selinux_mode: enforcing # 完全强制 SELinux node_firewall_mode: zone # 信任内网公网仅暴露 22 80 443 node_firewall_public_port: [22, 80, 443] # 最小公网暴露面 vip_auth_pass: strong-secret # 显式设置 VRRP 认证SSH Host Key 检查admin 用户的 SSH config 为满足 Ansible 集群运维需要关闭了StrictHostKeyChecking这在带来便利的同时也引入了中间人攻击MITM风险。文档明确提示请确保网络可信或通过堡垒机访问。防火墙管理实操node_firewall_mode默认zone信任内网 受限公网端口。重新应用防火墙规则只需./node.yml -l target -t node_firewall注意防火墙规则是纯增量的。要移除规则必须手工操作# RHEL/Rocky (firewalld) firewall-cmd --zonepublic --remove-port5432/tcp firewall-cmd --runtime-to-permanent # Debian/Ubuntu (ufw) ufw delete allow 5432/tcp与其他角色的协作node是节点生命周期管理的入口后续可配合node_id节点身份推导node的前置角色node_monitor节点监控部署node_exporter、vector 等node_remove节点组件卸载反操作haproxy负载均衡器配置小结node角色把裸机 → 可用节点这一繁琐过程浓缩为一次可重复、可审计、幂等的 Ansible 执行从 DNS/安全/证书的基础配置到软件源/包的环境就绪再到 tuned/sysctl/hugepage 的性能调优最后以 admin 用户、时间同步和可选 keepalived VIP 收尾。理解其 Tag 层级、默认变量与源码实现不仅能让你在 node.yml 全量初始化时心中有数也能在后续-t定向重跑、生产加固和 VIP 高可用排障时直击要害。赞分享数据库运维云原生高可用监控【免费下载链接】pigstyEnterprise-Grade OSS PostgreSQL Distribution with HA, PITR, IaC, Monitor, 12 kernel forks and 575 PG extensions. Best-of-breed products integrated as a platform. Self-host Postgres like a Pro!项目地址https://gitcode.com/GitHub_Trending/pi/pigsty点击查看免费下载相关推荐Pigsty Redis 角色全解析用 Ansible 一键部署 Standalone / Cluster / Sentinel 三种 Redis 实例与完整监控Pigsty Redis 角色全解析用 Ansible 一键部署 Standalone / Cluster / Sentinel 三种 Redis 实例与完整数据库运维云原生高可用监控Linux 内核初始化一x86_64 内核入口点、GDT 与早期页表构建全解析Linux 内核初始化一x86_64 内核入口点、GDT 与早期页表构建全解析 导读 本篇是 Linux 内核初始化章节的第一部分承接 Linux 内核文档教程操作系统Linux 内核揭秘start_kernel 内核入口点的初始化全解析Linux 内核揭秘start_kernel 内核入口点的初始化全解析 本篇文章基于「内核初始化」系列聚焦体系架构无关的内核入口函数 start_kerne上一篇OpenProject 语言与地区设置指南切换界面语言与时区的完整实操与实现原理下一篇Long Table 设计系统实战用 frontend-slides 的 preview.md 构建温暖单墨色晚宴俱乐部风幻灯片创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考