当前位置: 首页 > news >正文

Kafka 多机房、跨集群复制、多租户、硬件与操作系统、全栈监控

1. 多数据中心部署(Datacenters)

1.1 推荐模式:每机房一套本地集群 + 集群间镜像

  • 在每个数据中心部署本地 Kafka 集群,应用只访问本地集群;跨机房的数据需要通过镜像(Geo-Replication)在集群间复制。

  • 好处:

    • 机房之间的复制由中心化方式统一治理与调优;
    • 任一机房可独立运行:跨机房链路不可用时,镜像滞后,链路恢复后自动追平;
    • 可额外构建汇总集群承载全量只读查询(本地集群 → 汇总集群)。

1.2 其他可选模式与网络参数

  • 也可以直接跨广域网访问远端集群,但不可避免引入网络时延。

  • Kafka 的生产者/消费者天然做批处理,即使高延迟链路也能获得高吞吐;必要时增大 TCP 缓冲:

    • socket.send.buffer.bytes
    • socket.receive.buffer.bytes
  • 不建议在高延迟链路上做跨机房单一集群(一个集群跨多个 DC):写入复制延迟会非常大,且跨机房网络故障会影响可用性。

2. 跨集群地理复制(Geo-Replication / MirrorMaker 2)

2.1 概览与典型场景

  • 通过 MirrorMaker 2(MM2) 定义跨集群/跨机房/跨区域的数据流:灾备、边缘汇聚到中心、生产与测试隔离、云迁移/混合云、合规隔离等。

  • MM2 基于 Kafka Connect,关键能力:

    • 复制 Topic(数据 + 配置)、消费者组与位移(迁移应用)、ACL保留分区键
    • 自动发现新建的 Topic/分区;
    • 指标完备(端到端复制延迟等);容错且水平扩展。

注:Geo-Replication跨集群复制,不同于 Kafka 集群内副本

2.2 复制“数据流”(Replication Flows)

  • 配置形如 {source}->{target}定向数据流;可构建丰富拓扑:

    • 双活A->B, B->A
    • 主备A->B
    • 汇聚A->K, B->K, C->K
    • 扇出K->A, K->B, K->C
    • 转发A->B, B->C, C->D
  • 每条流默认复制所有 Topic/组(可排除/筛选)。

示例:主 → 备(Active/Passive)

# 基本设置
clusters = primary, secondary
primary.bootstrap.servers = broker3-primary:9092
secondary.bootstrap.servers = broker5-secondary:9092# 定义复制流
primary->secondary.enabled = true
primary->secondary.topics = foobar-topic, quux-.*

2.3 配置文件与分层重写

  • 文件名通常为 connect-mirror-maker.properties。支持三类配置:

    1. MM2 全局 & 每条复制流的专属配置;
    2. Kafka Connect/Connector 设置;
    3. Producer/Consumer/Admin Client 设置。

示例:集群别名与默认 Topic 选择

# 全局
clusters = us-west, us-east
us-west.bootstrap.servers = broker3-west:9092
us-east.bootstrap.servers = broker5-east:9092topics = .*   # 默认复制全部 Topic# us-west -> us-east 的流做覆盖
us-west->us-east.enabled = true
us-west->us-east.topics = foo.*, bar.*

示例:Kafka Connect 并行度

tasks.max = 5  # 建议 >=2 以便多进程均衡负载

示例:按集群粒度自定义 Connect worker 配置

# 针对 us-west 的自定义
us-west.offset.storage.topic = my-mirrormaker-offsets

示例:覆盖 Producer/Consumer/Admin 配置

# 从 us-west 消费
us-west.consumer.isolation.level = read_committed
us-west.admin.bootstrap.servers = broker57-primary:9092# 向 us-east 生产
us-east.producer.compression.type = gzip
us-east.producer.buffer.memory = 32768
us-east.admin.bootstrap.servers = broker8-secondary:9092

2.4 Exactly-Once(3.5.0+)

  • 新建 MM2 集群:在目标集群上启用 exactly.once.source.support = enabled(示例:us-east.exactly.once.source.support = enabled)。

  • 既有集群:分两步升级——先设为 preparing,完成后改为 enabled

  • 开启 MM2 节点间的内部 REST 通信(KIP-710):
    dedicated.mode.enable.internal.rest = truelisteners = http://localhost:8080(生产务必加固 REST)。

  • 过滤掉已中止事务的记录:源 Consumer 配 isolation.level=read_committed

    us-west.consumer.isolation.level = read_committed
    

2.5 启用复制流与重命名策略

  • 先定义 clusters 与各自的 bootstrap.servers,再逐流启用
clusters = primary, secondary
primary.bootstrap.servers = broker10-primary:9092,broker-11-primary:9092
secondary.bootstrap.servers = broker5-secondary:9092,broker6-secondary:9092primary->secondary.enabled = true
  • 目标集群的远端 Topic命名默认:{source}.{source_topic}。可通过
    replication.policy.separator 自定义分隔符,或实现自定义 ReplicationPolicy

2.6 避免配置竞争 & 部署位置最佳实践

  • 同一目标集群请保持所有 MM2 进程的配置一致(避免“谁当 leader 就按谁的配”导致只复制部分 Topic)。
  • “远端读,本地写”:把 MM2 进程尽量部署在目标集群附近(Producer 更怕网络抖动)。运行时用 --clusters 声明本地集群别名抑制跨区生产。
bin/connect-mirror-maker.sh connect-mirror-maker.properties --clusters secondary

2.7 常见拓扑示例

  • 主备单向双活双向多 DC 双活 + 跨 DC 复制(west/east/north,1/2 集群成对,1 号作为跨 DC 的桥头)。

2.8 运行、变更与监控

  • 启动:bin/connect-mirror-maker.sh connect-mirror-maker.properties(可加 --clusters)。
  • 停止:kill <pid>
  • 修改配置需重启
  • 监控:继承 Connect 指标 + kafka.connect.mirror 组(如 replication-latency-ms、record/byte rate 等)。

3. 多租户实践(Multi-Tenancy)

3.1 多租户要点

  • 多团队/业务线共享一个高吞吐事件流平台,需要边界清晰资源隔离可计量可治理,以减少“吵闹邻居”影响并满足 SLA/OLA。

3.2 命名空间与 Topic 命名

  • 用户空间(namespace)建模为一组 Topic,建议采用层级化命名,与 ACL 搭配,降低治理成本。

  • 常见分组方式:

    • 按团队<org>.<team>.<dataset>.<event>,如 acme.infosec.telemetry.logins
    • 按项目/产品<project>.<product>.<event>,如 mobility.payments.suspicious
  • 不建议将易变或可从元数据获取的信息写进 Topic 名。

  • 落地约束

    • 前缀 ACL(KIP-290):如只允许 teamA 创建 payments.teamA.*
    • 自定义 CreateTopicPolicy(KIP-108):编码命名规范与复杂校验;
    • 禁用普通用户创建 Topic,改用外部自动化创建;
    • 关闭自动建 Topicauto.create.topics.enable=false(不要只依赖这条)。

3.3 Topic 配置(保留策略等)

  • 通过每 Topic 配置精细控制:如 retention.bytesretention.ms,用于容量治理合规(GDPR)

3.4 安全(加密/认证/鉴权)

  • 与通用 Kafka 安全章节一致,这里强调多租户最常做的是鉴权(ACL)

    • 配合层级化命名 + 前缀 ACL 可极大降低管理开销,在便利性最小权限间折中。
  • 例:给用户 Alice 赋予 acme.infosec.* 的生产权限

bin/kafka-acls.sh \--bootstrap-server localhost:9092 \--add --allow-principal User:Alice \--producer \--resource-pattern-type prefixed --topic acme.infosec.

3.5 隔离(配额/限速/限流)

  • 客户端配额(每主体 user / client-id):请求速率配额对CPU 路径影响更直接,常比纯带宽配额更有效;此外还有控制面变更配额(KIP-599:controller_mutation_rate)。
  • 服务端配额:限制新连接接受速率、单 broker 最大连接数、按 IP 最大连接数等。

3.6 监控与计量

  • 建议按租户/Topic/消费组维度监控:鉴权失败率、请求延迟、消费者滞后、配额相关指标等。
  • 例如:用 kafka.log.Log.Size.<TOPIC-NAME> 监控 Topic-Partition 大小以做容量预警。

3.7 多租户与 Geo-Replication

  • 当租户间存在跨集群数据共享诉求时,可结合第 2 节 Geo-Replication。

3.8 进一步考虑:数据契约与模式治理

  • 建议引入Schema Registry(第三方实现):管理事件模式、演进与兼容策略,保证生产与消费正确性。

4. 硬件与操作系统(Hardware & OS)

4.1 基线硬件与内存估算

  • 参考配置:双路四核 Xeon、24GB 内存。
  • 内存估算:希望能缓冲 30 秒mem ≈ write_throughput * 30

4.2 磁盘吞吐为主瓶颈

  • 示例:8×7200rpm SATA;通常更多盘=更高吞吐
  • 是否选择更高转速 SAS 盘,取决于刷盘策略(强制 flush 越频繁越可能受益)。

4.3 操作系统要点

  • Kafka 良好运行于 Linux/Solaris;Windows 支持度较弱。

  • 三项关键 OS 参数:

    1. FD 上限:日志段与连接都耗 FD。起步建议 ≥100000。注意 mmap() 额外引用仅在所有映射释放后才释放;
    2. Max socket buffer size:跨机房大吞吐时适当增大;
    3. vm.max_map_count:每个日志段有 pair(index/timeindex)→ 每段 2 个 map area。默认 ~65535 在大量分区/日志段时会 OOM(Map failed)。计算分区与段总量时请关注。

4.4 磁盘与文件系统

  • 建议多块盘与系统/应用日志分离。两种做法:

    • 多数据目录:按分区轮转分配,可能因热点分区导致磁盘负载不均;
    • RAID:可能更均衡,但写入吞吐通常明显下降可用容量减少;阵列重建期间 I/O 极重,可用性未必更好
  • Kafka 有副本冗余,RAID 的冗余价值可由应用层替代。

4.5 应用 vs. OS 刷盘策略

  • Kafka 立即写入文件系统,并提供可配置 flush 策略(按时间/条数触发 flush);最终必须 fsync才可确知已刷盘。崩溃恢复时对未知 fsync 的段逐条校验 CRC 并重建索引。

  • 可靠性不依赖本地刷盘:节点失败可由副本恢复。

  • 推荐默认设置:关闭应用层 fsync,依赖 OS 背景 flush + Kafka 背景 flush,通常获得最优吞吐/延迟足够的恢复保证

    • 开启应用层 fsync 往往写入模式更低效引入延迟(Linux 上 fsync 常阻塞文件写)。

4.6 了解 Linux Flush 行为

  • 数据先进入 page cache,OS 或应用 fsync 再落盘。后台线程 pdflush / flusher threads 受“脏页阈值/时长”策略控制;跟不上写入速率时会阻塞写
  • /proc/meminfo 可查看内存状态。
  • 使用 page cache 的好处:I/O 调度合并与重排、充分利用空闲内存。

4.7 文件系统选择与挂载

  • Kafka 仅用普通文件;主流是 EXT4XFS。实测在高负载下 XFS 的本地请求时间更优且更稳定(如 160ms vs 250ms+)。
  • Linux 通用挂载建议:noatime(禁 atime 更新,Kafka 不依赖它)。

XFS:大多无需调;可考虑

  • largeio:偏好更大 I/O(实际收益有限);
  • nobarrier:若底层有电池缓存可略增性能(设备本身报告无需 flush 则无效)。

EXT4:可优化但多有风险/易损(单 Broker 崩溃可重建,但多故障/断电可能导致损坏):

  • data=writeback:去掉强顺序;
  • 关闭 journaling:降延迟方差但增加恢复风险;
  • commit=<secs>:元数据提交频率;
  • nobh:搭配 writeback 提升吞吐/降低延迟;
  • delalloc:延迟分配,大块顺序写,提升吞吐;
  • fast_commit(Linux 5.10+):在 data=ordered 下降低延迟。

4.8 KRaft 控制器磁盘更换(metadata.log.dir)

  • 更换前先确认大多数控制器都已追到最新提交
    kafka-metadata-quorum.sh --bootstrap-server ... describe --replication
    关注 LagLastFetchTimestamp vs LastCaughtUpTimestamp
  • 满足条件后格式化控制器元数据目录
bin/kafka-storage.sh format --cluster-id uuid --config config/server.properties
  • 若仅 metadata 目录丢失,其他目录仍在,可能报“已格式化”,此时仅可在该场景下加 --ignore-formatted
  • 之后启动控制器:
bin/kafka-server-start.sh config/server.properties

5. 监控(Monitoring)

5.1 指标系统与通用规则

  • 服务器端用 Yammer Metrics;Java 客户端用 Kafka Metrics。都通过 JMX 暴露,配合可插拔 Reporter 输出到你的监控系统。
  • 所有“速率”指标都有 -total 的累计指标,如 records-consumed-raterecords-consumed-total
  • 本地快速查看:jconsole 连接进程浏览 JMX。

5.2 远程 JMX 的安全

  • Kafka 默认禁用远程 JMX;可通过 JMX_PORT(CLI 进程)或 Java System Properties 启用。
  • 生产开启远程 JMX 时必须开启安全(认证默认关闭,需用 KAFKA_JMX_OPTS 或 System Properties 覆盖)。参考 Monitoring and Management Using JMX Technology

5.3 我们重点做图与告警的指标

  • BrokerTopicMetrics / RequestMetrics / Controller / ReplicaManager 等核心指标:消息/字节入出速率(含复制)、请求/错误/大小/队列、消息转换、日志刷盘、离线目录、选举与不洁选举、未同步/低 ISR、分区/Leader/离线副本计数、ISR 收缩/扩张、Follower/Consumer 滞后、Purgatory 大小、总/队列/本地/远端/响应时延、网络/请求处理线程空闲比、过期连接清理、配额节流时间与请求时间、Group/Txn 元数据加载时间、重分配与重分配流量、日志/分区级度量等。

  • 消费侧健康records-lag-max(阈值控制)与最小 Fetch 速率必须 > 0。

  • 通用客户端度量(producer/consumer/connect/streams):连接创建/关闭、网络 I/O、入出字节、请求数/大小/延迟、I/O 等待/执行时间、连接数、(重)认证成功/失败与延迟等;并有按节点维度的 per-node 指标。

  • Producer 专属:缓冲区、丢弃、批大小/拆分、压缩率、元数据年龄、Broker 节流、发送/错误/重试、记录大小、每请求记录数、请求延迟、飞行请求数、按 Topic的字节/压缩/重试/错误/发送。

  • Consumer 专属poll() 间隔/空闲比、commit 总耗时;Group 协调(提交/心跳/join/sync/rebalance 各种时延/速率/总数/失败);Fetch 管理(字节/记录/延迟/尺寸/节流/每请求记录数,按 Topic 与按分区滞后/首选副本)。

  • Connect:Worker 级(connector/task 数、启动成功/失败、重平衡统计);Connector/Task 级(状态、批大小、converter/transform/predicate、offset 提交、DLQ、源/汇速率、错误与重试、延迟等)。

  • Streams:四层结构(客户端→线程→任务→节点/状态存储/记录缓存),按 info/debug/trace 级采集;覆盖状态、commit/poll/process/punctuate 延迟与比率、任务创建/关闭、阻塞时间、节点端到端延迟、状态存储 put/get/delete/迭代/flush/restore、RocksDB 统计与属性(写/读字节、flush/compaction、block cache、memtable、SST、后台错误……)、记录缓存命中率等。

    • 通过 metrics.recording.level="info" 控制采集级别。
  • 分层存储(Tiered Storage):远端读/写字节/请求/错误、复制与删除滞后(字节/段)、重建远端日志辅助状态、远端日志大小与计算时间、远端 fetch/copy 节流时间、线程池队列与空闲比等。

  • KRaft 监控

    • Quorum(Controller 与 Broker):当前状态/leader/voted/epoch、HW、日志末尾、提交/选举延迟、fetch/append 速率、poll idle 比例、当前 Metadata 版本、快照(次数/大小/年龄)等。
    • Controller:ActiveControllerCount、事件队列等待/处理时间、被围栏/活跃 broker 数、全局 topic/partition、离线分区、首选副本不平衡、元数据错误、最后应用/提交 offset/时间戳、应用滞后、超时心跳、队列操作(开始/超时)、新 controller 选举次数等。
    • Broker:应用 offset/时间戳/滞后、元数据加载/应用错误。
  • 其他通用建议:同时监控 GCCPUI/O 服务时间 等系统指标。消费者要“跟得上”,需保证 最大滞后 < 阈值最小 fetch 速率 > 0

6. 实施清单(可直接落地)

  1. 拓扑与隔离
  • 每 DC 本地集群 + MM2 跨集群复制;汇总只读集群按需建;
  • 多租户:层级化 Topic 命名 + 前缀 ACL +(可选)CreateTopicPolicy。
  1. 复制与一致性
  • MirrorMaker 2:分流配置、Topic/组/ACL/分区一致性复制;
  • 3.5.0+ 开启 EOS:exactly.once.source.support=enabled + 内部 REST;
  • 源消费 isolation.level=read_committed 过滤中止事务。
  1. 硬件与 OS
  • 内存估算 write_throughput * 30多盘优先
  • ulimit -n 起步 100k+;关注 vm.max_map_count
  • 文件系统优先 XFS;Linux 挂载加 noatime
  • 优先使用 OS 背景刷盘,关闭应用级 fsync(默认)。
  1. 运行与维护
  • MM2 尽量部署在目标集群侧;为同一目标集群保持统一配置
  • 变更需重启;KRaft 控制器磁盘更换前确认大多数已追平。
  1. 监控与告警
  • Broker/网络/复制/存储/Client 全链路 JMX 指标;
  • 关键阈值:UncleanLeader=0、OfflineReplica=0、UnderReplicated=0、处理/网络线程空闲比>0.3、Consumer records-lag-max<阈值;
  • 分层存储、KRaft、Streams、Connect 专属指标按需加盘点。

结语

多数据中心跨集群复制多租户共享高可靠/高吞吐的目标下,Kafka 的正确打开方式是:本地自治 + 跨集群镜像命名与 ACL 标准化以副本可靠性为主、OS 刷盘为辅面向瓶颈的硬件与文件系统选择、以及端到端、可行动的监控体系

http://www.dtcms.com/a/394155.html

相关文章:

  • leetcode136.只出现一次的数字
  • 力扣hot100:环形链表II(哈希算法与快慢指针法思路讲解)
  • 【算法】【Leetcode】【数学】统计1的个数 数位统计法
  • Kafka面试精讲 Day 21:Kafka Connect数据集成
  • MySQL 主从复制完整配置指南
  • 力扣每日一刷Day 23
  • LeetCode 53. 最大子数组和(四种解题思路)包含扩展返回最大和的数组
  • RTX 4090助力深度学习:从PyTorch到生产环境的完整实践指南——高效模型训练与优化策略
  • 23种设计模式之【桥接模式】-核心原理与 Java实践
  • LabVIEW手部运动机能实验
  • 669. 修剪二叉搜索树
  • 大QMT自动可转债申购
  • PolarCTF PWN 网络安全2023秋季个人挑战赛刷题
  • MySQL-day4_02(事务)
  • JUC(8)线程安全集合类
  • springboot中@EnableAsync有什么作用
  • Spark专题-第二部分:Spark SQL 入门(6)-算子介绍-Generate
  • C#练习题——Dictionary
  • Feign
  • SPA小说集之三《森林城市反甩锅战:ERP的权责边界》
  • Qt(模态对话框和非模态对话框)
  • 【无标题】物联网 frid卡控制
  • 【LLM LangChain】 模型绑定工具+调用工具(手动调用/LangGraph/AgentExecutor)+相关注意事项
  • 图神经网络(GNN)入门:用PyG库处理分子结构与社会网络
  • 【C++】编码表 STL简介:STL是什么,版本,六大组件,重要性以及学习方法总结
  • show_interrupts函数的进一步解析及irq_desc结构体
  • Kafka面试精讲 Day 19:JVM调优与内存管理
  • 10.vector容器
  • Linux系统介绍
  • MFC中的CMFCDynamicLayout类的介绍