一, Kafka 概述, 安装, 快速入门

一, KafKa 概述

1. 定义

  • Kafka 是一个分布式的基于发布/订阅模式的消息队列(MQ-Message Queue), 主要应用于大数据实时处理领域.

二, Kafka 快速上手

2.1 Kafka 基础架构

请添加图片描述

Kafka 常用术语(摘抄, 点击查看全文)

  1. Topic, 是kafka下消息的类别, 逻辑概念, 用来区分,隔离不同的消息数据, 屏蔽底层复杂的存储方式,对于大多数人来说, 只需要关注数据写入到了那个topic, 从哪个topic取出数据.
  2. Partition, 是Kafka下数据存储的基本单元, 物理概念. 同一个topic的数据, 会被分散存储到多个partition中, 这些partition可以再同一台机器上, 也可以在多台机器上. 比如,上图中, topicA有两个分区(partition0和partition1), 分别存放在两台机器上(broker0和broker1). 这种方式在大多数分布式存储中都可以见到, 优势在于: 有利于水平扩展, 避免单台机器在磁盘空间和性能上的限制, 提高了读写并行度; 同时可以通过复制来增加数据冗余性, 提高数据容灾能力. 为了做到均匀分布, 通常partition的数量是Broker Server数量的整数倍.
  3. Consumer Group, 逻辑概念, 是Kafka实现单播和广播两种消息模型的手段. 同一个topic 的数据, 会广播给不同的group; 同一个group中的workers, 只有一个worker能拿到这个数据. 换句话说, 对于同一个topic, 每个group都能拿到同样的所有数据(广播), 但是数据进入到group后只能被其中的一个worker消费(单播), group内的worker.

  1. Producrer-生产者:

    • 向Kafka broker 发(push)消息的客户端
  2. Consumer-消费者:

    • 向Kafka broker 取(pull)消息的客户端
  3. Consumer Group(CG): 消费者组,(topic中一个分区的一条消息可以被多个消费者组全量消费, 但是只能被同一消费者组中的一个消费者消费)

    • 由一到多个Consumer组成,每个Consumer都属于一个Consumer Group。消费者组在逻辑上是一个订阅者。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内的一个消费者消费;消费者组之间互不影响。即每条消息只能被Consumer Group中的一个Consumer消费;但是可以被多个Consumer Group组的每个consumer消费。这样就实现了单播和多播。
  4. Broker: (一个broker id 就是一台服务器, 所以id是唯一的)

    • Kafka集群包含一个或多个服务器,这种服务器被称为broker.一个集群由多个Broker组成, 一个Broker可以容纳多个topic.
  5. Topic: (一类消息的集合, 屏蔽底层复杂存储方式,包含多个分区, 每个分区都可以是一个队列,)

    • 消息的类别或者主题,逻辑上可以理解为队列。Producer只关注push消息到哪个Topic,Consumer只关注订阅了哪个Topic。
  6. Partition: (在分布式系统中, 同一topic的不同分区可以分布到多台机器中, 一是可以水平扩展, 避免单机IO和性能限制,提高读写并行度, 二是方便通过复制增加数据冗余性, 提高容灾能力)

    • 负载均衡与扩展性考虑,一个Topic可以分为多个Partition,物理存储在Kafka集群中的多个Broker上。可靠性上考虑,每个Partition都会有备份Replica。每个partition是一个有序的队列.
  7. Replica:

    • 副本, 为保证集群中的某个节点发生故障时, 该节点上的partition数据不丢失, 且Kafka能够继续工作, Kafka提供了副本机制, 一个Topic的每个分区都有若干个副本, 一个leader和若干个follower.
  8. leader:

    • 每个分区多个副本的"主", 生产者发送数据的对象, 以及消费者消费数据的对象都是leader.(Producer和consumer只跟leader交互.)
  9. follower:

    • 每个分区多个副本中的"从", 实时从leader中同步数据, 保持和leader数据的同步. leader发生故障时, 某个follower会成为新的follower.
  10. Controller:

    • Karfka 集群中的其中一台服务器, 用来进行leader election(选举)和各种failover(故障转移)
  11. Offset: 记录消费的位置. 0.9之前是存储在zk集群中,之后的新版本是存储在kafka集群的topic中.


请添加图片描述


2.2 Kafka 安装部署

2.2.1 Kafka 集群部署规划

Bigdata01 Bigdata02 Bigdata03
ZK ZK ZK
kafka kafka kafka

2.2.2 相关Jar包下载

  • Kafka最新jar包下载地址: 进入

2.2.3 Kafkar 集群部署

  1. 下载并解压到 /opt/module, 并改名
    请添加图片描述

  2. 在安装目录下手动创建logs目录

  3. 修改./config目录中的配置文件

#broker 的全局唯一整数编号,不能重复
broker.id=0
#开启删除 topic 功能
delete.topic.enable=true
#处理网络请求的线程数量
num.network.threads=3
#用来处理磁盘 IO 的线程数量
num.io.threads=8
#发送套接字的缓冲区大小
socket.send.buffer.bytes=102400
#接收套接字的缓冲区大小
socket.receive.buffer.bytes=102400
#请求套接字的缓冲区大小
socket.request.max.bytes=104857600

#kafka 运行日志存放的路径
log.dirs=/opt/module/kafka/logs

#topic 在当前 broker 上的分区个数
num.partitions=1
#用来恢复和清理 data 下数据的线程数量
num.recovery.threads.per.data.dir=1
#segment 文件保留的最长时间,超时将被删除
log.retention.hours=168
#配置连接 Zookeeper 集群地址
zookeeper.connect=bigdata01:2181,bigdata02:2181,bigdata03:2181
  1. 配置环境变量

(注意: 在这里我们仍旧采用前面经常用到的在 /etc/profile.d目录中向自定义的my_env.sh追加环境变量的方式)

  • sudo vi /etc/profile.d/my_env.sh
    请添加图片描述

  • source /etc/profile

  1. 分发安装包
[win10@bigdata01 module]$ xsync kafka-0.11/

注意: 在分发kafka安装目录到目标机器之后, 我们还需要配置每台机器的broker id, 在这里我们设置bigdata01主机 broker id为0, bigdata02为1, bigtda03 为2.

  1. 启动集群
[win10@bigdata01 kafka-0.11]$ bin/kafka-server-start.sh -daemon config/server.properties
[win10@bigdata02 kafka-0.11]$ bin/kafka-server-start.sh -daemon config/server.properties
[win10@bigdata03 kafka-0.11]$ bin/kafka-server-start.sh -daemon config/server.properties
  • 为什么要作为守护进程启动(-daemon)呢?
    • 因为kafka启动之后是阻塞进程.
    • 请添加图片描述
  1. 关闭集群
[win10@bigdata01 kafka-0.11]$ bin/kafka-server-stop.sh -stop
[win10@bigdata02 kafka-0.11]$ bin/kafka-server-stop.sh -stop
[win10@bigdata03 kafka-0.11]$ bin/kafka-server-stop.sh -stop
  1. Kafka群启和群关脚本
#!/bin/bash

case $1 in
"start")
    for i in bigdata01 bigdata02 bigdata03
        do
            echo "=======$i 's kafka is starting=========="
            ssh $i "/opt/module/kafka-0.11/bin/kafka-server-start.sh -daemon /opt/module/kafka-0.11/config/server.properties"
            echo "=======$i 's kafka started=============="
        done
;;

"stop")
    for i in bigdata01 bigdata02 bigdata03
        do
            echo "=======$i 's kafka is starting=========="
            ssh $i "/opt/module/kafka-0.11/bin/kafka-server-stop.sh /opt/module/kafka-0.11/config/server.properties"
            echo "=======$i 's kafka started=============="
        done
;;
esac

对上面的启停脚本赋予权限–> 添加到环境变量–> 到处便可启动Kafka

注意, 使用kafka-server-stop.sh可能会出现无法关闭kafka进程的问题:

  • 问题:
    请添加图片描述

  • 解决办法:
    修改上述脚本,
    请添加图片描述


PIDS=$(jps -lm | grep -i 'kafka.Kafka'| awk '{print $1}')
    
    # 命令详解:使用jps -lm命令列出所有的java进程,然后通过管道,利用grep -i 'kafka.Kafka'命令将kafka进程筛出来,最后再接一管道命令,利用awk将进程号取出来。

参考文章: Kafka 的No kafka server to stop报错处理

2.3 Kafka 命令行操作

当然了,在对Kafka输入各种命令之前, 我们需要把集群的zookeeper和kafka启动完成,

  1. zk start (前面zookeeper专栏中讲的启停和状态脚本)
  2. kk start (前面讲到的kafka启停脚本)
  3. jpsall (查看zk和kafka是否启动成功运行. QuorumPeerMain和kafka进程存在即可)

  1. 查看当前服务器中的所有topics
bin/kafka-topics.sh --zookeeper bigdata01:2181 --list 
  1. 创建topic, 名字为topic-one
  • 主题名(–topic), 分区号(–partition), 副本数(–replication-factor)
bin/kafka-topics.sh  --zookeeper bigdata01:2181 --create --topic 主题名 --partitions 分区号 --replication-factor 副本数  

请添加图片描述

Kafka中创建topic的**副本数量(replicator-factor)**需要注意的地方:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oE2t3U98-1635671699921)(2021-10-24-17-03-23.png)], 在这里需要注意, 创建的副本数量(replication-fator)不能大于实际机器(broker)的数量, 为什么? 自己想一想啊, 副本是备份的, 首先不会放在原有的机器上, 其次除了原有的设备, 其他的设备一台保有一份副本.

  1. 删除topic
bin/kafka-topics.sh --zookeeper bigdata01:2181 --delete --topic 主题名

需要 server.properties 中设置 delete.topic.enable=true 否则只是标记删除

  1. 查看某个topic的详情
bin/kafka-topics.sh --zookeeper bigdata01:2181 --status --topic 主题名

请添加图片描述
请添加图片描述

5. 发送(生产)消息

在kafka集群中, 生产者生产的消息是送往kafka集群的topic中的, 所以相应的, 执行生产过程时, 连接的就是kafka集群咯. (连接命令: --broker-list bigdata01:9092)

[win10@bigdata01 kafka-0.11]$ bin/kafka-console-producer.sh --topic test_topic --broker-list bigdata01:9092

6. 消费消息

  • 0.9 之前的版本. 元数据存储在zk,. 所以需要连接zk集群进行消费(过时的命令)

    • kafka-console-consumer.sh --zookeeper zk服务器:2181 --topic 主题名 --from-beginning
  • 0.9之后的版本, 元数据存储在集群的topic中

    • kafka-console-consumer.sh --bootstrap-server zk服务器:9092 --topic 主题名 --from-beginning
  1. 本地主机进行消费
[win10@bigdata01 kafka-0.11]$ bin/kafka-console-consumer.sh --topic test_topic  --zookeeper bigdata01:2181 --from-beginning
Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
  1. 其他的主机进行消费
[win10@bigdata02 kafka-0.11]$ bin/kafka-console-consumer.sh --topic test_topic --zookeeper bigdata01:2181 --from-beginning
Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
  1. 修改分区数
bin/kafka-topics.sh --zookeeper bigdata01:2181 --alter --topic first-one --partitions 6

2.4 分离日志和数据

设置kafka 的实际数据存放目录为 /opt/module/kafka-0.11/data, 运行日志存储路径为 /opt/module/kafka-0.11/logs

  1. 如果此时kafka集群内已经有主题了, 删除原先设置目录logs中的所有内容
  2. 关闭kafka集群和zookeeper集群, 把zk集群内的关于kafka 的结点数据全部清除
  3. 按上面的说明设置即可.

二-0 总结和补充

  • Q: zookeeper在kafka集群中的作用?
  1. 存储kafka的集群信息.(kafka 的元数据, 如topic信息(分区,副本,leader等等))

bin/kafka-topics.sh --zookeeper 服务器:2181 --create/delete/alter --topic 主题名 --partitions 分区号 --replicatipon-factor 副本数

  1. 存储消费者的消费位置(偏移量offset), 0.9之前是这样, 现在都是存储在kafka集群的topic中.

0.9之前: bin/kafka-console-consumer.sh --zookeeper 服务器:2181 --topic 主题名 ...
0.9之后: bin/kafka-console-consumer.sh --bootstrap-server kafka集群服务器:9092 --topic 主题名 --from-beginning ...

注意哈. 生产者不依赖于zookeeper集群, 它主要是对kafka集群进行操作的, 命令通常是

bin/kafka-console-producer.sh --broker-list kafka集群服务器:9092 --topic 主题名 ...
服务器:2181 --topic 主题名 …`

0.9之后: bin/kafka-console-consumer.sh --bootstrap-server kafka集群服务器:9092 --topic 主题名 --from-beginning ...

注意哈. 生产者不依赖于zookeeper集群, 它主要是对kafka集群进行操作的, 命令通常是

bin/kafka-console-producer.sh --broker-list kafka集群服务器:9092 --topic 主题名 ...

Guess you like

Origin blog.csdn.net/nmsLLCSDN/article/details/121066820