目录
1.KAFKA简言
2.KAFKA功能
3.KAFKA流程
4.KAFKA存储
5.KAFKA选举
6.KAFKA实战
前言
KAFKA主要用于消息的海量吞吐场景,通常用于数据的异步,以及流量峰值的平衡削峰,实现架构的松耦合
1.KAFKA简言
*采用时间戳标识来进行存储,即使TB级别的数据处理也可以保证稳定性
*极高的数据处理,即便在性能较差的服务器上也能单机每秒10万左右的消息传输
*可以为消息分区指定多个副本文件,不会出现大规模的数据丢失
*强横的横向扩展,可以在不重载集群配置的情况下加入节点
2.KAFKA功能
* Broker(代理)• Kafka 的一个实例或节点,一个或多个 Broker 组成一个 Kafka 集群* Topic(主题)• Topic 是 Kafka 中同一类数据的集合,相当于数据库中的表• Producer 将同一类数据写入同一个 Topic , Consumer 从同一个 Topic 中读取同类数据• Topic 是逻辑概念,用户只需指定 Topic 就可以生产或消费数据,不必关心数据存于何处* Partition(分区)• 分区是一个有序的、不可修改的消息队列,分区内消息有序存储• 一个 Topic 可分为多个分区,相当于把一个数据集分成多份,分别存储不同的分区中• Parition 是物理概念,每个分区对应一个文件夹,其中存储分区的数据和索引文件* Replication(副本)• 一个分区可以设置多个副本,副本存储在不同的 Broker 中* Producer(消息生产者)• 向 Broker 发布消息的客户端* Consumer(消息消费者)• 从 Broker 消费消息的客户端* Consumer Group(CG,消费者组)• 每个 Consumer 都隶属于一个特定的 CG• 一条消息可以发送给多个不同的 CG ,但一个 CG 中只能有一个 Consumer 读取该消息* Zookeeper• Kafka 将元数据保存在 Zookeeper 中• 负责 Kafka 集群管理,包括配置管理、动态扩展、 Broker 负载均衡、 Leader 选举,以及Consumer Group 变化时的 Rebalance 等
3.KAFKA流程
集群内部消息走向:\
Producer-->Topic-->Partition-->Consumer/Consumer Group---> Partition是一个FIFO队列, 写入消息采用在队列尾部追加的方式,消费消息采用在队列 头部 顺序读取的方式---> 一个Topic可分为多个Partition,仅保证同一分区内消息有序存储,不保证Topic整体(多 个分区之间)有序---> 为了加快读取速度,多个Consumer可划分为一个组(Consumer Group, CG),并行消 费同 一个Topic---> 一个Topic可以被多个CG订阅,CG之间是平等的,即一个消息可同时被多个CG消费---> 一个CG中可以有多个Consumer,CG中的Consumer之间是竞争关系,即一个消息在一 个CG 中只能被一个Consumer消费
4.KAFKA存储
消息存储主要分为索引文件和数据文件两部分
每个partition分区的消息都以文件的方式存储在本地的文件系统内
---> 每个Partition副本都是一个目录,目录中包含若干Segment文件
---> Segment(段文件)• Segment文件是 Kafka 的最小数据存储单元,一个 Partition 包含多个 Segment 文件• Segment 文件由以 Message 在 Partition 中的起始偏移量命名的数据文件( *.log)和索 引文件 (*.index、 *.timeindex )组成---> Offset(偏移量)• Offset 是用于定位分区中消息的顺序编号• Offset 用于在分区中唯一标识消息• 使用 Zookeeper 维护 Offset---> Kafka索引• 为了提高消息写入和查询速度,为每个 Partition 创建索引,索引文件存储在 Partition 文件夹下• 偏移量索引-文件以 offset 偏移量为名称,以 index 为后缀-索引内容格式: offset,position-采用稀疏存储方式
• 时间戳索引-文件以 timeindex 为后缀-索引内容格式: timestamp,offset-采用稀疏存储方式
5.KAFKA选举
producer 发送数据到指定的 topic, topic 的每个 partition 收到producer 发送的数据后,都需要向 producer 发送 ack(acknowledgement 确认收到),如果producer 收到 ack, 就会进行下一轮的发送,否则重新发送数据。
ACK选项:
ack=0: producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟, broker 一 接收到还没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据;
ack=1: producer 等待 broker 的 ack, partition 的 leader 落盘成功后返回 ack,如果 在follower同步成功之前 leader 故障,那么将会丢失数据
ack=-1(all): producer 等待 broker 的 ack, partition 的 leader 和 ISR 的follower 全部 落盘成功后才返回 ack。但是如果在 follower 同步完成后, broker 发送 ack之前, leader 发生故障,那么会造成数据重复
ISR:
AR: Assigend Replacas用来表示副本的全集
OSR: out-sync Replicas 离开同步队列的副本
ISR: in-sync Replicas 计入同步队列的副本
ISR=Leader+没有落后太多的副本
AR=OSR+ISR
消息同步过程:1.producer--->push----->leader
2.leader<----pull<-----follower
3.Follower间隔一段时间去Leader拉取数据,保证数据的一致性
ISR标准:
当主节点异常,优先从ISR中选取leader,ISR由KAFKA动态维护。
当follower超过10秒没有同步数据就会被踢出ISR中:
replicas.lag.time.max.ms=10000
当leader和follower相差超过4000条数据follower也会被提出ISR:
replicas.lag.max.messages=40000
脏节点选举:
脏节点选举是KAFKA的一种降级措施,当主节点故障而ISR中的follower也没 有来的及去同数据,就会选一个时间数据最接近的作为leader
6.KAFKA实战
KAFKA部署:Apache Kafka