一, KafKa 概述

1. 定义

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

二, Kafka 快速上手

2.1 Kafka 基础架构

jolokia kafka 指标 kafka quota_jolokia 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)消息的客户端
  1. Consumer-消费者:
  • 向Kafka broker 取(pull)消息的客户端
  1. Consumer Group(CG): 消费者组,(topic中一个分区的一条消息可以被多个消费者组全量消费, 但是只能被同一消费者组中的一个消费者消费)
  • 由一到多个Consumer组成,每个Consumer都属于一个Consumer Group。消费者组在逻辑上是一个订阅者。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内的一个消费者消费;消费者组之间互不影响。即每条消息只能被Consumer Group中的一个Consumer消费;但是可以被多个Consumer Group组的每个consumer消费。这样就实现了单播和多播。
  1. Broker: (一个broker id 就是一台服务器, 所以id是唯一的)
  • Kafka集群包含一个或多个服务器,这种服务器被称为broker.一个集群由多个Broker组成, 一个Broker可以容纳多个topic; Producers往Brokers里面的指定Topic中写消息,Consumers从Brokers里面拉取指定Topic的消息,然后进行业务处理,broker在中间起到一个代理保存消息的中转站。
  1. Topic: (一类消息的集合, 屏蔽底层复杂存储方式,包含多个分区, 每个分区都可以是一个队列,)
  • 消息的类别或者主题,逻辑上可以理解为队列。Producer只关注push消息到哪个Topic,Consumer只关注订阅了哪个Topic。
  1. Partition: (在分布式系统中, 同一topic的不同分区可以分布到多台机器中, 一是可以水平扩展, 避免单机IO和性能限制,提高读写并行度, 二是方便通过复制增加数据冗余性, 提高容灾能力)
  • 负载均衡与扩展性考虑,一个Topic可以分为多个Partition,物理存储在Kafka集群中的多个Broker上。可靠性上考虑,每个Partition都会有备份Replica。每个partition是一个有序的队列.
  1. Replica:
  • 副本, 为保证集群中的某个节点发生故障时, 该节点上的partition数据不丢失, 且Kafka能够继续工作, Kafka提供了副本机制, 一个Topic的每个分区都有若干个副本, 一个leader和若干个follower.
  1. leader:
  • 每个分区多个副本的"主", 生产者发送数据的对象, 以及消费者消费数据的对象都是leader.(Producer和consumer只跟leader交互.)
  1. follower:
  • 每个分区多个副本中的"从", 实时从leader中同步数据, 保持和leader数据的同步. leader发生故障时, 某个follower会成为新的follower.
  1. Controller:
  • Karfka 集群中的其中一台服务器, 用来进行leader election(选举)和各种failover(故障转移)
  1. Offset: 记录消费的位置. 0.9之前是存储在zk集群中,之后的新版本是存储在kafka集群的topic中.

jolokia kafka 指标 kafka quota_bootstrap_02


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. jolokia kafka 指标 kafka quota_jolokia kafka 指标_03

  3. 在安装目录下手动创建logs目录
  4. 修改./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
  • jolokia kafka 指标 kafka quota_bootstrap_04

  • source /etc/profile
  1. 分发安装包
  • 分发脚本xsync
[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进程的问题:

  • 问题:
  • jolokia kafka 指标 kafka quota_kafka_05

  • 解决办法:
    修改上述脚本,
  • jolokia kafka 指标 kafka quota_jolokia kafka 指标_06

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进程存在即可)

jolokia kafka 指标 kafka quota_bootstrap_07


  1. 查看当前服务器中的所有topics
(过时)bin/kafka-topics.sh --zookeeper bigdata01:2181 --list

 bin/kafka-topics.sh -- --bootstrap-server bigdata01:9092 --list
  1. 创建topic, 名字为topic-one
  • 主题名(–topic), 分区号(–partition), 副本数(–replication-factor)
(过时命令)bin/kafka-topics.sh  --zookeeper bigdata01:2181 --create --topic 主题名 --partitions 分区号 --replication-factor 副本数  

bin/kafka-topics.sh  --bootstrap-server bigdata01:9092  --create --topic 主题名 --partitions 分区号 --replication-factor 副本数

jolokia kafka 指标 kafka quota_数据_08

Kafka中创建topic的**副本数量(replicator-factor)**需要注意的地方:

jolokia kafka 指标 kafka quota_bootstrap_09

在这里需要注意, 创建的副本数量(replication-fator)不能大于实际机器(broker)的数量, 为什么? 自己想一想啊, 副本是备份的, 首先不会放在原有的机器上, 其次除了原有的设备, 其他的设备一台保有一份副本.

  1. 删除topic
bin/kafka-topics.sh  --bootstrap-server bigdata01:9092 --delete --topic 主题名

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

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

jolokia kafka 指标 kafka quota_kafka_10


jolokia kafka 指标 kafka quota_数据_11

5. 发送(生产)消息

jolokia kafka 指标 kafka quota_jolokia kafka 指标_12

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

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

6. 消费消息

jolokia kafka 指标 kafka quota_数据_13


jolokia kafka 指标 kafka quota_jolokia kafka 指标_14

  • 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   --bootstrap-server bigdata01:9092 --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 --bootstrap-server bigdata01:9092 --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  --bootstrap-server bigdata01:9092 --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 总结和补充

  • 记住一句话, 无论是生产者, 消费者, 还是单纯的查看, 新建, 删除topic, 连接的服务器和端口号始终是: --bootstrap-server bigdata01:9092
  • 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 --bootstrap-server 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 --bootstrap-server bigdata01:9092 --topic 主题名 ...