第 9 篇:「Fluss 运维实战」------ 部署、监控与故障排查
阅读本文你将了解: Fluss 的三种部署方式、Kubernetes Helm Chart 部署、Prometheus + Grafana 监控配置、日常运维操作(扩缩容、备份恢复),以及 Top 10 常见故障排查手册。
9.1 部署方式
9.1.1 Docker Compose(开发/测试)
yaml
# docker-compose.yml
version: '3.8'
services:
zookeeper:
image: zookeeper:3.9
ports:
- "2181:2181"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zookeeper:2888:3888;2181
volumes:
- zk_data:/data
- zk_log:/datalog
coordinator-server:
image: apache/fluss:0.9.1
command: coordinatorServer
depends_on:
- zookeeper
ports:
- "9123:9123"
environment:
ZOOKEEPER_ADDRESS: zookeeper:2181
COORDINATOR_HOST: coordinator-server
COORDINATOR_PORT: 9123
volumes:
- coordinator_data:/data
tablet-server-1:
image: apache/fluss:0.9.1
command: tabletServer
depends_on:
- coordinator-server
environment:
ZOOKEEPER_ADDRESS: zookeeper:2181
TABLET_SERVER_HOST: tablet-server-1
DATA_DIR: /data/tablet
volumes:
- ts1_data:/data
tablet-server-2:
image: apache/fluss:0.9.1
command: tabletServer
depends_on:
- coordinator-server
environment:
ZOOKEEPER_ADDRESS: zookeeper:2181
TABLET_SERVER_HOST: tablet-server-2
DATA_DIR: /data/tablet
volumes:
- ts2_data:/data
volumes:
zk_data:
zk_log:
coordinator_data:
ts1_data:
ts2_data:
9.1.2 Kubernetes(Helm Chart)
bash
# 添加 Fluss Helm Repository
helm repo add fluss https://apache.github.io/fluss/
helm repo update
# 安装 Fluss 集群
helm install fluss-cluster fluss/fluss \
--namespace fluss \
--create-namespace \
--set coordinator.replicas=3 \
--set tabletServer.replicas=6 \
--set tabletServer.resources.requests.memory=16Gi \
--set tabletServer.resources.requests.cpu=4 \
--set persistence.size=500Gi \
--set zookeeper.enabled=false \
--set s3.endpoint=https://s3.amazonaws.com \
--set s3.bucket=my-fluss-bucket
Helm values 关键配置:
yaml
# values.yaml (关键部分)
coordinator:
replicas: 3 # 高可用:3 个 Coordinator
resources:
requests:
memory: "8Gi"
cpu: "2"
limits:
memory: "16Gi"
cpu: "4"
tabletServer:
replicas: 6
resources:
requests:
memory: "32Gi" # TabletServer 需要较大内存
cpu: "8"
persistence:
size: 1Ti # 本地 SSD 用于 Hot Tier
config:
# JVM 配置
heapSize: "28g"
directMemorySize: "4g" # Arrow 使用堆外内存
# RocksDB 配置
kvStoreBlockCacheSize: "8g"
kvStoreWriteBufferSize: "256m"
9.1.3 裸机部署
bash
# 下载 Fluss
wget https://dlcdn.apache.org/fluss/0.9.1/fluss-0.9.1-bin.tar.gz
tar -xzf fluss-0.9.1-bin.tar.gz
cd fluss-0.9.1
# 配置 conf/fluss-conf.yaml
cat > conf/fluss-conf.yaml << 'EOF'
# ZooKeeper
zookeeper.address: zk1:2181,zk2:2181,zk3:2181
# Coordinator
coordinator.host: coord-1
coordinator.port: 9123
# TabletServer
tablet.server.host: ts-1
data.dir: /data/fluss
# 远程存储(S3)
remote.data.dir: s3://my-bucket/fluss/
s3.endpoint: https://s3.amazonaws.com
s3.access-key: YOUR_KEY
s3.secret-key: YOUR_SECRET
# 日志
log.dir: /var/log/fluss
EOF
# 启动
bin/fluss-coordinator.sh start
bin/fluss-tablet-server.sh start
# 验证
bin/fluss-cluster.sh status
9.2 集群关键配置参数
9.2.1 CoordinatorServer 参数
| 参数 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|
coordinator.port |
9123 | 9123 | RPC 端口 |
zookeeper.address |
localhost:2181 | zk1:2181,zk2:2181 | ZK 地址 |
zookeeper.session.timeout |
30000ms | 60000ms | ZK 会话超时 |
tablet.assignment.balance.interval |
300s | 300s | Rebalance 检查间隔 |
coordinator.heap.size |
4g | 8g-16g | JVM 堆大小 |
9.2.2 TabletServer 参数
| 参数 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|
data.dir |
/tmp/fluss | /data/fluss | 数据目录(SSD推荐) |
log.segment.size |
1GB | 1GB-4GB | Log Segment 大小 |
log.segment.retention.hours |
72h | 24h-72h | Segment 保留时间 |
kv.store.block.cache.size |
256MB | 4GB-16GB | RocksDB Block Cache |
kv.store.write.buffer.size |
64MB | 128MB-256MB | 写缓冲区大小 |
9.3 监控指标
9.3.1 Fluss Metrics 架构
Fluss 使用 fluss-metrics 模块暴露指标,支持 Prometheus 格式:
TabletServer 关键指标:
├── fluss_tablet_log_write_rate # 日志写入速率 (records/sec)
├── fluss_tablet_log_read_rate # 日志读取速率
├── fluss_tablet_kv_put_rate # KV 写入速率
├── fluss_tablet_kv_get_rate # KV 读取速率
├── fluss_tablet_kv_get_latency_p99 # KV P99 延迟
├── fluss_tablet_disk_usage_bytes # 磁盘使用量
├── fluss_tablet_segment_count # Segment 数量
├── fluss_tablet_active_connections # 活跃连接数
└── fluss_tablet_tiering_offset_lag # Tiering 延迟
CoordinatorServer 关键指标:
├── fluss_coordinator_active_tablets # 活跃 Tablet 数
├── fluss_coordinator_under_replicated # 副本不足的 Tablet
├── fluss_coordinator_rebalance_count # Rebalance 次数
└── fluss_coordinator_request_latency # 请求延迟
9.3.2 Prometheus 配置
yaml
# prometheus.yml
scrape_configs:
- job_name: 'fluss-coordinator'
static_configs:
- targets: ['coord-1:9249', 'coord-2:9249', 'coord-3:9249']
metrics_path: '/metrics'
- job_name: 'fluss-tablet-server'
static_configs:
- targets:
- 'ts-1:9250'
- 'ts-2:9250'
- 'ts-3:9250'
- 'ts-4:9250'
- 'ts-5:9250'
- 'ts-6:9250'
metrics_path: '/metrics'
9.3.3 Grafana Dashboard
关键告警规则:
yaml
# alerting_rules.yml
groups:
- name: fluss_alerts
rules:
- alert: TabletServerDown
expr: up{job="fluss-tablet-server"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "TabletServer {{ $labels.instance }} is down"
- alert: HighKvLatency
expr: fluss_tablet_kv_get_latency_p99 > 100
for: 5m
labels:
severity: warning
annotations:
summary: "KvStore P99 latency > 100ms on {{ $labels.instance }}"
- alert: DiskUsageHigh
expr: fluss_tablet_disk_usage_bytes / fluss_tablet_disk_total_bytes > 0.85
for: 10m
labels:
severity: warning
annotations:
summary: "Disk usage > 85% on {{ $labels.instance }}"
- alert: TieringLag
expr: fluss_tablet_tiering_offset_lag > 10000000
for: 15m
labels:
severity: warning
annotations:
summary: "Tiering lag > 10M records on {{ $labels.instance }}"
9.4 Top 10 故障排查
故障 1:OOM(内存溢出)
症状:TabletServer 进程频繁重启,日志中有 OutOfMemoryError
排查:
1. 检查 JVM 堆配置:bin/fluss-tablet-server.sh -Xmx?
2. 检查堆外内存(Direct Memory):Arrow RecordBatch 使用 Direct Memory
3. 检查 RocksDB Block Cache 大小
解决:
# 增加 JVM 堆
export FLUSS_HEAP_OPTS="-Xms16g -Xmx16g"
# 增加 Direct Memory
export FLUSS_DIRECT_MEMORY="-XX:MaxDirectMemorySize=8g"
# 降低 Block Cache
SET kv.store.block.cache.size = '2g'
故障 2:磁盘写满
症状:写入报错 "No space left on device"
排查:
1. df -h 检查磁盘使用率
2. 检查 LogSegment 保留策略是否正确
3. 检查 Tiering 是否正常工作
解决:
# 清理过期 Segment
bin/fluss-cleanup.sh --older-than 24h
# 或缩短保留时间
ALTER TABLE orders SET ('log.segment.retention.hours' = '24');
# 确保 Tiering 正常运行
# 查看 Tiering 延迟
curl http://coordinator:9249/metrics | grep tiering_offset_lag
故障 3:网络分区
症状:部分 TabletServer 不可达,Leader 切换频繁
排查:
1. ping/telnet 检查网络连通性
2. 检查 ZooKeeper 是否正常:echo stat | nc zk 2181
3. 检查 Coordinator 日志中的连接超时
解决:
# 增加网络超时
SET zookeeper.session.timeout = '120000'
# 重启受影响的 TabletServer
bin/fluss-tablet-server.sh restart
故障 4:数据倾斜
症状:部分 TabletServer 负载过高,I/O 和 CPU 不均衡
排查:
1. 检查各 TabletServer 的 Tablet 数量分布
2. 检查热点 Bucket(写入 QPS 最高的 Bucket)
解决:
# 增加 Bucket 数量
ALTER TABLE hot_table SET ('bucket.num' = '64');
# 触发手动 Rebalance
bin/fluss-rebalance.sh --table hot_table
故障 5:Checkpoint 失败
症状:Flink 任务 Checkpoint 超时
排查:
1. Flink UI 查看 Checkpoint 历史
2. Fluss 日志中是否有慢写入
解决:
# 增加 Checkpoint 超时
env.enableCheckpointing(300000); // 5 分钟
# 减少 Flink 并行度或增加 Fluss TabletServer
故障 6:RocksDB Compaction 卡顿
症状:KvStore 写入延迟飙升
排查:
1. 检查 RocksDB 日志中的 Compaction 统计
2. 检查是否触发了 Level 0 → Level 1 的大 Compaction
解决:
# 增加写缓冲区
SET kv.store.write.buffer.size = '256m'
SET kv.store.max.write.buffer.number = '4'
# 限制后台 Compaction 线程
SET kv.store.max.background.compactions = '2'
故障 7:ZooKeeper 连接超时
症状:CoordinatorServer 不断重连 ZooKeeper
解决:
# 增加 ZK 超时
SET zookeeper.connection.timeout = '30000'
SET zookeeper.session.timeout = '120000'
故障 8:S3 上传失败
症状:Tiering Service 日志报 S3 错误
排查:
1. 验证 S3 凭证是否过期
2. 检查网络是否可达 S3 endpoint
解决:
# 更新凭证
SET s3.access-key = 'NEW_KEY'
SET s3.secret-key = 'NEW_SECRET'
# 使用 AssumeRole
SET s3.credentials.provider = 'STSAssumeRoleSessionCredentialsProvider'
SET s3.role.arn = 'arn:aws:iam::123456789:role/FlussTieringRole'
故障 9:Schema 不兼容
症状:写入报 Schema 错误
排查:
1. 检查写入数据的 Schema 是否与表 Schema 匹配
2. 是否存在未知的新列
解决:
# 添加缺失的列
ALTER TABLE my_table ADD COLUMN new_field STRING;
故障 10:Flink Connector 版本不匹配
症状:ClassNotFoundException 或 MethodNotFoundException
解决:
# 确 Flink 与 Fluss 版本兼容
# Fluss 0.9.1 支持 Flink 1.18 / 1.19 / 1.20 / 2.2
<dependency>
<groupId>org.apache.fluss</groupId>
<artifactId>fluss-flink-${您的Flink主版本}</artifactId>
<version>0.9.1</version>
</dependency>
9.5 备份与恢复
9.5.1 备份策略
数据备份层次:
Hot Tier (Fluss):
├── LogTablet:通过 ISR 副本天然备份(3 副本)
└── KvTablet:通过 WAL + Remote Storage Snapshot 备份
Cold Tier (Iceberg/Paimon):
└── Parquet 文件在 S3 上天然持久化 + 版本管理
Metadata (ZooKeeper):
└── 定期备份 ZK 数据目录
9.5.2 灾难恢复
bash
# 1. 恢复 ZooKeeper 元数据
cp /backup/zookeeper/version-2/* /data/zookeeper/version-2/
# 2. 启动新集群
bin/fluss-coordinator.sh start
bin/fluss-tablet-server.sh start
# 3. 从 Remote Storage 恢复 KvStore
# Fluss 自动检测本地缺失的 KvTablet 并从 Remote Storage 下载 Snapshot
# 然后从 LogTablet 重放 WAL 恢复到最新状态
# 4. 验证恢复
bin/fluss-cluster.sh status
bin/fluss-cluster.sh verify-tables
9.6 总结与下一篇预告
| 运维领域 | 关键工具/参数 |
|---|---|
| 部署 | Docker Compose、Helm Chart、裸机部署三种方式 |
| 监控 | fluss-metrics → Prometheus → Grafana |
| 告警 | TabletServer Down、高延迟、磁盘满、Tiering 延迟 |
| 故障排查 | 10 大常见故障:OOM、磁盘满、网络分区、数据倾斜等 |
| 扩缩容 | ALTER TABLE bucket.num + bin/fluss-rebalance.sh |
| 备份恢复 | ISR 副本 + Remote Storage Snapshot + WAL 重放 |
下一篇也是最后一篇------我们将通过 5 个完整的生产级实战案例,展示 Fluss 在电商大屏、特征存储、CDC 管道、风控系统、客户 360 等场景中的端到端解决方案。
本文基于 Apache Fluss 0.9.1 运维实践。项目 GitHub: https://github.com/apache/fluss