第 9 篇:「Fluss 运维实战」—— 部署、监控与故障排查

第 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;
复制代码
症状: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

相关推荐
.冰块.1 小时前
两套完整 Linux 建站实战:Wordpress 博客(LAMP)+ECShop 电商(LNMP)全套手册
linux·运维·项目实战·lnmp·lamp·电商平台·博客平台
杨云龙UP1 小时前
生产环境MySQL多实例XtraBackup全量备份与rsync异地自动传输实践
linux·运维·数据库·mysql·xtrabackup·主从复制·备份恢复
XR1234567882 小时前
医院有线无线一体化运维选型指南
运维
刘梦薇3 小时前
SSH连接失败connection reset解决办法
linux·运维·ubuntu·ssh·腾讯云
Rsingstarzengjx3 小时前
stm32m157 U-boot 测试
linux·运维·服务器
头茬韭菜4 小时前
功能点 1:项目骨架与启动流程 —— 源码阅读笔记
运维·笔记·debian·fluss
workflower4 小时前
智能无人机成低空经济核心赛道
运维·人工智能·机器学习·机器人·云计算·无人机
张小姐的猫4 小时前
【Linux】网络编程 —— 传输层协议 TCP(下)
linux·运维·服务器·网络·tcp/ip·http·php
程序员AlbertTu5 小时前
第2章 上手 Linux:环境与文件操作
linux·运维·服务器