Kafka学习

一、消息队列作用:解耦、削峰、缓冲(生产速度和消费速度不一致)

二、消息队列的两种模式:点对点模式(一对一)、发布订阅模式(一对多 1. 消费者主动拉取消息 2. 队列主动推消息)

三、基础架构:

  A、生产者

  B、kafka

    Broker kafka的一个进程(集群的一个节点)--------------->>>Topic 主题,将数据分类   -------------------------->>>Partion 分区,负载均衡,提高了topic的负载能力-------------------->>>leader,负责业务-------------------------->>>follower,分区的副本,不能提供业务,只是备份

  C、消费者

    消费者组:

      1. 注意:同一个分区只能被同一个消费者组里的一个消费者消费,所有消费者里的消费者数量不能大于订阅主题的分区数量。

      2. 消费者组提高了消费能力

  D、zookeeper

    管理kafka集群的,记录消息消费位置(0.9版本之前是,0.9版本之后就存在本地了)

四、安装kafaka

  A、下载并解压到置顶位置

五、修改配置文件

  A、server.properties kafka服务端配置

    1. broker.id=0 broker的id,必须是唯一的整数

    2. delete.topic.enable=true 是否可以删除主题,默认是false

    3. log.dirs=/opt/soft/kafka_2.12-2.3.1/data kafka暂存数据目录

    4. log.retention.hours=168 数据保留时间(小时)

    5. zookeeper.connect=localhost:2181 zookeeper的连接地址

  B、常用命令

    1. kafka-server-start.sh 启动

    2. kafka-server-stop.sh 关闭命令

    3. kafka-console-consumer.sh 消费者端

    4. kafka-console.producer.sh 生产者端

    5. kafka-topics.sh 主题

六、主题的增删改查

  1. kafka-topics.sh --list --zookeeper zookeeper节点ip:2181 (查看topic列表)

  2. kafka-topics.sh --create --zookeeper zookeeper节点ip:2181 --topic 主题名字 --partitions 分区数 --replication-factor 副本数  (创建主题)

  3. kafka-topics.sh --delete --zookeeper zookeeper节点ip:2181 --topic 主题名字 (删除主题)

  4. kafka-topics.sh --describe --zookeeper zookeeper节点ip:2181 --topic 主题名字 (主题详情)

七、生产者端

  1. 启动生产者端:kafka-console-producer.sh --topic 主题名 --broker-list kafka集群节点ip:9092 

八、消费者端

  1. 开启消费者端:kafka-console-consumer.sh --topic 主题名 --bootstrap-server kafka集群节点ip:9092 [--from-beginning]是否从头开始消费

九、kafka架构深入

  1. topic是逻辑上的概念,partition是物理上的概念,每个partition对应一个log文件

  2. 数据可靠性保证

    消息发送给partition的leader,所有的follower都同步之后会发送ack

    ISR: leader维护了一个动态的in-sync replica set(ISR),意为和leader保持同步的follower集合。当ISR中的follower完成数据同步之后,leader就会给follower发送ack。如果follower长时间没有向leader同步数据,则该follower将被踢出ISR,该时间阈值由replica.time.max.ms参数设置。Leader发生故障之后,就会从ISR中选举新的leader。

  3. acks配置

    0: producer不等待broker的ack,这一操作提供了一个最低的延迟,broker一接收到还没有写入磁盘就已经返回,当broker故障时可能丢失数据。

    1: producer等待broker的ack,partition的leader落盘成功后返回ack,如果在follower同步成功前leader故障,可能丢失数据。

    -1(all): producer等待broker的ack,partition的leader和ISR中的follower全部落盘成功后才返回ack。但是如果在follower同步完成之后,broker发送ack之前,leader发生故障,那么会造成重复数据。

  4. 故障处理细节

    a. follower故障

      follower发生故障后会被临时踢出ISR,待该follower恢复后,follower会读取本地磁盘记录的上次的HW,并将log文件高于HW的部分截取掉,从HW开始向leader进行同步。等待该follower的LEO大于等于该partition的HW时,就可以重新加入ISR了。

    b. leader故障

      leader故障后从ISR中重新选取一个新的leader,之后为了保证多个副本之间的数据一致性,其余的follower会将各自的log文件高于HW的部分截取掉,然后从新的leader同步数据。

  5. exactly-once 精准一次性消费

    a. AtLeast Once + 幂等性 = Exactly Once

      要启用幂等性,只需要将Producer的参数中enable.idompotence设置为true即可。开启幂等性的producer在初始化的时候会被分配一个pid,发往同一partition的消息会附带sequence number。而broker端会对< pid, partition, sequence number>做缓存,当具有相同主键的消息提交时,broker只会持久化一条。

      注意:但是pid重启就会发生变化,同时不同的partition也具有不同的主键,所以幂等性无法保证跨分区跨会话的Exactly Once。

  6. 分区分配策略

    a. 两种分配策略(RoundRobin和Range)

      1) RoundRobin:轮询

        多个主题当做一个整体, 所以前提要多个消费者订阅的主题相同

      2) Range(默认)

        以单个主题来分

    b. 当消费者组数量变化的时候会重新分配

  7. offset是根据消费者组,分区,主题来确定的

  8. 高效读写数据

    a. 顺序写磁盘

      开辟了一个完整的区间,省去了大量磁头寻址的时间

    b. 零拷贝技术

      传统: 代码->操作系统->文件->操作系统->代码->操作系统->另一个文件

      零拷贝:代码->操作系统->文件->操作系统->另一个文件

  9. zookeeper在kafka当中的作用

    kafka集群中有一个broker会被选举为controller,负责管理集群broker的上下线、所有topic的分区副本分配和leader选举等工作。controller管理工作都是依赖zookeeper进行的。

  10. kafka事务

    事务可以跨会话,跨分区做到精准一次性。

    a. 生产者事务

      为了实现跨分区跨会话 的事务,需要引入一个全局唯一的TransactionID,并将Producer的Pid和transactionID进行绑定。这样当producer重启后就可以通过transactionID获取原来的pid。

      为了管理transactionID,kafka引入了一个新的组件transaction coordinator。 producer就是通过和transaction coordinator交互获取transactionID对应的任务状态。transaction coordinator还负责将所有事务写入kafka的一个内部topic,这样即使整个服务重启,由于事务状态得到保存,进行中的事务状态可以得到恢复,从而继续进行。

    b. 消费者事务

      对于consumer而言,事务的保证相对较弱,尤其无法保证commit的信息被精确消费。这是由于consumer可以通过offset访问任意信息,而且不同的segment file生命周期不同,同一事务的消息可能出现重启后被删除的情况。

  11. 消息发送流程

    main线程--->send方法(interceptors(拦截器)->serializer(序列化器)->partitioner(分区器))--->RecordAccumulator(记录累加器:待发送数据)--->send线程---->topic

posted on 2019-11-08 18:30  DjanFey  阅读(202)  评论(0编辑  收藏  举报

导航