磁盘挂载和Kafka概念和使用场景理解

目录

下面用 4 张图 + 1 张表,把「磁盘挂载」「三副本高可用」「Topic 本质」「客户端能否自行建 Topic」「Java 依赖」一口气讲透。

──────────────────

1.磁盘挂载:到底在"挂"什么?

• 定义:把云盘(/dev/vdb)映射到操作系统的一个目录(/data)。

• 原理:Linux 一切皆文件,mount 只是把块设备挂到目录树的一个"入口"。

• Kafka 场景:Kafka 的所有日志段(.log / .index / .timeindex)都会写到 log.dirs=/data/kafka-logs。这样:

-- 系统盘坏了,数据盘还在;

-- 实例想重装,数据盘解挂 → 挂到新实例即可"原地复活"。

(以上这两个场景的意义是针对「磁盘挂载」本身的,而不是 Kafka 特有的)

──────────────────

2.Topic 到底是什么?

• 类比:Topic 像"数据库里的表",Producer 写入"表",Consumer 读取"表"。

• 物理形态:一个 Topic 会被拆成 1...N 个 Partition → 每个 Partition 是一组只追加的文件段(Segment)。

• 副本:为了让数据不丢,每个 Partition 做 3 份拷贝(Leader + 2 Follower),分布在 3 台 Broker(云主机)上。

因此「三副本高可用」最少要 3 台云主机,否则无法"跨机冗余"。

──────────────────

3.客户端能不能自己建 Topic?

• 默认:auto.create.topics.enable=true 时,Producer 第一次往不存在的 Topic 发消息,Kafka 会自动按默认参数(分区数、副本数)建 Topic。

• 生产建议:把该参数关掉,由运维通过脚本提前建 Topic 并制定分区/副本/ACL。

• 结论:不是"必须"3 台云主机才能建 Topic,而是"三副本高可用"本身就要求 ≥3 台 Broker。

──────────────────

4.Java 是必须的吗?

• Kafka Server:100 % 跑在 JVM 上,必须装 JDK 11(旧版 8 也行)。

• 客户端:

-- Java/Scala 客户端:需要 JDK。

-- 其他语言:官方提供 librdkafka(C/C++)、confluent-kafka-python、confluent-kafka-go 等,都是 native 实现,不依赖系统 JDK。

所以只有「Broker 节点」必须装 Java;业务侧用什么语言都行。

──────────────────

5.结论速查表

疑问点 最短答案 备注
三副本高可用最少几台云主机? 3 台 每台跑 1 个 Broker
客户端能否自行建 Topic? 可以(auto.create.topics.enable=true) 生产环境建议关闭
Topic 是什么? 逻辑上的"消息表",物理上是若干只追加日志段 每个表可拆多分区
Kafka 必须 Java 吗? Broker 端必须 JDK;客户端视语言而定 推荐 OpenJDK 11
磁盘挂载用途? 把数据盘挂到 /data,让 Kafka 日志与系统盘分离 方便迁移、扩容、快照

把上面 5 点消化后,再回头看我的部署脚本,你会发现每一步都在解决这 5 个核心问题。

──────────────────

6.三副本高可用的话三台云主机是什么关系?应该是每个主机上给一个broker(broker是啥),然后需要构建一主两从吗?然后topic的理解是什么?类似于创建数据库之后的用户自己建表?那我如何理解kafka是什么呢?

一句话先把概念拍扁:

Kafka = 一个高吞吐、可持久化、分布式的日志系统(消息队列 + 流存储)

它把"一条消息"当成追加写死的日志记录,所有 Producer 只负责"写日志",所有 Consumer 只负责"按顺序读日志"。

下面用 4 张图把 3 副本、Broker、Topic、数据库类比全对齐。

──────────────────

①3 台云主机 = 3 个独立进程(Broker)

• 每台云主机跑 1 个 JVM 进程,官方叫 Broker (直译"代理人")。

• 这 3 个 Broker 地位完全对等 ,没有"主节点""从节点"的概念,只有 Leader/Follower 是针对分区(Partition)级别 的。

举个例子:

──Topic A-Partition0:Leader 在 Broker1,Follower 在 Broker2/3

──Topic A-Partition1:Leader 在 Broker2,Follower 在 Broker1/3

──Topic B-Partition0:Leader 在 Broker3,Follower 在 Broker1/2

所以不存在整集群意义上的"一主两从" ,而是"每个分区一主多从"。

先把那三行"乱码"拆成大白话,你就能一眼看懂:

──────────────────

  • Topic A-Partition0:Leader 在 Broker1,Follower 在 Broker2/3
    读法:
    • Topic A 的第 0 号分区(Partition0)
    • 这一分区的"主副本"落在 Broker1 (负责所有读写)。
    • 另外两台机器(Broker2、Broker3)各存一份"从副本"Follower,只做同步备份,不对外服务。

同理:

• Topic A-Partition1:主副本换到 Broker2,从副本在 Broker1、Broker3。

• Topic B-Partition0:主副本在 Broker3,从副本在 Broker1、Broker2。

──────────────────

  • 那串"分数"到底是啥?

    Topic A-Partition0:Leader 在 Broker1,Follower 在 Broker2/3 那这个的意思就是从副本在broker2和3的意思,没有分数!

    只是 "分区号" (0、1、2...)和 "Broker 编号" (1、2、3)。

    写成"Topic A-Partition0"就是"Topic A 的第 0 号分区",不是 0 分、1 分的意思。

    比如上面第一个:──Topic A-Partition0:Leader 在 Broker1,Follower 在 Broker2/3

    每个分区在 3 台 Broker 上各放一份:

    Leader 在 1,Follower 在 2,Follower 在 3。

    • 任意一台挂掉,另外两台还有完整数据,可以立即重新选主继续服务。

──────────────────

  • Leader ≠ 创建者
    • Leader 是 动态选出来的主副本 ,负责所有读写。
    • Follower 只是 被动同步 Leader 的数据,Leader 挂了立刻重新选主。
    • 谁当 Leader 由 Kafka 内部控制器(Controller)自动决定,跟"谁建的 Topic"毫无关系。

──────────────────

  • 再给你一个极简对照表,彻底把"名词"和"现实"对上号:
Kafka 术语 现实对应 作用
Topic 一张"消息表" 业务按主题分类
Partition 这张表的"第 N 个分片" 并行读写,提高吞吐
Broker 一台云主机上的一个 Kafka 进程 负责存这些分片
Leader 某分片的主副本 所有读写都找它
Follower 同一分片的备份副本 同步数据,Leader 挂了就顶上
3 副本 每个分片存 3 份 任意 2 台机器挂掉数据仍在

把这张表记住,你再看那三行就一目了然了。

②Topic ≈ 数据库里的"库.表"

• 建 Topic ≈ 建表,里面存的是一条条"行(消息)"。

• 一个 Topic 可拆 多个分区(Partition) → 类似"水平分表",提高并发。

• 每个分区存 3 份(3 副本)→ 高可用。

然后解释一些开通topic和使用topic,给定的是命名规则:

  1. 命名:

    "ESX-CDN--AccessLog" 和 "TopicA-Partition1" 在 Kafka 眼里都只是字符串,没有语义区别。

    你爱叫 order-eventuser_clickwhatever_you_like 都行,只要满足合法字符即可。

  2. 使用:

    • 建 Topic:

    bash 复制代码
    kafka-topics.sh --create --topic ESX-CDN--AccessLog \
      --bootstrap-server ... --partitions 3 --replication-factor 3

    • 生产/消费时,把同样的字符串写到命令行或客户端配置里就行:

    bash 复制代码
    kafka-console-producer.sh --topic ESX-CDN--AccessLog ...
    kafka-console-consumer.sh --topic ESX-CDN--AccessLog ...

    换句话说,"给啥就用啥",名字出现在脚本、配置、代码里即可,Kafka 只认字符串本身。

③客户端自己建 Topic

• 允许 auto.create.topics.enable=true 时,Producer 第一次写不存在的 Topic,Kafka 就自动帮你"建表"。

• 关闭该参数后,必须由运维脚本 kafka-topics.sh --create ... 手动"建表"。

④Kafka 在整条链路中的位置
复制代码
业务 APP ──produce──▶ Kafka(Broker 集群,3 台云主机)
                           │持久化日志(多副本)
                           ▼
业务 APP ──consume──◀ Kafka

因此 Kafka 不是数据库,也不是简单的 MQ,而是一个分布式、可水平扩展的提交日志系统,所有实时数据(订单、点击、日志、IoT 事件......)先写进来,再被下游各系统并发地"按顺序读"。

──────────────────

小结一句话记忆

"Kafka = 把消息当成日志,分区做并发,副本做高可用;建 Topic 就是开一张日志表,3 台云主机各自跑一个 Broker 进程,共同组成这张表的分布式存储集群。"