跳至主要內容

kafka笔记

xw大约 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