一、kafka的基本知识
1.kafka的安装
- 部署一台zookeeper服务器(kafka包里有自带)
- 安装jdk
- 下载kafka的安装包:Apache Kafka
- 上传到kafka服务器上:
/usr/local/kafka
- 解压缩压缩包
- 进入到config目录内,修改server.properties
#broker.id属性在kafka集群中必须要是唯一
broker.id=0
#kafka部署的机器ip和提供服务的端口号
listeners=PLAINTEXT://localhost:9092
#kafka的消息存储文件
log.dir=/usr/local/data/kafka-logs
#kafka连接zookeeper的地址
zookeeper.connect=localhost:2181
- 进入到bin目录内,执行以下命令来启动kafka服务器(带着配置文件)
./kafka-server-start.sh -daemon ../config/server.properties
2.kafka的基本概念
名称 | 解释 |
Producer | 生产者,用于生产消息的。 |
Consumer | 消费者,用于消费消息的。 |
Consumer Group | 消费者组,每个consumer都属于一个特定的consumer group,这是kafka用来实现消息的广播和单播的手段。 |
Broker | 消息中间件处理节点,一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群 |
Topic | 这是一个逻辑概念,每一条消息都有一个消息类别,这种类别被成为topic.生产者生产消息时需要指定一个topic,消费者在获取消息的时候也需要指定topic. |
Partition | 分区。topic(主题)的物理体现。一个topic可以被分为一个或者多个partition,同一个partition中的消息是有序的,不同partition中的消息则丢失了有序性。 |
3.创建topic
- 通过kafka命令向zk中创建一个主题
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
- 查看当前zk中所有的主题
./kafka-topics.sh --list --zookeeper localhost:2181
4.发送消息
把消息发送给broker中的某个topic,打开一个kafka发送消息的客户端,然后开始用客户端向kafka服务器发送消息
./kafka-console-producer.sh --broker-list localhost:9092 --topic test
5.消费消息
打开一个消费消息的客户端,向kafka服务器的某个主题消费消息
- 方式一:从当前主题中的最后一条消息的offset(偏移量位置)+1开始消费
./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --topic test
- 方式二:从当前主题中的第一条消息开始消费
./kafka-console-consumer.sh --bootstrap-server 172.16.253.38:9092 --from-beginning --topic test
6.关于消息的细节
- 生产者将消息发送给broker,broker会将消息保存在本地的日志文件中
/usr/local/kafka/data/kafka-logs/主题-分区/00000000.log
- 消息的保存是有序的,通过offset偏移量来描述消息的有序性
- 消费者消费消息时也是通过offset来描述当前要消费的那条消息的位置
7.单播消息和多播消息
一个partition只能被同一个消费者组的一个消费者消费,所以要实现单播只需要将消费者放到同一个消费者组里面,要实现多播则将消费者放到不同的消费者组里面。
单播:
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=testGroup --topic test
多播:
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=testGroup1 --topic test
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=testGroup2 --topic test
9.查看消费者组里的详细信息
./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group testGroup
重点关注以下几个信息:
- current-offset: 最后被消费的消息的偏移量
- Log-end-offset: 消息总量(最后一条消息的偏移量)
- Lag:积压了多少条消息
二、kafka中各组件之间的关系
- producer将消息push给kafka,consumer从kafka中poll消息进行消费;
- 一个kafka集群中包含若干个节点,这些kafka节点被称作为broker,其中一个broker作为controller;
- 在broker中可以创建一个或多个逻辑分类topic,在创建的过程中需要指明一个或多个物理分区partition,同时还需要指明副本数,分别存放于不同的broker,这些partition副本中,副本是为了为主题中的分区创建多个备份,有一个作为leader,其余的作为follower。其中只有leader负责消息的读和写;
三、kafka集群中的controller、rebalance、HW
1.controller
- 集群中谁来充当controller
每个broker启动时会向zookeeper创建一个临时序号节点,临时序号节点最小的那个borker将会作为controller,而临时序号节点是有序递增的,所以最先启动的那个broker会被成为controller(先到先得),controller将会负责这么几件事:
- 当集群中有一个副本的leader挂掉,需要在集群中选举出一个新的leader,选举的规则是从isr集合中最右边获得
- 当集群中有broker新增或减少,controller会同步信息给其他broker
- 当集群中有分区新增或减少,controller会同步信息给其他broker
isr:可以同步和已同步的节点会被存入到isr集合中。
2.rebalance
- 前提:消费组中的消费者没有指明分区来消费
- 触发的条件:当消费组中的消费者和分区的关系发生变化的时候
- 分区分配的策略:在rebalance之前,分区怎么分配会有这么三种策略
- range:根据公式计算得到每个消费者消费哪几个分区:前面的消费者是分区总数/消费者数量+1,之后的消费者是分区总数/消费者数量
- 轮询:大家轮着来
- sticky:粘合策略,如果需要rebalance,会在之前已分配的基础上调整,不会改变之前的分配情况。如果这个策略没有开,那么就要进行全部的重新分配。建议开启。
3.HW
LEO是某个副本最后消息的消息位置(log-end-offset)
HW是已完成同步的位置。消息在写入broker时,且每个broker完成这条消息的同步后,hw才会变化。在这之前消费者是消费不到这条消息的。在同步完成之后,HW更新之后,消费者才能消费到这条消息,这样的目的是防止消息的丢失。