Kafka 深度剖析

Kafka 深度剖析:从基础概念到集群实战

在当今大数据与分布式系统蓬勃发展的时代,Apache Kafka 作为一款极具影响力的分布式发布 - 订阅消息系统,宛如一颗璀璨的明星,照亮了数据流转与处理的诸多场景。它由 LinkedIn 公司于 2010 年慷慨贡献给 Apache 基金会,并迅速晋升为顶级开源项目,凭借其独特卓越的设计理念与强大非凡的性能优势,赢得了全球开发者的青睐。

一、Kafka 探秘:核心特性与架构精要

(一)卓越性能尽显风采

  1. 高吞吐量、超低延迟:Kafka 仿若一台高效运转的超级引擎,具备令人惊叹的消息处理实力,每秒能够闪电般处理几十万条消息,延迟更是低至几毫秒的极致境界。其秘诀在于巧妙的架构设计,每个 topic(主题)犹如一座数据宝库,可精细划分成多个 partition(分区),而 consumer group(消费者组)则如同训练有素的寻宝团队,能够对 partition 进行 consume(消费)操作,让数据如奔腾的江水般畅快流转,极大地提升了整体效率。
  2. 极致可扩展性:面对业务的飞速增长与数据洪流的汹涌来袭,Kafka 集群展现出非凡的应变能力,支持热扩展特性。这意味着在业务系统毫不停歇、正常运行的关键时刻,我们能够从容不迫地增加节点,如同为高速行驶的列车无缝拼接车厢,轻松应对不断攀升的数据量与复杂多变的业务需求,确保系统始终稳健前行。
  3. 坚如磐石的持久性、可靠性:数据安全是重中之重,Kafka 深谙此道,它将消息稳稳地持久化存储到本地磁盘,同时精心打造了多重数据备份机制,犹如为珍贵的数据穿上了坚固的铠甲,有效防止数据丢失,为各类对数据可靠性要求严苛的应用场景筑牢了坚实根基,让使用者无后顾之忧。
  4. 强大容错本领:在复杂多变的分布式环境中,节点故障时有发生,而 Kafka 却能处变不惊。当副本数量设定为 n 时,它凭借卓越的 "容错设计,可以允许 n - 1 个节点出现故障,如同拥有多艘坚实的后备船只,即便部分船只受损,舰队依然能够乘风破浪,稳定地为用户提供服务,确保数据传输与处理的连续性。
  5. 卓越高并发处理能力:无论是熙熙攘攘的电商购物高峰,还是海量设备并发连接的物联网场景,Kafka 都能游刃有余。它能够同时支持数千个客户端如潮水般涌入,同时进行读写操作,以卓越的并发处理能力,完美满足大规模并发业务场景下的数据交互刚需,确保系统响应迅速,不卡顿、不延迟。

(二)精妙存储策略揭秘

  1. 以 topic 为核心的消息管理体系:Kafka 构建了一套以 topic 为枢纽的消息管理架构,每个 topic 宛如一个装满宝箱的神秘宝库,里面包含多个 partition,而每个 partition 又对应一个逻辑 log,这些逻辑 log 由多个 segment 组成,以此构建起层次分明的消息存储结构,让数据的存储与检索如同在图书馆中找书一般便捷高效。
  2. 高效消息定位机制:在 segment 中存储多条消息,消息的 id 由其逻辑位置决定,通过消息 id 可直接定位到消息的存储位置,避免了额外的 id 到位置的映射操作,提高了消息查找和读取的效率。
  3. 智能内存索引机制:每个 part 在内存中对应一个 index,用于记录每个 segment 中的第一条消息偏移,方便在处理消息时快速定位到相应 segment 的起始位置。
  4. 科学消息分布与写入规则:发布者发到某个 topic 的消息会被均匀地分布到多个 partition 上(也可根据用户指定的路由规则进行分布)。broker 收到发布消息后,会往对应 partition 的最后一个 segment 上添加该消息。当某个 segment 上的消息条数达到配置值,或者消息发布时间超过规定值时,segment 上的消息会被 flush(刷新)到磁盘,只有 flush 到磁盘上的消息订阅者才能订阅到。而且当 segment 达到一定的大小后,将不会再往该 segment 写数据,broker 会创建新的 segment 继续存储消息。

(三)关键名词深度解读

  1. Broker:即 Kafka 节点,一个 Kafka 节点就是一个 broker,多个 broker 可以组成一个 Kafka 集群,共同承担消息的处理和存储等任务。
  2. Topic:代表一类消息,可理解为消息存放的目录,也就是主题。例如 page view 日志、click 日志等都能以 topic 的形式存在,Kafka 集群能够同时负责多个 topic 的分发工作。
  3. Message:是 Kafka 中最基本的传递对象,承载着实际需要传递的数据内容。
  4. Partition:为 topic 物理上的分组,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列,有助于提高消息处理的并行度和效率。
  5. Segment:partition 物理上由多个 segment 组成,每个 Segment 存储着 message 信息,是消息存储的具体单元。
  6. Producer:指生产者,负责生产 message 并发送到 topic,是消息流入 Kafka 系统的源头。
  7. Consumer:即消费者,通过订阅 topic 来消费 message,在实际运行中可以作为一个线程来执行消费操作。
  8. Consumer Group:消费者组,一个 Consumer Group 包含多个 consumer,组内的消费者可以协同工作,共同消费 topic 中的消息,实现负载均衡和消息的灵活分配。
  9. Offset:偏移量,可简单理解为消息 partition 中的索引,用于记录消费者消费消息的位置,方便实现消息的顺序消费以及断点续传等功能。

二、Zookeeper 集群搭建:开启 Kafka 之旅的关键前奏

(一)JDK 1.8 环境部署:基石奠定

在开启 Zookeeper 与 Kafka 的精彩探索之旅前,为每台服务器节点精心安装 JDK 1.8 环境是必不可少的关键一步。如同建造高楼大厦需先夯实地基一般,待安装完成后,使用 java -version 命令进行严谨测试,确保 JDK 环境安装无误且能顺畅运行,为后续复杂的软件安装与配置工作提供坚实的底层支撑。

(二)Zookeeper 安装包获取与解压:筹备启航

  1. 下载安装包 :以 Zookeeper 3.9.3 版本为例,通过神奇的 wget 命令,从网络的浩瀚海洋中精准捕捞 Zookeeper 安装包:wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz,如同获取开启宝藏之门的钥匙。
  2. 解压安装包:使用 tar -zxvf apache-zookeeper-3.9.3.tar.gz 命令,轻轻解开安装包的神秘封印,释放其中蕴含的强大能量。
  3. 重命名文件夹:为了后续操作的便捷与清晰,将解压后的文件夹重命名为 zookeeper,执行 mv apache-zookeeper-3.9.3 zookeeper 命令,让一切井然有序。

(三)Zookeeper 集群环境精心雕琢:集群构建

  1. 配置文件深度定制
    • 首先,如同探险家深入神秘洞穴般,进入配置文件所在目录 cd /usr/local/zookeeper/conf,将示例配置文件 zoo_sample.cfg 郑重重命名为 zoo.cfg,mv zoo_sample.cfg zoo.cfg,开启配置之旅。
    • 接着,使用 vi zoo.cfg 命令精心修改配置内容,主要聚焦两处关键设置:其一,设置 dataDir 参数,指定 Zookeeper 存储数据的目录,例如 dataDir=/usr/local/zookeeper/data (同时需要 Zookeeper 中创建 data 目录);其二,在文件最后面添加集群节点信息,格式如下:server.0=10.10.10.208:2888:3888,server.1=10.10.10.216:2888:3888,server.2=10.10.10.202:2888:3888,如同绘制集群协作的蓝图,让节点之间能够精准通信。
  2. 服务器标识创建
    • 先创建用于种放服务器标识的文件夹 data,执行 mkdir data 命令,为服务器打造独特身份标识。
    • 再创建文件 myid 并填写相应内容,使用 vi myid 命令,依据服务器节点的角色,分别赋予它们独一无二的标识数字,如 0、1、2 等,让每个服务器在集群中都能被精准识别。
  3. Zookeeper 复制与扩散:将配置好的 zookeeper 目录完整复制到其他相关服务器节点(如 10.10.10.216 和 10.10.10.202),同时复制 /etc/profile 文件。并且要将 10.10.10.216、10.10.10.202 中的 myid 文件里的值分别修改为 1 和 2(修改路径为 vi /usr/local/zookeeper/data/myid),让每个节点明确自身身份。
  4. 防火墙屏障拆除:在每台服务器节点上关闭防火墙,以避免防火墙规则对 Zookeeper 集群通信造成干扰,执行命令如下 systemctl stop firewalld.service
  5. 环境变量注入活力:编辑 /etc/profile 文件,如同为系统注入一剂强心针,添加如下内容:export ZOOKEEPER_HOME=/usr/local/zookeeper,export PATH=ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf,赋予 Zookeeper 运行所需的环境路径,让它能在系统中自由驰骋。添加完成后,执行 source /etc/profile 命令,使修改后的环境变量生效。
  6. Zookeeper 启动点火:进入 Zookeeper 的启动脚本所在路径 /usr/local/zookeeper/bin, 执行启动命令 zkServer.sh start,如同点燃火箭引擎,推动 Zookeeper 集群腾飞。需要特别注意的是,集群中的每台机器都要执行此启动命令。启动后,可以通过 zkServer.sh status 命令在三个节点上校验 Zookeeper 的运行模式。

三、Kafka 集群搭建:构建数据流转的高速通道

(一)Kafka 压缩包下载与解压:开启征程

在 3 台虚拟机上均执行以下操作,先进入 /usr/local/ 目录,下载 Kafka 压缩包(以 Kafka 3.9.0 版本为例),然后解压并重命名:cd /usr/local/wget https://downloads.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgztar -zxvf kafka_2.12-3.9.0.tgzmv kafka_2.12-3.9.0 kafka

(二)配置文件个性化定制:适配节点

分别在不同的虚拟机上,根据其自身的 IP 地址对./kafka/config/server.properties 文件进行修改,具体如下:

对于 10.10.10.208 这台虚拟机:

  • broker.id=0
  • listeners=PLAINTEXT://10.10.10.208:9092
  • zookeeper.connect=10.10.10.208:2181,10.10.10.216:2181,10.10.10.202:2181
    对于 10.10.10.216 这台虚拟机:
  • broker.id=1
  • listeners=PLAINTEXT://10.10.10.216:9092
  • zookeeper.connect=10.10.10.208:2181,10.10.10.216:2181,10.10.10.202:2181
    对于 10.10.10.202 这台虚拟机:
  • broker.id=2
  • listeners=PLAINTEXT://10.10.10.202:9092
  • zookeeper.connect=10.10.10.208:2181,10.10.10.216:2181,10.10.10.202:2181

(三)系统环境变量赋能:打通脉络

编辑 /etc/profile 文件,在文件最下方添加 Kafka 路径相关的环境变量,内容如下:

export KAFKA_HOME=/usr/local/kafka

export PATH=PATH

添加完成后,执行 source /etc/profile 命令使修改后的环境变量生效。

四、Kafka 集群环境测试:实战检验真理

(一)在三台机器上分别开启 Zookeeper 程序:

/usr/local/zookeeper/bin/zkServer.sh start,启动成功后,通过以下命令查看 zookeeper 集群的状态

/usr/local/zookeeper/bin/zkServer.sh status

若出现 Mode:follower 或是 Mode:leader,则代表 Zookeeper 启动成功。

(二)启动 Kafka 程序并检查启动情况

在后台开启 3 台虚拟机的 Kafka 程序(先进入 /usr/local/kafka 目录):

./bin/kafka-server-start.sh -daemon config/server.properties

-daemon 参数表示 Kafka 服务器将在后台运行,不会占用当前的终端会话。启动后,可以通过 ps aux | grep 'kafka' 命令查看 Kafka 是否启动成功。

(三)创建 topic 并进行消息发送与消费测试

  1. 创建 topic :在其中一台虚拟机 (如 10.10.10.208) 上创建 topic,执行命令如下
    /usr/local/kafka/bin/kafka-topics.sh --create --bootstrap-server 10.10.10.208:9092 --replication-factor 1 --partitions 3 --topic test
    各参数含义如下:
    --create:指定正在创建一个新的主题。
    --bootstrap-server:9092:指定 kafka 实例的地址。
    --replication-factor 1:每个分区的复制因子为 1,即每个分区将有一个副本。
    -partitions:指定 topic 分区主体一共有多少个。
    --topic:指定 topic 主体名称。
  2. 查看 topic 信息 :通过以下命令查看创建的 topic 信息:
    ./bin/kafka-topics.sh --list --bootstrap-server 10.10.10.208:9092
  3. 发送消息 :在 10.10.10.208 这台虚拟机上发送一些消息到创建的 topic 中,执行命令如下:
    bin/kafka-console-producer.sh --broker-list 10.10.10.208:9092 --topic test
  4. 消费消息 :在另一台虚拟机(如 10.10.10.216)上启动一个 consumer(消费者)来消费消息,执行命令如下:
    bin/kafka-console-consumer.sh --bootstrap-server 10.10.10.216:9092 --topic test --from-beginning
相关推荐
兔子宇航员03011 小时前
数据开发八股文整理- Hadoop
大数据·hadoop·分布式
d14515453682 小时前
RabbitMq安装
分布式·rabbitmq
MasterNeverDown3 小时前
分布式Id方案选择
分布式
明达技术3 小时前
MR30分布式 IO革新饮料灌装机产线
分布式
兔子宇航员03013 小时前
Hadoop常见面试题
大数据·hadoop·分布式
苍老流年5 小时前
1. Doris分布式环境搭建
分布式·doris
重生之Java开发工程师5 小时前
分布式ID—雪花算法
分布式
Austindatabases6 小时前
OceanBase4.0 跟我学--分布式到底可靠不可靠,到底丢不丢数--终于学完了
分布式
Lin_Miao_091 天前
Kafka优势剖析-流处理集成
分布式·kafka