跳转至

Vertica 3 节点集群安装部署完全指南

作者:JiangChong | 撰写时间:2026年06月

适用场景:你已完成单节点安装,想搭一套 3 节点集群体验 MPP 分布式能力(并行查询、数据分段、节点容错)。

读完本文你将能够

  • 在 3 台服务器上完成 Vertica 集群的安装和配置
  • 理解多节点和单节点的关键差异(K-Safe、Spread、分段)
  • 亲手验证 MPP 并行执行和数据分布
  • 模拟单节点宕机,观察集群自动容错

前提:3 台 Linux 服务器(物理机或虚拟机),每台已完成 Vertica 单节点安装部署完全指南 中 §2 的系统配置(防火墙、SELinux、hosts、依赖、内核参数)。以下假设三节点 IP 为 10.0.0.110.0.0.210.0.0.3


1. 拓扑规划

┌──────────────┐   ┌──────────────┐   ┌──────────────┐
│   node01     │   │   node02     │   │   node03     │
│  10.0.0.1    │   │  10.0.0.2    │   │  10.0.0.3    │
└──────┬───────┘   └──────┬───────┘   └──────┬───────┘
       │ Spread UDP 4803  │                  │
       └──────────────────┴──────────────────┘
            SSH 互信 + NTP 时间同步

三个节点地位对等——没有主从之分。你从哪个节点连入 vsql,那个节点就是当次查询的 initiator(接收查询、汇总结果),同时自己也参与并行计算(initiator 也是 executor)。install_vertica 在 node01 执行只是因为你在那台机器上操作,不代表它是「主节点」。

生产环境推荐最少 3 节点,K-Safe=1(每份数据有 buddy 副本,容忍 1 节点宕机)。


2. 三节点系统配置

以下操作需要在所有 3 个节点上执行。可以用 for 循环或配置管理工具批量操作。

2.1 基础配置(单节点指南已覆盖)

参照 Vertica 单节点安装部署完全指南 §2 完成:

  • 关闭防火墙(systemctl mask firewalld + disable + stop
  • 关闭 SELinux(setenforce 0 + 永久配置)
  • 安装依赖(perl sudo which dialog openssh-server openssh-clients + 启动 sshd)
  • 内核参数(vm.dirty_ratio 等 sysctl 配置)

2.2 统一 /etc/hosts

三个节点的 hosts 文件必须一致,每个节点都能用主机名解析到其他节点的真实 IP:

# 在每个节点上执行(替换为实际 IP 和主机名)
cat >> /etc/hosts << 'EOF'
10.0.0.1  node01
10.0.0.2  node02
10.0.0.3  node03
EOF

验证:在每个节点上 ping node01ping node02ping node03 都能通。

2.3 NTP 时间同步

集群节点间时间不同步会导致 spread 通信异常和数据不一致:

# RHEL/Rocky
yum install -y chrony
systemctl start chronyd
systemctl enable chronyd

# 验证同步状态
chronyc tracking | grep "Leap status"
# 输出应为:Leap status : Normal

踩坑:节点间时间相差过大可能导致 spread 反复重连,安装或启动卡住。

2.4 SSH 免密互信

Vertica 通过 SSH 在节点间执行管理命令。需要在 node01(执行 install_vertica 的节点)上配置到所有节点(包括自己)的免密登录:

# 在 node01 上以 root 执行
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa

# 拷贝公钥到所有 3 个节点(包括 node01 自己)
for ip in 10.0.0.1 10.0.0.2 10.0.0.3; do
  ssh-copy-id root@$ip
done

# 验证免密登录(不应提示输入密码)
for ip in 10.0.0.1 10.0.0.2 10.0.0.3; do
  ssh root@$ip "hostname"
done

踩坑:如果 ssh-copy-idPermission denied,检查 /etc/ssh/sshd_configPermitRootLogin yesPasswordAuthentication yes 是否已配置,修改后 systemctl restart sshd


3. 安装 Vertica

3.1 在所有节点安装 RPM

# 在每个节点上使用root执行(或通过 for 循环批量执行)
rpm -ivh /tmp/vertica-<version>.x86_64.RHEL8.rpm

3.2 运行 install_vertica(集群模式)

在 node01 上执行,--hosts 列出所有 3 个节点 IP:

/opt/vertica/sbin/install_vertica \
  --hosts 10.0.0.1,10.0.0.2,10.0.0.3 \
  --dba-user-password-disabled \
  --point-to-point \
  --failure-threshold FAIL

与单节点的唯一区别:--hosts 从 1 个 IP 变成了逗号分隔的 3 个 IP。脚本会自动:

  • 在每个节点上创建 dbadmin 用户
  • 配置所有节点间dbadmin用户的 SSH 互信(基于 root 的免密)
  • 在所有节点上检查并调整内核参数
  • 配置 spread 通信(3 节点间 UDP 4803 互通)

看到 Installation complete 即所有节点安装成功。


4. 创建数据库

4.1 创建数据目录

# 在每个节点上以 root 执行
mkdir -p /data/vertica
chown -R dbadmin:verticadba /data/vertica

4.2 创建数据库(K-Safe=1)

# 在 node01 上以 dbadmin 执行
/opt/vertica/bin/admintools -t create_db \
  -d vmart \
  -s 10.0.0.1,10.0.0.2,10.0.0.3 \
  -D /data/vertica \
  -p <设置你的数据库dbadmin用户密码>

与单节点的区别:

  • -s 列出了 3 个节点 IP
  • 默认 K-Safe=1(3 节点自动启用,每份数据有 buddy 副本)

创建后数据库自动启动。确认:

# 在 node01 上以 dbadmin 执行
/opt/vertica/bin/admintools -t list_db -d vmart

5. 集群验证

5.1 检查所有节点

vsql -U dbadmin -w <你设置的数据库dbadmin用户密码>
SELECT node_name, node_state, node_address FROM nodes;

预期输出 3 行,全部 UP

     node_name      | node_state | node_address
--------------------+------------+--------------
 v_vmart_node0001   | UP         | 10.0.0.1
 v_vmart_node0002   | UP         | 10.0.0.2
 v_vmart_node0003   | UP         | 10.0.0.3
(3 rows)

5.2 检查 K-Safety

SELECT current_fault_tolerance FROM system;
-- 应返回 1(可容忍 1 节点宕机)

5.3 检查数据分布

创建一张分段表来验证数据在 3 个节点上的分布:

CREATE TABLE cluster_test (
    id   INTEGER,
    val  VARCHAR(50)
)
SEGMENTED BY HASH(id) ALL NODES;

-- 插入 100 行测试数据
INSERT INTO cluster_test SELECT n, 'data-' || n FROM (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10) t1
CROSS JOIN (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10) t2;
COMMIT;

-- 查看每个节点上存储了多少行
SELECT node_name, sum(row_count) AS rows
FROM projection_storage
WHERE anchor_table_name = 'cluster_test'
GROUP BY node_name
ORDER BY node_name;

预期输出:100 行数据大致均匀分布在 3 个节点上(hash 分布可能有轻微偏差)。


6. 体验 MPP 分布式能力

6.1 分段表 vs 非分段表的执行计划对比

-- 创建一张不分段的表做对比
CREATE TABLE unseg_test (id INT, val VARCHAR(50)) UNSEGMENTED ALL NODES;
-- 对比执行计划
EXPLAIN SELECT COUNT(*) FROM cluster_test;     -- SEGMENTED

Access Path:
+-GROUPBY NOTHING [Cost: 2, Rows: 1]
|  Aggregates: count(*)
|  Execute on: All Nodes            3 节点并行计算
| +---> STORAGE ACCESS for cluster_test
| |      Execute on: All Nodes
EXPLAIN SELECT COUNT(*) FROM unseg_test;       -- UNSEGMENTED

Access Path:
+-GROUPBY NOTHING [Cost: 3, Rows: 1]
|  Aggregates: count(*)
|  Execute on: Query Initiator      只在发起节点计算
| +---> STORAGE ACCESS for unseg_test
| |      Execute on: Query Initiator

关键区别:分段表的 Execute on: All Nodes 说明 3 个节点都在干活——这就是 MPP 并行能力的来源。非分段表只有发起节点在工作,浪费了另外 2 个节点的算力。

6.2 观察 JOIN 策略

当两张表按同一列分段时,JOIN 不需要跨节点搬运数据(Local Join):

CREATE TABLE orders (
    order_id   INTEGER,
    item       VARCHAR(50)
) SEGMENTED BY HASH(order_id) ALL NODES;

EXPLAIN SELECT * FROM cluster_test c JOIN orders o ON c.id = o.order_id;

执行计划中如果看到 Locally 而非 BROADCASTRESEGMENT,说明 JOIN 在各节点本地完成,没有网络搬运——这是分段设计最直接的性能收益。

6.3 模拟节点宕机

停掉一个节点,观察集群是否继续正常服务:

# 在 node03 上以 dbadmin 执行
/opt/vertica/bin/admintools -t stop_node -s 10.0.0.3 -p <密码>

回到 node01 执行查询:

SELECT node_name, node_state FROM nodes;
-- node03 显示 DOWN

-- 查询仍然正常返回!
SELECT COUNT(*) FROM cluster_test;
-- 100(数据从 buddy 副本读取,无数据丢失)

恢复节点:

# 在任意节点上
/opt/vertica/bin/admintools -t restart_node -d vmart -s 10.0.0.3 -p <密码>

# 再次检查
SELECT node_name, node_state FROM nodes;
-- node03 恢复 UP

这就是 K-Safe=1 的核心价值:单节点宕机不丢数据、不停服务。想在 K-Safe=0 的单节点环境做这个实验?那就只能看到数据库直接挂掉。


7. 常用管理命令速查

操作 命令 说明
启动数据库 /opt/vertica/bin/admintools -t start_db -d <db> -p <pwd> 使用dbadmin用户执行
停止数据库 /opt/vertica/bin/admintools -t stop_db -d <db> -p <pwd> 使用dbadmin用户执行
停止单个节点 /opt/vertica/bin/admintools -t stop_node -s <ip> -p <pwd> 使用dbadmin用户执行;用于模拟宕机
启动单个节点 /opt/vertica/bin/admintools -t restart_node -d <db> -s <ip> -p <pwd> 使用dbadmin用户执行
查看所有节点 SELECT * FROM nodes; 关注 node_state
查看 K-Safety SELECT current_fault_tolerance FROM system; 1=可容忍1节点宕机
查看数据分布 SELECT node_name, sum(row_count) FROM projection_storage WHERE anchor_table_name='<tbl>' GROUP BY 1; 验证分段是否均匀
查看执行计划 EXPLAIN SELECT ... 关注 Execute on 是 All Nodes 还是 Query Initiator

8. 常见踩坑与解决

8.1 SSH 免密未配通

现象install_vertica 卡在 Testing SSH connectivity 或报 Permission denied

解决

# 在 node01 上逐一验证免密
ssh root@10.0.0.1 "hostname"
ssh root@10.0.0.2 "hostname"
ssh root@10.0.0.3 "hostname"
# 任何一条需要密码就说明免密没配好,重新 ssh-copy-id

8.2 节点间时间不同步

现象install_vertica 过程中 spread 反复重连,启动后节点频繁 DOWN/UP 切换。

解决

# 在所有节点上检查时间差
for ip in 10.0.0.1 10.0.0.2 10.0.0.3; do
  ssh root@$ip "date '+%Y-%m-%d %H:%M:%S.%N'"
done
# 如果相差较大,检查 NTP/chrony 配置

8.3 Spread 通信失败

现象:安装过程报 spread error -18,或节点间无法通信。

解决:三节点必须能通过 UDP 4803 互通:

# 在每个节点上检查
ss -tunlp | grep 4803

# 确认防火墙完全关闭(见单节点指南 §2.1)
# 云主机额外检查安全组是否放行 UDP 4803


9. 延伸阅读