Kafka 菜鸟学习笔记

kafka:

  • 集群模式,即便只有一个节点,也是集群
  • 基于zookeeper的分布式消息系统,分布式流平台,并不单纯是个消息队列
  • 具有高吞吐率、高性能、实时及高可靠等特点

基本概念:

  •     broker:    一个独立的kafka服务器,接受来自生产者的消息
  •     brkoer集群:若干个broker组合起来的集群
  •     Topic:        主题。一个虚拟的概念,代表消息的类型,一个主题可以有多个分区,分区存放在不同的broken上
  •     Partition:    分区。实际消息存储单位
  •     Producer:    消息生产者
  •     Consumer:    消息消费者

五大API:前三个常用

  1.   Producers
  2.   Consumers
  3.   Stream Processors
  4.   Connectors
  5.   Admin

AdminClient API:

  •     AdmminClient:创建AdminClient客户端对象
  •     NewTopic:创建Topic
  •     CreateTopicsResult:创建Topic的返回结果
  •     ListTopicsResult:查询Topic列表
  •     ListTopicsOptions:查询Topic列表及选项
  •     DescribeTopicsResult:查询Topics
  •     DescribeConfigsResult:查询Topics配置项

Prodecers API:

发送模式:

同步发送、异步发送、异步回调发送

KafkaProducer:

  1. MetricConfig
  2. 加载负载均衡器
  3. 初始化Serializer
  4. 初始化RecordAccumulator,类似于计数器
  5. 启动newSender,守护线程

源码通知:

  1. Producer是线程安全的
  2. Producer并不是接到一条发一条
  3. Producer是批量发送,减少IO操作(一次写入大量数据),日志文件追加

producer.send(record):

  1. 计算分区:消息具体进入哪一个partition
  2. 计算批次:accumulator.append(),往待发送批次里增加记录
  3. 主要内容:
    1. 创建批次
    2. 向批次中追加记录

Producer发送原理解析:

  1. 直接发送:kafka的producer会直接把消息发送到分区leader的主机上,一般不会涉及到其他干预
  2. 负载均衡:没有自定义则默认,数据是可以被控制在哪个分区上的,由客户端决定。默认时为伪随机发送
  3. 异步发送:本身是Future对象(可以不获取),可以批量发送减少单次IO,增大吞吐量

消息传递保障:

依赖于Producer和Consumer共同实现,主要依赖于Producer
        producer需要server接收到数据之后发出的确认接收的信号,此项配置就是指producer需要多少个这样的确认信号。代表了数据备份的可用性
        1.最多一次:收到0到1次保障(速度最快)
        2.至少一次:收到1到多次(其次)
        3.正好一次:有且仅有一次


Consumer客户端操作

配置配置文件,然后设置订阅哪一个Topic或者几个,用循环批量拉取

在拉取时,可以设置offset自增,这样是最简单的使用方式,但处理数据失败后无法回滚
        通过consumer.commitAsync()可以手动更新一个批次

注意事项:

  1. 单个分区的消息只能由ConsumerGroup中某个Consumer消费    即:一个分区的消息只能给一个Consumer,但一个Consumer可以从多个分区中拉取消息
  2. Consumer从分区中消费消息是顺序的,默认从头开始消费
  3. 单个ConsumerGroup会消费分区中的消息

最优:一个分区由一个Consumer去消费,充分利用资源性能
        consumer.assign()制定订阅的分区

多线程情况:


        并不是线程安全的,需要自行解决
    
        经典模式:(新手建议)
            简单来说,线程类自带consumer属性,也就是每一个线程对象都有consumer对象,这样便是线程安全的
            但每个线程都需要一个consumer对象,创建和销毁都比较占资源
            
        分发模式:(适合流式数据)
            由一个consumer拉取消息,然后将数据分发给不同的线程
            快速处理数据,但是因为无法监听线程回馈导致业务无法回滚

offset:

手动控制offset,当出现程序错误时,可重复消费一次
        consumer.seek()

  1. 第一次从0开始消费(一般情况)
  2. 比如一次消费了100条吗,则offet设置为101并且存入Redis
  3. 每次拉取之前从redis中获取最新的offset位置
  4. 每次从这个位置开始消费

Stream API:

基本概念:

  1. 处理分析存储在Kafka数据的客户端程序库
  2. Stream通过state store可以实现高效状态操作
  3. 支持原语Processor和高层抽象DSL
  •         流及流处理器: 数据流,对数据进行处理的节点
  •         流处理拓扑:流的走向,流程图
  •         源处理器和Sink处理器:数据的源头,来源      数据的终点,出口

通过input主题和output主题来实现数据源和出

//创建流
Properties pros = .....
StreamsBuilder sB =....
KafkaStreams streams =  new KafkaStreams(sB.build(),props)
streams.start();

Connect API

Connect是Kafka流式计算的一部分
    主要用来与其他中间件建立流式通道
    支持流式和批量处理集成
    



Kafka集群

Kafka天然支持集群

依赖于Zookeeper进行协调

通过brokerId区分不同节点

 

Kafka副本集:

将日志复制多份

可以为每个Topic设置副本集

可以通过配置设置默认副本集数量

 

Kafka核心概念

  • Broker:Kafka的部署节点
  • Leader:用于处理消息的接受和消费等请求
  • Follower:主要用于备份消息数据

节点故障

  • Kafka与Zookeeper心跳未保持视为节点故障
  • follower消息落后leader太多也视为节点故障
  • Kafka会对故障节点进行移除

故障处理方式

  • 基本不会因为节点故障而丢失数据
  • 语义担保很大程度避免数据丢失
  • 会对消息进行集群内平衡,减少消息在某些节点热度过高,即不要放一个篮子上

Leader选举

  • 并没有采用多数投票来选举leader
  • 会动态维护一组Leader数据的副本(ISR)
  • 在ISR中选择一个速度比较快的设为Leader

Kafka有一种无奈的情况,ISR中副本全部死机,对于这种情况,会进行unclean leader(脏选举)

1.死等,等到有一个恢复正常

2.在ISR以外的节点使用,确保快速恢复

Leader选举配置建议:.

  • 禁用“unclean leader”脏选举

  • 手动指定最小ISR


Kafka集群监控

猜你喜欢

转载自blog.csdn.net/qq_20176001/article/details/108318050