kafka 原理简介

1. 简介

  kafka是一个多分区、多副本,并且基于zookeeper协调的分布式消息系统。目前定位为一个分布式流式处理平台,以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。主要功能有以下三个方面:

  消息系统:作为一个消息系统,具有解耦、冗余存储、流量削峰、异步通信、扩展性、恢复性等功能。还实现了消息顺序性保障及回溯消费的功能;

  存储系统:消息可持久化到磁盘,降低了数据丢失的风险;

  流式数据处理平台:提供了完整的流式处理类库;

2. 基本概念

  一个kafka体系架构包括若干Producer、若干Broker、若干Consumer以及Zookeeper集群。

  producer:生产消息,将消息发送到broker,采取push模式推送消息;

  发送消息的三种确认模式:

    acks=0,发送消息后不进行确认;

    acks=1,发送消息后,leader副本写入后确认消息发送成功;

    acks=-1或者acks=all,发送消息后说有ISR副本写入成功后确认消息发送成功;

  broker:将收到的消息存储到磁盘;

  zookeeper:管理集群的元数据信息及控制器的选举操作等;

  consumer:订阅broker的消息并消费,采取pull模式拉取消息;

  消费者组:每个消费者都有一个对应的消费者组,一个消息只能被分配到一个主题的一个分区,一个消费者只能消费一个主题的一个分区的消息,所以一个消息只能被消费者组中的一个消费者消费;

  消费者组合消费者模型可以让消费能力具备横向伸缩性,通过调节消费者的个数来调节整体的消费能力,

  topic:主题,kafka中的消息以topic进行分类,生产者将消息发送到特定的主题,而消费者则订阅特定的主题;

  partition:分区,一个主题可以有多个分区,一个分区只属于一个主题。一个消息最终存储到某个主题的某个分区中,分区在存储层面是一个可追加的日志文件,消息被追加到分区日志时会分配一个偏移量(offset),offset是消息在分区中的唯一标识,通过它可以保证消息在分区内有序,也只是分区内有序。

  每一条消息发送到broker之前,会根据分区规则选择存储到具体的哪个分区。如果一个主题只有一个分区,那么这个分区所在的机器IO将会成为这个主题的性能瓶颈,设置多个分区就可以解决这个问题。一个主题的多个分区可以分布在不同的服务器上;

  replica:副本,一个分区可以有多个副本,副本分布在不同的broker,副本可以大大提高容灾能力。副本之间是一主多从的关系,leader副本负责处理读写请求。follower副本负责与leader副本消息同步。当leader副本出现故障,从follower副本重新选举新的leader副本,多副本机制实现了故障的自动转移。

  分区中的所有副本成为AR(assigned replicas),所有与leader副本保持一定程度的副本(包括leader副本)组成ISR(in-sync-replicas),与leader副本同步滞后的副本组成OSR(out-of-sync-replicas),AR=ISR+OSR。ISR集合中的副本追上leader副本时leader副本将其转义到ISR,只有ISR集合的副本才可以被选举为leader副本(不是绝对的,可以通过参数配置来改变);

  LSO(LogStartOffset)表示起始消息的偏移量,LEO(LogEndOffset)表示当前日志文件中下一条待写入消息的offset,它等于当前日志分区中最后一条消息的offset+1,ISR中的每个副本维护自己的LEO,ISR集合中最小的LEO就是该分区的HW(High Watermark)。消费者只能消费该分区HW之前的消息。

  副本之间的消息同步分为两种:同步复制,所有follower副本复制完消息才确认消息提交成功。异步复制,消息只要被写入leader副本就认为消息提交成功;

  

猜你喜欢

转载自www.cnblogs.com/virgosnail/p/12571424.html