kafka笔记
大约 3 分钟mqmq
概念
Broker
- Kafka的服务端程序,可以认为一个mq节点就是一个broker
- broker存储topic的数据
Producer生产者
- 创建消息Message,然后发布到MQ中
- 该角色将消息发布到Kafka的topic中
Consumer消费者:
- 消费队列里面的消息
ConsumerGroup消费者组
同个topic, 广播发送给不同的group,一个group中只有一个consumer可以消费此消息
Topic
每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic,主题的意思
Partition分区
- kafka数据存储的基本单元,topic中的数据分割为一个或多个partition,每个topic至少有一个partition,是有序的
- 一个Topic的多个partitions, 被分布在kafka集群中的多个server上
- 消费者数量 <=小于或者等于Partition数量
Replication 副本(备胎)
- 同个Partition会有多个副本replication ,多个副本的数据是一样的,当其他broker挂掉后,系统可以主动用副本提供服务
- 默认每个topic的副本都是1(默认是没有副本,节省资源),也可以在创建topic的时候指定
- 如果当前kafka集群只有3个broker节点,则replication-factor最大就是3了,如果创建副本为4,则会报错
ReplicationLeader、ReplicationFollower
- Partition有多个副本,但只有一个replicationLeader负责该Partition和生产者消费者交互
- ReplicationFollower只是做一个备份,从replicationLeader进行同步
ReplicationManager
- 负责Broker所有分区副本信息,Replication 副本状态切换
offset
- 每个consumer实例需要为他消费的partition维护一个记录自己消费到哪里的偏移offset
- kafka把offset保存在消费端的消费者组里
Docker安装
## 安装ZK
docker run -d --name zookeeper-server \
--network=host \
--restart=always \
-e ALLOW_ANONYMOUS_LOGIN=yes \
bitnami/zookeeper:latest
##安装kafka服务端
docker run -d --name kafka-server \
--network=host \
--restart=always \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_CFG_ZOOKEEPER_CONNECT=127.0.0.1:2181 \
bitnami/kafka:latest
## 安装kafka客户端
docker run -it --rm \
--network=host \
-e KAFKA_CFG_ZOOKEEPER_CONNECT=127.0.0.1:2181 \
bitnami/kafka:latest kafka-topics.sh --list --bootstrap-server 127.0.0.1:9092
docker run -d --network=host --name=kafka-manager -p 9000:9000 -e ZK_HOSTS="192.168.0.110:2181" sheepkiller/kafka-manager:2.5.1
docker run -d --network=host -v /opt/zk:/home/michael/opt/zookeeper/data --name zookeeper wurstmeister/zookeeper
docker run -d --network=host --name kafka \
-p 9092:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=127.0.0.1:2181 \
-e KAFKA_LOG_RETENTION_HOURS=5 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.0.110:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://192.168.0.110:9092 wurstmeister/kafka
docker run -d --network=host \
-p 8080:8080 \
-v /opt/kafka-map/data:/usr/local/kafka-map/data \
-e DEFAULT_USERNAME=admin \
-e DEFAULT_PASSWORD=admin \
--name kafka-map \
--restart always dushixiang/kafka-map:latest
Kafka数据存储流程
Partition
topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列
是以文件夹的形式存储在具体Broker本机上
LEO(LogEndOffset)
- 表示每个partition的log最后一条Message的位置。
HW(HighWatermark)
- 表示partition各个replicas数据间同步且一致的offset位置,即表示allreplicas已经commit的位置
- HW之前的数据才是Commit后的,对消费者才可见
- ISR集合里面最小leo
offset:
- 每个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中
- partition中的每个消息都有一个连续的序列号叫做offset,用于partition唯一标识一条消息
- 可以认为offset是partition中Message的id
Segment:每个partition又由多个segment file组成;
- segment file 由2部分组成,分别为index file和data file(log file),
- 两个文件是一一对应的,后缀”.index”和”.log”分别表示索引文件和数据文件
- 命名规则:partition的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset+1
Kafka高效文件存储设计特点:
- Kafka把topic中一个parition大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。
- 通过索引信息可以快速定位message
- producer生产数据,要写入到log文件中,写的过程中一直追加到文件末尾,为顺序写,官网数据表明。同样的磁盘,顺序写能到600M/S,而随机写只有100K/S