Vertica 3 节点集群安装部署完全指南¶
作者:JiangChong | 撰写时间:2026年06月
适用场景:你已完成单节点安装,想搭一套 3 节点集群体验 MPP 分布式能力(并行查询、数据分段、节点容错)。
读完本文你将能够:
- 在 3 台服务器上完成 Vertica 集群的安装和配置
- 理解多节点和单节点的关键差异(K-Safe、Spread、分段)
- 亲手验证 MPP 并行执行和数据分布
- 模拟单节点宕机,观察集群自动容错
前提:3 台 Linux 服务器(物理机或虚拟机),每台已完成 Vertica 单节点安装部署完全指南 中 §2 的系统配置(防火墙、SELinux、hosts、依赖、内核参数)。以下假设三节点 IP 为 10.0.0.1、10.0.0.2、10.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 node01、ping node02、ping 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-id报Permission denied,检查/etc/ssh/sshd_config中PermitRootLogin yes和PasswordAuthentication yes是否已配置,修改后systemctl restart sshd。
3. 安装 Vertica¶
3.1 在所有节点安装 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 创建数据目录¶
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 副本)
创建后数据库自动启动。确认:
5. 集群验证¶
5.1 检查所有节点¶
预期输出 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¶
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 非分段表的执行计划对比¶
-- 对比执行计划
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 而非 BROADCAST 或 RESEGMENT,说明 JOIN 在各节点本地完成,没有网络搬运——这是分段设计最直接的性能收益。
6.3 模拟节点宕机¶
停掉一个节点,观察集群是否继续正常服务:
回到 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 互通:
9. 延伸阅读¶
- 理解核心概念:→ Vertica 新手入门 — 从核心概念到第一条 SQL:集群跑起来后,系统学习核心概念和 SQL 操作。
- 深入 MPP 架构:
- MPP 列存引擎的架构设计哲学
- MPP JOIN 策略全解析与优化器决策逻辑
- MPP 数据分布策略:深入理解 Hash 分段、Local Join 的原理和最佳实践。
- MPP 并行执行引擎原理
- 集群运维:
- Vertica 集群 Rebalance 完全指南:后续扩容缩容时,数据如何重新分布。
- K-Safety 最佳实践
- Vertica Spread 配置最佳实践
- 节点故障处理:→ Vertica 节点恢复过程