跳转至

Vertica 集群网络性能优化与诊断最佳实践

作者:JiangChong | 撰写时间:2026-05-28

适用场景:当你怀疑 Vertica 集群的网络性能成为瓶颈——节点间通信变慢、Spread 超时、查询延迟异常、或者排查到网络相关告警时,本文提供从原理到实践的完整诊断与优化路径。

关联文章:

理解全文脉络: 本文从网络对 Vertica 的核心原理讲起(第 1 节),然后给出系统级监控方法(第 2 节),再按排查优先级展开从网卡基础检查到深层参数调优的逐层诊断路径(第 3 节),接着提供从快速见效到根本治理的解决方案(第 4 节),最后通过真实案例(第 5 节)和完整演练(第 6 节)串联全部知识点。


1. 原理理解

1.1 为什么网络对 Vertica 至关重要

Vertica 是一个 MPP(Massively Parallel Processing,大规模并行处理) 数据库。与传统的单机数据库(如 MySQL、PostgreSQL)不同,Vertica 的查询和数据加载分布在集群的所有节点上并行执行。节点间的每一次数据交换——查询中间结果的 Resegment/Broadcast、数据加载时的行分发、Commit 事务协调——都要经过网络。

具体来说,网络承担三种关键角色:

角色 协议 端口 影响范围
Spread 控制通道 UDP 4803 节点成员资格、心跳检测、Cluster 状态一致性
节点间数据通道 TCP 5434 查询数据传输(Resegment/Broadcast)、数据加载分发
客户端连接 TCP 5433 vsql/JDBC/ODBC 客户端连接

Spread 控制通道是最敏感的环节。 它使用 UDP 协议在节点间传递 Token,每个 Token 有严格的时间限制(Token Timeout,默认 8~25 秒)。UDP 是无连接协议,不会像 TCP 那样自动重传——如果 UDP 包在网络中丢失,Spread 必须依赖 Token 重传机制。一旦 Token 连续超时,Spread 会将该节点从集群成员资格中移除,触发节点驱逐甚至集群宕机。

比喻: 如果把 Vertica 集群比作一个交响乐团,Spread 就是指挥家的节拍器。如果节拍器中断,即使每个乐手技术再好,乐团也会失去同步。

1.2 网络问题如何触发集群故障

以下是网络问题从微观到宏观的传导链条:

网络层故障(丢包/延迟/半断)
  → UDP 包丢失 → Spread Token 重传 → Token 超时累加
  → Spread 驱逐节点 → 节点变为 UNSAFE → K-Safety 下降
  → 如果逻辑相邻节点同时被驱逐 → 数据库宕机

一个关键概念是 「逻辑相邻节点」:在 Vertica 中,每个 buddy projection 的 _b0_b1 副本分布在不同节点上,这两个节点互为逻辑相邻。即使只有一个节点宕机,如果它的逻辑相邻节点恰好也因网络问题被驱逐,K-Safety 将降为 0,集群立即不可用。

1.3 网络问题的常见来源总结

来源类别 具体问题 典型症状
网卡硬件/驱动 固件版本不兼容、驱动 bug、Ring Buffer 过小 UDP 吞吐量低下(< 200 MB/s)
Bonding/LACP 交换机侧 LACP 状态异常(半断)、单网卡双口 vs 跨网卡双口 部分节点网络正常,部分异常;ping 通但 UDP 不通
内核参数 UDP/TCP Buffer 默认值过小、netdev_max_backlog 不足 UDP 接收错误增多、TCP 重传率高
IRQ/中断 网卡中断全部绑定在单个 CPU 上 单 CPU 满载,其他 CPU 空闲,网络延迟升高
防火墙 iptables 阻断 Spread 4803 端口或数据 5434 端口 节点启动卡在 Inviting cluster,或集群通信中断
TCP Offload TSO/GSO/GRO/LRO 的过度分片或合并导致数据包异常 UDP 接收错误突发
交换机/物理链路 光模块故障、交换机端口错误、MTU 不匹配 网络间歇性中断

2. 系统级监控

2.1 Vertica 层面:查看网络流量概况

v_monitor.system_resource_usage 提供了各节点网络收发流量的聚合视图。这是最快速的健康检查入口:

SELECT
    node_name,
    end_time,
    net_rx_kbytes_per_second,
    net_tx_kbytes_per_second,
    net_rx_kbytes_per_second + net_tx_kbytes_per_second AS total_net_kb_s,
    average_cpu_usage_percent,
    average_memory_usage_percent
FROM v_monitor.system_resource_usage
WHERE end_time >= CURRENT_TIMESTAMP - INTERVAL '10 minutes'
ORDER BY node_name, end_time DESC;

如何解读结果:

  • total_net_kb_s 高但 CPU/内存不高 → 网络流量本身就是瓶颈,需要检查带宽是否跑满。万兆网卡的理论上限约 1.25 GB/s(10 Gbps ÷ 8),实际可用约 80%(~1 GB/s)。如果单节点 total_net_kb_s 持续超过 800,000 KB/s,说明带宽接近饱和。
  • total_net_kb_s 低但 CPU 高 → 数据包处理(协议栈、中断处理)消耗了 CPU,而不是带宽不足。优先检查 IRQ 亲和性(见 3.4 节)和 TCP Offload 状态(见 3.5 节)。
  • 各节点 net_rx_kbytes_per_second 差异大(如某节点接收远低于其他节点) → 该节点可能存在网卡硬件故障或 bonding 异常。注意 Enterprise 模式下节点间网络流量通常应该对称。

2.2 Vertica 层面:查看网络接口级别详情

v_monitor.network_usage 提供比 system_resource_usage 更细粒度的逐接口网络数据(1 分钟粒度汇总),而 v_internal.dc_network_info 提供秒级的逐接口收发错误详情(见 2.3 节)。

SELECT
    node_name,
    start_time,
    end_time,
    tx_kbytes_per_sec,
    rx_kbytes_per_sec,
    tx_kbytes_per_sec + rx_kbytes_per_sec AS total_kbytes_per_sec
FROM v_monitor.network_usage
WHERE end_time >= CURRENT_TIMESTAMP - INTERVAL '10 minutes'
ORDER BY total_kbytes_per_sec DESC
LIMIT 20;

如何解读结果:

  • tx_kbytes_per_sec 是发送速率,rx_kbytes_per_sec 是接收速率。将它们与网卡物理带宽对比(万兆 ≈ 1,250,000 KB/s,千兆 ≈ 125,000 KB/s)。
  • 如果某节点的比值持续 > 80%,说明网卡负载已接近瓶颈。
  • 注意 start_timeend_time 的间隔为 1 分钟,kbytes_per_sec 是该分钟内的平均速率。短期峰值是正常的;持续高位才值得关注。

2.3 Vertica 层面:查看 TCP/UDP 错误统计

v_internal.dc_network_info 提供了每个网络接口的收发错误计数,而 v_internal.dc_netstats 提供了系统级的 TCP 重传和 UDP 错误统计。这是判断网络质量的核心指标:

-- 查看网卡接口级别的收发错误
SELECT
    time,
    node_name,
    interface_id,
    rx_errors,
    rx_drops,
    tx_errors,
    tx_drops,
    CASE WHEN rx_packets > 0
         THEN ROUND(rx_errors::numeric / rx_packets * 100, 4)
         ELSE 0 END AS rx_error_pct,
    CASE WHEN tx_packets > 0
         THEN ROUND(tx_errors::numeric / tx_packets * 100, 4)
         ELSE 0 END AS tx_error_pct
FROM v_internal.dc_network_info
WHERE interface_id != 'lo'
  AND time >= CURRENT_TIMESTAMP - INTERVAL '10 minutes'
ORDER BY time DESC, node_name;
-- 查看系统级 TCP 重传和 UDP 错误
SELECT
    time,
    node_name,
    tcp_retrans_segs,
    tcp_out_segs,
    CASE WHEN tcp_out_segs > 0
         THEN ROUND(tcp_retrans_segs::numeric / tcp_out_segs * 100, 4)
         ELSE 0 END AS tcp_retrans_pct,
    udp_in_errors,
    udp_in_datagrams
FROM v_internal.dc_netstats
WHERE time >= CURRENT_TIMESTAMP - INTERVAL '10 minutes'
ORDER BY time DESC, node_name;

如何解读结果:

  • rx_errors > 0 或 rx_drops > 0:网卡接收缓冲区溢出或硬件错误。这是最直接的网络质量恶化的信号。rx_drops 增大通常意味着 Ring Buffer 太小(参见 3.2 节)或中断处理不及时(参见 3.4 节)。
  • tcp_retrans_pct > 1%:TCP 重传率异常高。TCP 重传意味着数据包在网络中丢失或被丢弃——这对于节点间的数据通道(5434 端口)尤其致命,因为 Resegment/Broadcast 数据走 TCP。
  • udp_in_errors > 0:UDP 接收错误。Spread 控制通道使用 UDP,任何 UDP 错误都可能导致 Token 丢失。如果 udp_in_errors 持续非零,说明 UDP Socket Buffer(net.core.rmem_max)需要增大。

阈值参考(来自实际故障案例):某运营商案例中,Spread 重传 > 1000/s 持续 3 次检查即触发排查。TCP 重传率超过 0.5% 就是警告信号,超过 2% 需要立即处理。

2.4 Linux 层面:网卡基础信息检查

# 查看所有网卡接口
ip link show

# 查看网卡速率、双工模式、链路状态
# 已验证:RHEL 9.3 aarch64(virtio_net 驱动,部分字段为 Unknown)
ethtool eth0      # 将 eth0 替换为实际接口名,如 enp0s5、ens2f0

# 查看网卡驱动和固件版本
ethtool -i eth0

# 查看网卡收发统计(丢包、错误等)
ethtool -S eth0

# 查看系统级网络统计
cat /proc/net/dev

如何解读:

  • ethtool eth0SpeedDuplex 是最基础但最容易被忽略的检查项。万兆网卡应显示 Speed: 10000Mb/s,双工应为 Full。如果显示 Unknown!Speed: 1000Mb/s,说明网卡协商到了错误的速率。
  • ethtool -S 输出的 rx_droppedtx_droppedrx_crc_errors 等字段是底层硬件级别的错误统计,比 v_internal.dc_network_info 更直接。如果 rx_dropped 持续增长,说明 Ring Buffer 已满。

3. 逐步定位根因

3.1 第一步:检查网卡速率和双工模式

做什么:确认每张网卡协商到的速率和双工模式是否符合预期(万兆全双工)。

Linux 命令:

# 查看速率、双工、链路状态
ethtool eth0 | grep -E "Speed|Duplex|Link detected"

如何解读:

  • Speed: 10000Mb/s + Duplex: Full + Link detected: yes → 正常。
  • Speed: 1000Mb/s 但网卡是万兆的 → 可能是光模块不匹配、光纤质量问题、或对端交换机端口配置为千兆。
  • Speed: Unknown! → 常见于虚拟化网卡(如 virtio_net)。这种情况跳过速率检查,直接进入性能测试(3.3 节)。
  • Link detected: no → 物理链路断开,检查网线/光纤/光模块。

如果不是 → 速率/双工异常,先排查硬件(光模块、光纤、交换机端口),确认物理链路正常后再继续。

如果正常 → 进入 3.2 节检查 Ring Buffer。

3.2 第二步:检查并调整网卡 Ring Buffer

做什么:Ring Buffer 是网卡硬件和内核之间的 DMA 缓冲区。数据包到达网卡后先写入 Ring Buffer,再由内核通过中断读取。如果 Ring Buffer 太小,高流量时来不及读取的数据包会被直接丢弃(rx_drops 增长)。

Linux 命令:

# 查看当前 Ring Buffer 大小及硬件支持的最大值
# 已验证:RHEL 9.3 aarch64
ethtool -g eth0

如何解读:

输出示例(来自实际 Intel X710 万兆网卡):

Ring parameters for ens5f0:
Pre-set maximums:
RX:             4096
RX Mini:        n/a
RX Jumbo:       n/a
TX:             4096
Current hardware settings:
RX:             512
TX:             512

  • 如果 Current 的 RX/TX 值远小于 Pre-set maximums(如 512 vs 4096),说明 Ring Buffer 未被调优,存在丢包风险。
  • 对于万兆网卡,RX 和 TX Ring Buffer 应设为硬件支持的最大值

立即调整:

# 将 RX 和 TX Ring Buffer 设为最大值
# 注意:此设置在重启后失效,需配合持久化脚本
ethtool -G eth0 rx 4096 tx 4096
ethtool -g eth0    # 确认调整生效

持久化方法ethtool 设置在重启后失效。推荐方案:

  • RHEL/CentOS 7+:创建 NetworkManager dispatcher 脚本 /etc/NetworkManager/dispatcher.d/10-ring-buffer,在网卡 UP 事件时自动应用
  • 通用方案:创建 systemd oneshot 服务,在 network.target 之后执行,确保每次启动时生效
  • 避免 rc.local:RHEL 8+ 已禁用 rc.local,且执行时机可能在网卡初始化之前

如果不是 → Ring Buffer 已设为最大,但仍有丢包,进入 3.4 节检查中断亲和性。

3.3 第三步:网络吞吐量基准测试

做什么:使用 Vertica 自带的 vnetperf 工具测试节点间的 UDP 和 TCP 吞吐量。这是判断网络性能的最权威方法——它能模拟 Spread(UDP)和数据通道(TCP)的流量模式。

Linux 命令:

# vnetperf 是 Vertica 自带的网络性能测试工具,测试节点间延迟和吞吐量
# 默认测试所有节点对、所有测试项(latency + tcp-throughput + udp-throughput)
# --duration 控制每项测试时长(默认 1 秒),--hosts 显式指定节点(逗号分隔,无空格)
# 官方文档:https://docs.vertica.com/26.1.x/en/setup/set-up-on-premises/install-using-command-line/validation-scripts/vnetperf/
/opt/vertica/bin/vnetperf --hosts v001,v002,...,v075 --duration 30 --condense

vnetperf 输出示例(来自某政府机构 Intel 网卡实测):

date                    | test           | rate limit (MB/s) | node    | MB/s (sent) | MB/s (rec)
------------------------------------------------------------------------------------------------------
2024-04-07_15:40:10     | udp-throughput | 2048              | average | 483.745     | 391.482
2024-04-07_15:45:02     | tcp-throughput | 2048              | average | 1326.81     | 1326.57

⚠️ vnetperf 会产生高网络负载,不要在业务高峰期运行。以 dbadmin 用户执行,--duration 控制每项测试时长(默认仅 1 秒,生产诊断建议 30 秒);--condense 精简 JSON 输出。不需要数据库处于运行状态——常用于集群宕机或夯死时的网络诊断。

如何解读:

指标 官方推荐 警示值 备注
延迟(RTT) ≤ 200 µs > 1000 µs Spread Token 传递对延迟高度敏感
UDP throughput ≥ 800 MB/s < 200 MB/s Spread 控制通道走 UDP,UDP 性能直接决定 Token 传递可靠性
TCP throughput ≥ 800 MB/s < 500 MB/s 数据通道走 TCP,TCP 性能影响查询数据交换速度

如果 UDP 吞吐量低(< 200 MB/s)但 TCP 正常 → 优先检查 UDP Socket Buffer(net.core.rmem_max)和网卡 Ring Buffer。这是某政府机构海光服务器故障的典型表现。

如果 UDP 和 TCP 都低 → 可能原因:网卡硬件问题、Bonding/LACP 配置异常(见 3.6 节)、交换机端口故障。

如果个别节点吞吐量显著低于其他节点 → 该节点的物理链路或网卡可能存在故障。

补充工具: 如果 vnetperf 不可用,可用 iperf3 做替代测试。但 iperf3 需要额外的端口开放,且不能像 vnetperf 那样自动涵盖所有节点对。vnetperf 的优势在于它是由 Vertica 官方设计的,测试模式更贴近实际负载。

3.4 第四步:检查网卡中断(IRQ)亲和性

做什么:网卡收到数据包后通过硬中断通知 CPU 处理。如果所有中断都绑定到同一个 CPU 核心上,该 CPU 会成为瓶颈——表现为单核 100% 满载但其他核心空闲,网络延迟因此上升。

这是某运营商性能问题的根因(详见 5.2 节真实案例)。

Linux 命令:

# 查看每个 CPU 的中断计数(关注网卡对应的行,左侧即中断号)
cat /proc/interrupts | grep -E "CPU|eth0|enp"

# 查看当前中断亲和性(十六进制掩码)
# 001 = CPU0, 002 = CPU1, 004 = CPU2, 008 = CPU3, fff = CPU0-11
cat /proc/irq/*/smp_affinity | head -10

# 查看软中断分布(更完整的中断视图)
cat /proc/softirqs | head -10

如何解读:

  • /proc/interrupts 输出中,观察网卡中断在各 CPU 列上的分布。如果所有中断集中在单个 CPU(如全部在 CPU8),该 CPU 将成为中断风暴的受害者。
  • smp_affinity 的值是十六进制掩码。001 表示只绑定 CPU0,fff 表示绑定 CPU0-11(12 个核心)。如果所有 IRQ 的 smp_affinity 都是同一个很小的值(如 001),说明中断未被均衡。

解决方案(立即生效 + 持久化):

# 方法1:使用 irqbalance 服务自动均衡中断
# 已验证命令存在,实际执行需确认环境适用性
systemctl start irqbalance
systemctl enable irqbalance

# 方法2:手动设置多队列网卡的中断亲和性
# 将每个队列的中断绑定到不同的 CPU
# 例如:队列 0 绑定 CPU0,队列 1 绑定 CPU4,队列 2 绑定 CPU8...
# 具体脚本需根据实际 CPU 数量和网卡队列数编写

提醒: irqbalance 是一个后台守护进程,会自动将中断均衡分配到各 CPU。在大多数现代 Linux 发行版上,它是默认启用的。如果没有启用,systemctl start irqbalance 即可。对于需要精细控制的场景(如多 NUMA 节点),手动设置 smp_affinity 会更精确。

注意事项:

  • 多队列网卡(如 Intel X710)有多个中断号,每个队列可以绑定到不同的 CPU。建议将网卡队列数设为与 NUMA 节点内的 CPU 核心数相同。
  • 手动设置中断亲和性时,要避免将网卡中断绑定到 Vertica 资源池预留的 CPU 核心上(如果使用了 CPU Affinity)。
  • 详细信息参考 Linux 网卡软中断的查看与设置负载均衡(待迁移)。

3.5 第五步:检查 TCP Offload 状态

做什么:TCP Segmentation Offload(TSO)、Generic Segmentation Offload(GSO)、Generic Receive Offload(GRO)、Large Receive Offload(LRO)等技术将数据包的分片/重组工作从 CPU 卸载到网卡硬件。这本应提高性能,但在某些场景下——尤其是 UDP 密集的 Spread 流量中——Offload 可能导致数据包异常,引发 UDP 接收错误。

详见 Spread Debugging 第 5.4 节。

Linux 命令:

# 查看当前 Offload 状态
ethtool -k eth0

如何解读:

  • tcp-segmentation-offload: on → TSO 已启用。对于 TCP 数据通道(5434 端口),TSO 通常是有益的。
  • generic-receive-offload: on → GRO 已启用。GRO 将多个小包合并成一个大包再交给协议栈,减少中断次数。
  • large-receive-offload: on → LRO 已启用。LRO 是最容易出问题的 Offload 类型——它会忽略数据包头中的差异进行合并,可能与内核 IP 转发冲突。如果发现 UDP 接收错误持续增多,优先尝试关闭 LRO。

临时关闭 Offload(用于问题隔离):

# 关闭所有 Offload(最激进,仅用于问题诊断,不应作为长期配置)
ethtool -K eth0 sg off tso off gso off gro off lro off

警告:此命令会立即生效但重启后失效。关闭所有 Offload 会显著增加 CPU 使用率(因为数据包分片/校验和的工作回到 CPU),仅用于诊断验证,不应作为持久化配置。 如果关闭后问题消失,再逐个重新启用以定位具体是哪个 Offload 导致的问题。

3.6 第六步:检查 Bonding/LACP 状态

做什么:生产环境中,多个物理网口常通过 bonding(Linux bonding 驱动)绑定为一个逻辑接口,使用 LACP(802.3ad/mode 4)协议与交换机协商。Bonding 最常见的故障模式是 「服务器侧 bond UP,但交换机侧 LACP 异常」 ——这就是 2023 年某运营商三个租户同时夯死的根因(详见 5.1 节真实案例)。

Linux 命令:

# 查看 bonding 接口状态(将 bond0 替换为实际接口名)
cat /proc/net/bonding/bond0 2>/dev/null

# 查看所有 bonding 接口
ls /proc/net/bonding/ 2>/dev/null

# 使用 ip 命令查看 bonding 状态
ip link show type bond 2>/dev/null

如何解读 /proc/net/bonding/bond0 的输出:

重点关注以下字段:

  • Bonding Mode:应为 IEEE 802.3ad Dynamic link aggregation(mode 4 / LACP)
  • MII Status:每个 slave 接口都应为 up
  • Aggregator ID:所有 slave 接口的 Aggregator ID 应相同(说明它们属于同一个 LACP 聚合组)
  • LACP rate:通常为 slow(每 30 秒发一次 LACPDU)或 fast(每秒发一次)

最常见的故障模式——「半断」:

在 LACP 半断场景中,服务器侧的网卡状态和 MII Status 显示为 up,但交换机侧的 LACP 协商已经失败。此时:

  • ping 可能仍然通(因为物理链路是 UP 的,ICMP 包可以到达)
  • 但 UDP 吞吐量极低(因为交换机不会正常转发 LACP 组内的流量)
  • vnetperf UDP 测试可能 < 1 MB/s

验证方法——对比各节点 vnetperf 结果:

# 在集群各节点运行 vnetperf,比较 UDP 吞吐量
# 如果某节点的 UDP 接收速率显著低于其他节点(如 <1 MB/s vs 500 MB/s),
# 且该节点的 bonding 状态显示 UP,极有可能是 LACP 半断
/opt/vertica/bin/vnetperf

解决方案:

  1. 快速恢复:关闭异常节点的一个 slave 网口(退化为单链路模式),ip link set eth0 down
  2. 根本修复:联系网络团队检查交换机侧 LACP 配置——通常是 LACP mode 不匹配、key 不一致、或交换机固件 bug
  3. 预防措施:两个 slave 口应来自不同物理网卡(跨卡 bonding),而非同一张网卡的两个口——这样即使一张网卡故障,bonding 仍可正常工作

3.7 第七步:检查 MTU 与 Jumbo Frame

做什么:MTU(最大传输单元)决定了一个数据包的最大大小。默认以太网 MTU 为 1500 字节。在万兆网络中,更大的 MTU(9000 字节,即 Jumbo Frame)能减少数据包数量、降低中断频率、提高有效吞吐量。但如果集群中节点间或节点与交换机间 MTU 不一致,会导致数据包分片或丢弃。

Linux 命令:

# 查看当前 MTU
ip link show eth0 | grep mtu

# 测试到目标节点的路径 MTU(PMTUD)
ping -M do -s 8972 <目标节点IP>   # 8972 + 28 (ICMP/IP头) = 9000

如何解读:

  • 如果 ping -M do -s 8972 返回 ping: local error: message too long → 路径上的某段不支持 9000 MTU。
  • 如果 ping 通 → 整条路径支持 Jumbo Frame。

注意:

  • Jumbo Frame 要求整个二层网络路径(服务器网卡 → 交换机 → 对端服务器)都支持 9000 MTU,否则会出现问题。
  • 大多数生产环境默认使用 1500 MTU,不建议在生产环境中贸然修改为 9000,除非确保交换机已全局配置。
  • 如果 Vertica 集群的私有网络是独立的二层网络(推荐做法),可以统一配置 Jumbo Frame。

3.8 第八步:检查防火墙规则

做什么:确认 Linux 防火墙(iptables/firewalld)没有阻断 Vertica 必需的端口——特别是 Spread 使用的 4803/4804/6543 端口和节点间数据通信的 5434 端口。

这是某运营商多次宕机的根因——OS 重启后防火墙自动恢复,阻断了 Spread 通信(详见相关故障报告)。

Linux 命令:

# 检查 firewalld 状态
systemctl status firewalld

# 检查 iptables 规则
iptables -L -n -v | grep -E "4803|5434|5433"

# 使用 nc 测试端口连通性
nc -zvu <对端节点IP> 4803   # UDP 测试
nc -zv <对端节点IP> 5434    # TCP 测试

Vertica 必需的端口:

来源:Vertica 26.1.x 官方文档

端口 协议 用途
22 TCP SSH(admintools 节点间操作)
4803 TCP Spread 客户端连接
4803 UDP Spread 守护进程间通信
4804 UDP Spread 守护进程间附加通道
5433 TCP 客户端连接(vsql/JDBC/ODBC)
5433 UDP Spread 监控与管理控制台(MC)集群导入
5434 TCP 节点间/集群间数据通信
5444 TCP 管理控制台(Agent)
5450 TCP 管理控制台 Web 浏览器访问
5554 TCP 节点管理代理(Node Management Agent)
6543 UDP Spread 监控器与守护进程通信
8443 TCP HTTPS(预留)

⚠️ 关键细节:Vertica 默认使用 5434(即客户端端口 +1)作为节点间通信端口。如果 5434 不可用,Vertica 会回退到随机端口——这会导致防火墙规则失效。部署前务必确认 5434 未被占用。

解决方案:

# 如果使用 firewalld,添加永久规则
firewall-cmd --permanent --add-port=4803/tcp --add-port=4803/udp
firewall-cmd --permanent --add-port=4804/udp --add-port=6543/udp
firewall-cmd --permanent --add-port=5433/tcp --add-port=5433/udp
firewall-cmd --permanent --add-port=5434/tcp
firewall-cmd --reload

# 彻底禁用防火墙(仅限私有网络,需评估安全风险)
systemctl stop firewalld
systemctl disable firewalld

4. 解决方案

4.1 立即措施(当天可执行)

1. 调整网卡 Ring Buffer 到硬件最大值

# 已验证:RHEL 9.3 aarch64(virtio_net 最大 256,Intel X710 最大 4096)
ethtool -G eth0 rx 4096 tx 4096

为什么这个值:Ring Buffer 越大,网卡能缓冲的数据包越多,对突发流量的容忍度越高。在高吞吐量(万兆)场景下,512(默认值)可能在几十微秒内就被填满,导致 rx_drops。设为最大值 4096 能提供 8 倍的缓冲空间,几乎消除因 Buffer 不足导致的丢包。

2. 增大 Linux 网络内核参数

将以下参数写入 /etc/sysctl.conf 并执行 sysctl -p

# UDP Socket 接收缓冲区最大值 —— Spread 使用 UDP,这是最关键的参数
# 默认 212992(约 208KB)→ 调整为 16777216(16MB)
# 来自 Spread Debugging 第 5.4 节推荐值
net.core.rmem_max = 16777216

# UDP Socket 发送缓冲区最大值
net.core.wmem_max = 16777216

# 网络设备输入队列最大长度 —— 数据包到达速度超过内核处理速度时的排队深度
# 默认 1000 → 调整为 100000
net.core.netdev_max_backlog = 100000

# TCP Socket 缓冲区(数据通道的 TCP 通信)
net.ipv4.tcp_rmem = 8192 262144 8388608
net.ipv4.tcp_wmem = 8192 262144 8388608

# UDP 内存限制(按内存页,每页通常 4KB)
# 16,777,216 个内存页 × 4KB = 64GB —— 允许 UDP 在内存中缓冲大量数据
net.ipv4.udp_mem = 16777216 16777216 16777216

# UDP Socket 缓冲区最小值
net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384

为什么这些值:

  • rmem_max 从 ~208KB 调到 16MB:UDP Socket Buffer 是操作系统层面 UDP 数据包的缓冲队列。Spread 的高频 UDP Token 传递在发生瞬时抖动时,更大的 Buffer 能吸收抖动而不丢包。16MB 的取值来自 Vertica 官方 Spread 调试文档,已在多个大规模集群中验证。
  • netdev_max_backlog 从 1000 调到 100000:当数据包到达速度超过内核处理速度时,数据包在被协议栈处理前先放入 netdev_max_backlog 队列。默认值 1000 在高吞吐量万兆网络中几乎瞬间填满。

3. 启动 irqbalance 均衡中断

systemctl start irqbalance
systemctl enable irqbalance

为什么:网卡中断全部集中在单个 CPU 上会导致该 CPU 100% 满载、网络延迟上升。irqbalance 能自动将中断均衡分配到所有 CPU 核心,消除中断风暴。

4.2 短期优化(当周执行)

4. 调整网卡队列数到硬件最大值

# 查看支持的队列数
ethtool -l eth0
# 调整为最大值(如 63)
ethtool -L eth0 combined 63

为什么:多队列网卡能将收发流量分散到多个硬件队列,每个队列有独立的中断号。配合 irqbalance,每个队列的中断能被分配到不同的 CPU,实现真正的并行处理。队列数不足时,即使有多个 CPU 核心也无法充分利用。

注意:调整网卡队列后,建议重启 irqbalance 服务使其重新分配中断亲和性。

5. 验证并修复 Bonding 配置

如果集群使用 bonding(mode 4 / LACP),需要确认:

  • 两个 slave 口来自不同物理网卡(跨卡 bonding),而非同一张网卡的两个口
  • 交换机侧的 LACP 状态正常(需网络团队配合检查)
  • 如果可以,建议改为 mode 1(active-backup)作为容错方案(降级到单链路)来隔离问题

6. 将网卡调优命令持久化

创建 NetworkManager dispatcher 脚本或 systemd oneshot 服务,确保网卡参数在重启后保持:

# /etc/NetworkManager/dispatcher.d/10-ring-buffer 示例
#!/bin/bash
if [ "$2" = "up" ]; then
    ethtool -G $1 rx 4096 tx 4096
    ethtool -L $1 combined 63
fi

4.3 Spread 专项优化

7. 调整 Spread Segment 数

对于超过 50 个节点的大集群,必须配置多个 Spread Segment(大型集群模式)。每个 Segment 内有独立的 Token 环,减少单环的节点数从而降低 Token 超时风险。详细配置见 Vertica Spread 配置最佳实践

8. 为 Spread 分配独立 CPU 核心

在 CPU 高负载场景中,Spread 进程可能因 CPU 争抢导致 Token 传递延迟。通过 cgroup 将 Spread 绑定到专用 CPU 核心,确保 Token 传递不受影响:

# 配置文件示例 /etc/cgconfig.conf
group CPU_Vertica_Group {
    cpuset {
        cpuset.mems="0";
        cpuset.cpus="0-6";
    }
}
group CPU_Spread_Group {
    cpuset {
        cpuset.mems="0";
        cpuset.cpus="7";
    }
}

完整配置步骤见 Spread Debugging 第 5.6 节。

4.4 网络架构级优化

9. 网络平面分离

推荐将 Vertica 网络分为两个物理隔离的平面(来自 Vertica 数据库硬件配置指南):

  • 私有网络:节点间通信专用(Spread + 数据通道),不承载客户端流量
  • 公共网络:客户端连接用

这样即使公共网络拥塞,也不影响节点间通信。

10. 跨卡 Bonding

如果服务器有 4 个万兆网口,推荐做两组 bonding:

  • bond0:第一个网卡的 port1 + 第二个网卡的 port1(跨卡),用于私有网络
  • bond1:第一个网卡的 port2 + 第二个网卡的 port2(跨卡),用于公共网络

跨卡 bonding 的好处是:即使一张网卡故障,两组 bonding 各有至少一个口存活,保持网络连通。


5. 深入案例

5.1 真实案例:LACP 半断导致三集群同时夯死

📋 真实案例

客户行业:某通信运营商

集群规模:三个租户集群——集群A(40 节点)、集群B(28 节点)、集群C(18 节点),Vertica 9.3.1-25,操作系统 BCLinux 7.3

故障现象:2023 年 4 月 3 日,三个租户数据库在数小时内相继夯死——数据库可登录但所有 SQL 无响应,close_all_sessions()SELECT 1 也无法执行。

诊断过程

  1. 使用 vnetperf 测试各节点网络性能,发现异常节点的 UDP 接收速率 < 1 MB/s(正常值应为 500~800 MB/s)
  2. TCP 测试大量连接超时、无返回结果
  3. ping 测试:内网部分节点可以 ping 通异常节点,部分不能
  4. 最终联合网络团队排查交换机端口——发现异常节点对应的交换机端口 LACP 状态异常
  5. 服务器侧 bond 状态显示 UP,但交换机侧 LACP 协商已失败

根因LACP 半断。交换机的 LACP 协商异常导致部分流量被丢弃,但服务器侧无法感知(网卡物理状态为 UP)。TCP 有传输层自动重传兜底,UDP 包丢失后只能靠 Spread 应用层重传,且受 Token Timeout 严格限制,大量 Token 丢失后节点被驱逐。

修复方案

  • 集群B:关闭故障节点的一个 slave 网口(退化为单链路),网络立即恢复正常
  • 集群A/C:关闭单网卡无效,重启主机后恢复正常

效果:三个集群在 4~26 小时内全部恢复。事后要求网络团队全面排查交换机 LACP 配置。

教训服务器侧 bond UP ≠ 交换机侧 LACP 正常。ping 通也不等于 UDP 正常(LACP 半断时 ICMP 可能仍能到达)。网络异常排查的黄金标准是 vnetperf 的 UDP 吞吐量测试。


5.2 真实案例:中断风暴导致集群整体性能下降

📋 真实案例

客户行业:某通信运营商

集群规模:50 节点,Vertica 7.2.3-17,操作系统 SUSE 11,CPU 2×Intel Xeon E5-2650 v4,4×1Gb 网卡(2 组 bonding)

故障现象:业务侧反馈数据库性能整体变慢。

诊断过程

  1. 检查硬件资源使用率——整体不高,初步排除内存/磁盘瓶颈
  2. 检查 CPU——发现部分 CPU 使用率达到 100%
  3. 进一步检查 /proc/interrupts——发现所有网络中断处理都集中绑定在 CPU8 上

根因:网卡中断未均衡。所有网络中断被 smp_affinity 强制绑定到 CPU8,导致单核满载,无法及时处理网络中断 → 网络延迟上升 → 节点间通信变慢 → 集群整体性能下降。

修复方案:调整网卡中断的 SMP Affinity,将中断均衡分配到所有 CPU 核心。

效果:修复后网络延迟恢复正常,集群性能恢复。这是一个仅需一行配置改动就能解决全局性能问题的经典案例。

教训单 CPU 满载 ≠ 集群 CPU 资源不足。在 /proc/interrupts 中检查中断分布是排查「CPU 看似有富余但数据库反应慢」的必做步骤。


5.3 真实案例:网卡驱动兼容性与 Bonding 架构差异

📋 真实案例

客户行业:某政府机构

集群规模:Eon 模式,28 个海光(Hygon)节点 + 14 个 Intel 节点混部,Vertica 12.0.x

故障现象:海光节点的网络性能远低于 Intel 节点——UDP 吞吐量仅 200 MB/s vs Intel 的 800 MB/s,差距达 4 倍。

诊断过程

  1. 对比硬件配置:Intel(H3C R4900 G5 + Xeon Gold 6330N)vs 海光(H3C R4930 G5 H3 + Hygon C86 7390)
  2. 对比网卡固件/驱动版本:Intel 1.714.25.1 vs 海光 1.712.30-0
  3. 关键发现 1:海光使用同一张网卡的两个口做 bonding(ens2f0 + ens2f1),而 Intel 使用两张不同网卡的口(ens1f0 + ens2f0
  4. 关键发现 2:Intel 的 Ring Buffer 已设为最大值,海光未调整
  5. 关键发现 3:海光服务器的 BIOS 配置未针对高性能场景优化

根因:三重叠加——网卡固件版本不匹配 + 同卡 bonding(单卡故障影响两个口)+ Ring Buffer/内核参数未调优。

修复方案

  1. 更换到海光专属 OS 镜像(非公版)
  2. 调整 Ring Buffer 到最大值:ethtool -G ens2f0 rx 4096 tx 4096
  3. 调整网卡队列到最大值:ethtool -L ens2f0 combined 63
  4. 优化 UDP Buffer 内核参数
  5. 改为跨卡 bonding
  6. 调整 BIOS 配置(关闭 C-State、开启 Core Performance Boost 等)

效果:调整后 UDP 吞吐量从 ~200 MB/s 提升到 ~480 MB/s(平均),TCP 从 ~900 MB/s 提升到 ~1,400 MB/s。

教训异构硬件混部时必须逐项对比网络配置,不能假设同一批次的硬件具有相同的网络性能表现。


5.4 虚构案例:Ring Buffer 过小导致间歇性查询慢

📝 虚构案例

场景描述:某金融机构 24 节点 Vertica Enterprise 集群,万兆网络。用户反馈每天凌晨 ETL 期间查询偶尔特别慢(平时 3 秒的查询变成 40 秒),白天正常。集群 CPU 使用率正常(平均 50%),内存充足。

诊断过程

-- 查看 ETL 时段的网络流量
SELECT
    node_name,
    end_time,
    net_tx_kbytes_per_second,
    net_rx_kbytes_per_second
FROM v_monitor.system_resource_usage
WHERE end_time >= '2026-06-13 02:00:00'
  AND end_time <= '2026-06-13 04:00:00'
ORDER BY net_tx_kbytes_per_second DESC
LIMIT 10;

输出显示凌晨 2:00-3:00 期间,部分节点 net_tx_kbytes_per_second 达到 950,000 KB/s(接近万兆上限),但 average_cpu_usage_percent 仅 35%。说明带宽接近饱和但 CPU 不是瓶颈。

-- 查看网卡级别的丢包
SELECT
    time,
    node_name,
    interface_id,
    rx_drops,
    tx_drops,
    rx_packets
FROM v_internal.dc_network_info
WHERE interface_id != 'lo'
  AND time >= '2026-06-13 02:00:00'
  AND time <= '2026-06-13 04:00:00'
  AND (rx_drops > 0 OR tx_drops > 0)
ORDER BY time DESC;

输出显示凌晨 2:15-2:45 之间,node6 的 rx_drops 从 0 跳升到 12,000+,同时 rx_packets 也显著高于其他节点。

进一步在 Linux 层面检查:

ethtool -g ens3f0
# 输出:
Pre-set maximums:
RX:             4096
TX:             4096
Current hardware settings:
RX:             256     只有最大值的 1/16!
TX:             256

ethtool -S ens3f0 | grep drop
# rx_dropped: 1528431    ← 从系统启动以来有 150 万+ 丢包

根因:Ring Buffer 仅设为 256(硬件支持最大 4096)。ETL 期间数据加载和数据 Resegment 叠加导致瞬时网络流量暴增,Ring Buffer 在几十微秒内被填满,之后到达的数据包全部丢弃。TCP 的重传机制弥补了丢包,但每次重传引入 ~200ms 延迟,导致查询执行时间从 3 秒飙升至 40 秒。

修复方案

ethtool -G ens3f0 rx 4096 tx 4096
# 持久化:NetworkManager dispatcher 脚本或 systemd oneshot 服务

效果:调整后次日 ETL 期间 rx_drops 降为 0,查询执行时间恢复到 3~5 秒。


5.5 虚构案例:中断不平衡导致单节点拖慢整集群

📝 虚构案例

场景描述:某电商平台 12 节点 Vertica Eon 集群,万兆网络。运维发现一个奇特现象:无论什么查询,只要执行计划中包含 node5,查询时间就至少翻倍。但 node5 的 CPU 使用率仅 30%(平均水平)。

诊断过程

-- 查看各节点的系统资源
SELECT
    node_name,
    average_cpu_usage_percent,
    net_rx_kbytes_per_second,
    net_tx_kbytes_per_second
FROM v_monitor.system_resource_usage
WHERE end_time >= CURRENT_TIMESTAMP - INTERVAL '5 minutes'
ORDER BY node_name;

输出:average_cpu_usage_percent 显示 node5 的 CPU 为 28%(与其他节点相似),但 net_rx_kbytes_per_second 的波动明显比其他节点滞后——当其他节点网络流量上升时,node5 要在 15-20 秒后才跟上。这暗示 node5 的数据包处理有延迟。

Linux 层面深入排查:

# node5 上的中断分布
cat /proc/interrupts | grep -E "CPU|ens"

输出:

        CPU0  CPU1  CPU2  CPU3  CPU4  CPU5  CPU6  CPU7
ens3f0   0     0     0     0     0     0     0   8,524,319

所有网卡中断都在 CPU7 上,其他 CPU 处理的中断为 0。

# 确认 CPU7 在查询期间的使用情况
mpstat -P 7 1 5
# CPU7: 0.00% usr 0.00% sys 0.00% iowait 0.00% irq 100.00% soft
# 100% softirq —— 所有时间都在处理软中断(网卡数据包)!

根因:网卡中断全部绑定在 CPU7 上,irqbalance 服务未启动。CPU7 几乎所有时间都在处理网卡中断(softirq 100%),但 average_cpu_usage_percent 这个指标可能无法准确反映单核 softirq 的严重性(取决于监控粒度)。node5 的网卡中断处理已有 15-20 秒的延迟,导致 Spread Token 传递延迟,表现为所有涉及 node5 的查询变慢。

修复方案

systemctl start irqbalance
systemctl enable irqbalance

效果:irqbalance 启动后,中断被自动分配到所有 8 个 CPU 核心。CPU7 的 softirq 从 100% 降至 20%,所有 CPU 的中断负载趋于均衡。node5 的网络延迟恢复正常,涉及 node5 的查询时间与其他节点一致。


6. 完整诊断流程实战

📝 虚构场景 · 完整演练

背景:某金融企业 8 节点 Vertica 集群(Enterprise 模式,K-Safety=1),万兆网络。运维收到告警:凌晨 2:00-3:00 ETL 期间,多张汇总表的 INSERT...SELECT 耗时从平时的 5-8 分钟增加到 25-40 分钟。白天恢复正常。

时间线:

时间 操作 发现
08:30 接到告警 ETL 凌晨异常变慢
08:35 查询 system_resource_usage 慢查询时段 net_tx_kbytes_per_second 峰值达 1,050,000 KB/s(接近万兆极限),节点间差异大
08:40 查询 network_usage 流量最高的 3 个节点占总流量的 70%,确认是网络瓶颈
08:45 Linux 层面 ethtool -g 所有节点的 Ring Buffer 均为 RX/TX=256(最大值 4096),严重偏小
08:50 ethtool -S 凌晨时段的 rx_dropped 累计增加 80,000+,确认 Ring Buffer 溢出丢包
08:55 cat /proc/interrupts 中断分布正常(irqbalance 运行中),排除中断风暴
09:00 ethtool -k TSO/GSO/GRO 均为 on,LRO 为 off,Offload 配置合理
09:05 ip link show 检查 MTU MTU=1500,正常(集群未启用 Jumbo Frame)
09:10 iptables -L 防火墙规则正常,所需端口均已开放
09:15 结论 根因是 Ring Buffer 过小。ETL 高流量时段数据包瞬时涌入,256 大小的 Buffer 瞬间填满,导致大量丢包 → TCP 重传引入延迟 → 查询变慢
09:20 执行修复 ethtool -G ens3f0 rx 4096 tx 4096(全集群 8 个节点)
09:25 持久化 NetworkManager dispatcher 脚本确保重启后生效
次日 02:00 验证 ETL 查询耗时恢复至 5-8 分钟,rx_dropped 增长为 0

SQL 诊断汇总:

-- 步骤 1:查看慢查询时段的网络流量
SELECT node_name, end_time,
       net_tx_kbytes_per_second, net_rx_kbytes_per_second,
       net_tx_kbytes_per_second + net_rx_kbytes_per_second AS total_kb_s
FROM v_monitor.system_resource_usage
WHERE end_time BETWEEN '2026-06-13 02:00:00' AND '2026-06-13 03:00:00'
ORDER BY total_kb_s DESC LIMIT 20;

-- 步骤 2:检查是否有网络接口丢包
SELECT time, node_name, interface_id,
       rx_drops, tx_drops, rx_errors
FROM v_internal.dc_network_info
WHERE interface_id != 'lo'
  AND time BETWEEN '2026-06-13 02:00:00' AND '2026-06-13 03:00:00'
  AND (rx_drops > 0 OR rx_errors > 0)
ORDER BY time DESC;

-- 步骤 3:确认 TCP 重传统计
SELECT time, node_name,
       tcp_retrans_segs,
       CASE WHEN tcp_out_segs > 0 THEN
         ROUND(tcp_retrans_segs::numeric/tcp_out_segs*100,2)
       ELSE 0 END AS retrans_pct
FROM v_internal.dc_netstats
WHERE time BETWEEN '2026-06-13 02:00:00' AND '2026-06-13 03:00:00'
ORDER BY retrans_pct DESC LIMIT 10;

7. 快速诊断 SQL 工具箱

诊断目标 SQL / 命令 说明
全局网络流量概况 SELECT node_name, end_time, net_tx_kbytes_per_second, net_rx_kbytes_per_second FROM v_monitor.system_resource_usage WHERE end_time >= CURRENT_TIMESTAMP - INTERVAL '10 minutes' ORDER BY node_name, end_time DESC; 快速判断各节点网络负载是否均衡
网络接口级流量 SELECT node_name, tx_kbytes_per_sec, rx_kbytes_per_sec FROM v_monitor.network_usage WHERE end_time >= CURRENT_TIMESTAMP - INTERVAL '10 minutes' ORDER BY node_name; 比 system_resource_usage 更细粒度
网卡丢包统计 SELECT time, node_name, interface_id, rx_drops, tx_drops FROM v_internal.dc_network_info WHERE interface_id != 'lo' AND rx_drops > 0 AND time >= CURRENT_TIMESTAMP - INTERVAL '1 hour' ORDER BY time DESC; 判断 Ring Buffer 是否溢出
TCP 重传率 SELECT time, node_name, ROUND(tcp_retrans_segs::numeric/tcp_out_segs*100,2) AS retrans_pct FROM v_internal.dc_netstats WHERE tcp_out_segs > 0 AND time >= CURRENT_TIMESTAMP - INTERVAL '1 hour' ORDER BY retrans_pct DESC LIMIT 10; > 1% 需关注,> 2% 需立即处理
UDP 错误 SELECT time, node_name, udp_in_errors, udp_in_datagrams FROM v_internal.dc_netstats WHERE udp_in_errors > 0 AND time >= CURRENT_TIMESTAMP - INTERVAL '1 hour'; 非零即需增大 UDP Buffer
网卡速率/双工 ethtool eth0 \| grep -E "Speed\|Duplex" 确认万兆全双工
Ring Buffer 大小 ethtool -g eth0 Current vs Maximum,差异大需调整
Offload 状态 ethtool -k eth0 \| grep -E "tso\|gso\|gro\|lro" 排查 Offload 导致的问题
中断分布 cat /proc/interrupts \| grep -E "CPU\|eth0" 是否所有中断集中单 CPU
Bonding 状态 cat /proc/net/bonding/bond0 检查 LACP 和 MII Status
网络吞吐量基准 /opt/vertica/bin/vnetperf UDP < 200 MB/s 或 TCP < 500 MB/s 需排查
防火墙端口检查 iptables -L -n -v \| grep -E "4803\|5434" 确保关键端口未被阻断

8. 最佳实践清单

序号 实践 为什么
1 将网卡 Ring Buffer 设为硬件最大值 Ring Buffer 是最小投入最大收益的网络优化。对于万兆网卡,512 → 4096 的调整可以消除 90% 以上的 rx_drops,且无任何副作用
2 增大 UDP Socket Buffer(net.core.rmem_max = 16MB) Spread 控制通道走 UDP,默认 ~208KB 的 Buffer 在万兆网络中可能在几十微秒内被填满。16MB 来自 Vertica 官方推荐,能吸收网络瞬时抖动
3 启用并验证 irqbalance 网卡中断集中单核是最常见但最隐蔽的性能杀手——top 显示 CPU 不高,但单核 softirq 已 100%。irqbalance 自动均衡,无需手动维护
4 使用 vnetperf 做网络性能基准,而非依赖 ping ping 只能测 ICMP 可达性,无法反映 UDP/TCP 吞吐量。LACP 半断时 ping 可能正常但 UDP 速率 < 1 MB/s
5 跨卡 Bonding(两个 slave 来自不同物理网卡) 同一张网卡的两个口做 bonding,当网卡故障时两个口同时失效,bonding 形同虚设
6 私有网络与公共网络平面分离 客户端查询流量不会挤压节点间通信带宽,避免「查询慢导致网络挤占 → 节点通信超时 → 集群宕机」的连锁故障
7 生产环境网络参数在 OS 装机时就调优 sysctl 网络参数和 Ring Buffer 配置应在部署 Vertica 之前完成。等出现故障再调整,每次调整都可能涉及节点重启或网络中断
8 配置防火墙白名单而非「遇到问题再关」 OS 重启后防火墙可能自动恢复,导致 Spread 4803 端口被阻断。永久禁用或配置白名单,消除这个定时炸弹
9 关闭 LRO(Large Receive Offload) LRO 是 Offload 中最容易出问题的类型——它忽略数据包头差异进行合并,可能与 IP 转发冲突。TSO/GSO/GRO 通常可以保留
10 监控 v_internal.dc_netstats 的 TCP 重传率和 UDP 错误 这些是网络质量的前置指标——TCP 重传率上升 ( > 1%) 往往比用户感知到「数据库变慢」早数小时甚至数天
11 大集群( > 50 节点)必须配置多 Spread Segment 单 Segment 中 Token 传递延迟随节点数线性增长。多 Segment 将 Token 环分片,降低单环节点数,避免 Token 超时(来源:Spread Debugging 5.1 节)
12 网络变更前必须先停库 交换机配置修改、网卡重启、IPv6 配置、网段调整等网络操作会导致节点间通信中断 → 节点自杀 → 逻辑相邻节点先后宕机。曾有案例因网络团队做 IPv6 配置未通知数据库团队停库,同一天内两次集群宕机。正确流程:通知所有相关团队 → admintools -t stop_db → 确认进程退出 → 执行变更 → vnetperf 验证 → 启动数据库

扩展阅读