kafka 基本概念

应用场景

  • 日志聚合,一般kafka 使用来记录日志信息。
  • 限流削峰,当大量数据同时请求到服务的时候,可以造成服务宕机,直接将消息放到kafka,然后对应服务根据规则取读取。

高吞吐率

  • 顺序读写(partition中的消息是顺序读写的。)
  • 零copy
  • 批量发送
  • 压缩消息

基本术语

  • broker kafka机器节点
  • topic 主题 逻辑上概念,来划分消息所属的类
  • partition 主题对应到物理存储上 。一个topic 至少一个partition 。在某个partition中的消息是有序的。多分区小没有办法保证消息的有序性 分区本身是 FIFO。一般 分区数量是borker的整数倍
  • segment 将partiton 细分为段,(三个文件一套 ,index .log )每个段的最大存储值是相同的

通过二分查找找到对应的 文件log 然后根据 index文件中存储的偏移量 找到对应的log中的偏移量存储的消息。

log 文件的最大大小配置在配置文件中log.segment.byte

  • consumer 消费者: 一个消费者可消费多个topic,也可以消费同一个topic中的多个parition中的消息。一个分区中的消息运行多个无关的消费者同时消费。
  • cosumergroup:消费者组 组内的消费者会协调在一起,平均消费分区。对分区的消费是平均的。但是对消息的消费不是平均的。某个消费者只能消费一个pairtition中的消息。
  • producer 生产者: 生成的消息默认是平均分的。也可以指定写到某个partition。也可以根据消息的key 当作路由算出来写到某个分区
  • 分区副本: 防止消息丢失做的 分区的备份。需要注意的是 备份得在不同的机器上。
  • partition leader :多个副本 得有一个 leader。负责当前消息的读写的partition。broker controller 负责leader 的选举
  • partition follower:主备 消息 follower 不是主从。主备的。从节点不对外提供服务
  • isr 副本的同步列表 get /brokers/topics/java/partitions/state 得到 一个 isr :【2,1】 列表 leader 的节点下标 leader “2”
  • offest :每条消息都有一个当前parittion下的唯一的一个64字节的偏移量。先根据index下索引文件找到对应的偏移量。根据偏移量找到对应的消息的地址值。
  • broker controller broker有一个被选举为controller。负责管理 partition和 replicas的状态 例如 partition leader 故障,由controller 负责从isr的 follower中选举出一个新的leader 。当某个partition数量发生变化的时候,controller来负责重新分配消费者。
  • Hw 与 Leo
    hw 表示consumer可以消费到的最高的 partition偏移量。为了保证 partiton中leader和follower的数据一致性

leo表示 follower 当前最后一个写入消息的位置。

leader新写入的消息。consumer不能立刻消费。等到同步完成后,更新hw 。消息才能被消费

    ![file](https://img-blog.csdnimg.cn/20191121122605215.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTU3OTYwNg==,size_16,color_FFFFFF,t_70)
    * Zookeeper
    从kafka 0.9 版本之后,zk的工作变的很简单,负责维护和协调borker。broker controller的选举工作。zk中存放着 各个topic主题的分区信息,分区的leader信息等。
    * Coordinator
    是broker上的一个进程。管理consumer group中的各个成员,主要用于offset位移的管理和rebalance。
    * Rebalance
     当分区数量发生变化的时候,或者消费者组中的消费者数量发送变化的时候,将partiton重新分配到不同的消费者。
     *offset commit
     consumer 消费一批消息后,需要将消费完的offset提交给broker。让borker记录下哪些消息是消费过的。
     系统会将提交的offset 做完消息写入到 _consumer_offsets 主题的partiton中。key为消费者的id。 根据key 计算出hash值,然后再将hash与50 取模,余数就是对应的partition编号。
### Kafka 基本概念 Kafka 是一种分布式流处理平台,主要用于高吞吐量的实时数据传输和处理。它最初由 LinkedIn 开发并开源,广泛应用于日志收集、监控数据聚合、在线和离线分析等领域。 #### Topic(主题) 主题是 Kafka 中的一个核心概念,表示一类消息或者一个 feed 名称[^4]。它可以看作是一个分类器,用于区分不同类型的数据。每个主题可以有多个生产者向其发送消息,同时也有多个消费者订阅这些消息。主题中的消息会被存储一段时间,具体时间可以通过配置来设定。 #### Broker(代理) Broker 是 Kafka 集群中的节点[^1]。每个 Kafka 实例运行在一个 Broker 上,负责接收来自 Producer 的消息并将它们存储在磁盘中。此外,Broker 还负责响应 Consumer 请求并向其提供所需的消息。 #### Producer(生产者) 生产者是指向 Kafka 主题发布消息的应用程序或服务[^1]。Producer 负责将数据序列化为字节流,并将其发送到指定的主题。为了提高性能,Producer 可以批量发送消息或将消息压缩后再发送。 #### Consumer(消费者) 消费者是从 Kafka 主题订阅消息的应用程序或服务[^3]。Consumer 使用 Pull 模型从 Broker 获取数据,而不是依赖 Push 模型。这样设计的好处在于能够更好地控制流量以及应对突发的大规模请求。另外,Consumer 需要记录自己的消费位置 (Offset),以便在网络中断或其他异常情况发生后可以从上次停止的地方继续消费。 #### Partition(分区) 分区是对同一主题下不同部分进行划分的结果。通过引入分区机制,不仅实现了水平扩展能力(即增加更多的机器加入集群从而分担负载压力),而且也支持并发访问同一个主题的不同子集。每条记录只会属于某一分区内的某个偏移量(offset)处。值得注意的是,在创建新分区时无法迁移已存在的旧数据至新的分区之中。 #### ISR 和 Leader/Follower - **ISR(In-Sync Replicas)** 表示当前同步状态良好的副本集合[^1]。只有当 follower 完全复制了 leader 所有的更新操作之后才能成为 isr 成员之一。 - 对于每一个 partition 来说都存在两种类型的 leaders: - **Controller Leader**: 控制整个 cluster metadata changes like creating/deleting topics etc. - **Partition Leader**: 处理 client requests related to that particular partition. #### 数据持久性和可靠性保障措施 每当 producer 将一条 message 发送给特定 topic-partition 后,kafka 不会立即将此 message 存储进 memory cache ,而是直接 flush 到 disk log file 当中去[^2].这种做法虽然牺牲了一定程度的速度优势但却极大地增强了 system fault tolerance level because even if there was a crash immediately after writing but before acknowledging receipt back to sender side still all written records would remain safe on persistent storage medium until they get consumed by corresponding consumers later according their retention policy settings defined earlier during setup phase of respective environments accordingly as well ! ```python from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers='localhost:9092') future = producer.send('my-topic', b'raw_bytes') result = future.get(timeout=60) print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值