持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
前言
本文会讲解kafka以下知识
- kafka在实际生产环境中的应用。
- kafka的架构与组成和重要的基本概念:生产者producer,消费者consumer,kafka节点broker,主题topic,分区partition的相关概念以及。
- kafka顺序性与水平扩展的简单介绍。
- kafka分区的多副本同步机制与数据可靠性的简单介绍。
Kafka的应用
首先我们介绍下kafka的应用,也就是kafka在实际生产环境中扮演的角色:
- 消息系统:与传统的消息中间件类似,kafka具备系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性的功能。并且kafka还提供了大多数传统消息系统那一实现的消息顺序性保障以及回溯消费的功能。
- 存储系统:kafka把消息持久化到磁盘,相比于其他基于内存存储的系统(如redis),有效的降低了数据丢失的风险,且由于kafka具备多副本机制,可用于长期的数据存储系统来使用(需要kafka将数据保留测策略设置成永久或启动主题topci的日志压缩功能)。
- 流式处理平台:kafka为很多流行的流式处理框架提供了可靠的数据来源,还提供了一个完整的流式处理类库。
kafka的架构与组成
如上图,一般来说kafka分为以下几个部分:
- 生产者producer:消息生产投递到kafka的一方。
- 消费者consumer:连接kafka,接受消息消费进行业务逻辑处理的一方。
- kafkaf服务代理节点broker:broker为kafka一个独立的服务节点,如果某台实例只部署一个broker,也可以简单理解为1个kafka实例,1个或多个broker节点组成了kafka集群。
- zookeeper集群:主要是负责kafka的元素据管理以及控制器的选举等操作。
除了上面这些基本组成概念外,kafka还有两个特别重要的概念:主题topic与分区partition。kafka中的消息都是以主题为单位进行归类的,生产者在发送消息时都必须要指定消息发送到哪个主题topic,而消费者则是以主题topic为单位进行订阅消费。
topic与kafka消息的顺序性、水平扩展
主题topic是一个逻辑上的概念,它分为多个分区,每个分区只属于某个特定的主题,很多时候分区被称为主题分区topic-partition。同一个主题下的不同分区的消息是不同的,分区在存储层面可以理解位一个可追加的日志文件,消息在被追加到分区文件的时候会分配一个分区的偏移量offset,offset是消息在该分区中的唯一标识,kafka通过offset可保证消息在分区的顺序性,但是offset并不跨越分区,所以kafka保证的是分区有序而不是主题有序。一个topic的partition可以分布在不同的服务器broker上,即topic是跨越多个broker的,相比单个broker可提供更强大的性能。
每条消息发送到brokers时,会根据分区规则选择存储到具体的哪个partition,如果分区规则合理,所有的消息可以均匀分布到不同的分区中,想象下如果1个topic只对应1个分区,那么消息会集中在1个分区,那么该分区所在的机器的I/O将成为系统瓶颈,而kafka通过将topic消息分配到多个分区,使得可以通过增加分区的数量实现水平扩展。
partition的多副本机制
为了提升容灾能力,kafka位partition引入了多副本(Replica)机制。同一个partition下的不同副本保存的是相同的消息(但在统一时刻,副本之间的消息可能有差异),分为一主多从的副本关系,leader主副本负责处理读写请求,而其他follower副本只负责与leader主副本进行消息同步,副本处于不同的broker中,当leader副本出现故障时,会从follow副本中从新选举出新的leader主副本提供服务,多副本机制实现了故障的自动转移,保证了kafka某个broker失效时服务仍然可用。
多副本机制的相关概念
多副本机制有以下几个概念需要理解:
- AR(Assigner Replicas):表示kafka中的所有副本。
- ISR(In-Sync Replicas):表示与leader副本保持一定程度同步的副本(也包括leader副本),ISR为AR的一个子集。
- OSR(Out-of-Sync Replicas):表示与leader副本同步滞后过多的副本(不包括leader副本),其也为AR的一个子集。 三者之间存在此关系:AR=ISR+OSR.由leader副本维护跟踪ISR或OSR中所有follower副本的之后状态,通过follower副本与leader副本的同步程度,将其归类为ISR或AR。默认情况下,只有ISR的follower副本在leader副本失效后可以被选为新的leader副本(此规则可以通过配置参数改变)。
Kafka的副本同步复制机制与数据可靠性
Kafka的消费端也具备一定的容灾能力。consumer使用Pull模式从服务端拉取消息,并且会保存消费的具体位置,当消费组宕机后恢复上线时可以根据之前保存的消费位置重新拉取需要的消息进行消费,避免造成消费消息缺失。下面我们来了解下kafka如何在多副本机制下保证数据可靠性。 首先介绍两个概念:
- HW(High Watermark):高水位,指的是一个特定的消息偏移量,消费者只能拉取到这个offset之前的消息。
- LEO(LogEndOffset):代表下一条待写入的消息的偏移量。比如当前已经写入的最后一条消息offset为5,则下一条待写入的消息即LEO=6.
Kafka通过ISR与HW和LEO来保证数据可靠性,ISR中每个分区副本都会维护自身的下一条待写入的消息的偏移量LEO,其中最小的LEO即为分区的HW(此时的分区HW可代表为ISR中的相同消息数据集合),对于消费者而言,Kafka只允许消费HW之前的消息。 因此在副本同步的过程中,消费者始终可以消费到分区的HW前的数据,举个例子,假设分区的ISR集合中有1个副本leader与两个副本follower1与follower2,初始时都有3条消息(offset为0,1,2),三者状态为:
leader:HW=3,LEO=3
follower1:HW=3,LEO=3
follower2:HW=3,LEO=3
此时分区的HW为min(LEO)=3,消费者只能消费0-2的数据,此时写入了2条新消息(3与4),leader状态变为:HW=3,LEO=5。follower之间的同步效率是不尽相同的,若假设follower1同步了2条数据,follower2同步了1条数据,此时三者状态为:
leader:HW=3,LEO=5
follower1:HW=3,LEO=5
follower2:HW=3,LEO=4
此时分区的HW为min(LEO)=4,消费者可以消费到0-3的数据。当follower2副本完成消息4的同步后,ISR中所有副本同步为与leader一致,HW变为5,此时消费者可以消费到0-4的所有数据。
通过以上过程可见,kafka的复制机制既不是完全的同步复制机制也不是单纯的异步复制,同步一般要求所有副本follower都完成数据同步后,写入leader的新消息才会被认为提交成功,由于要等待所有follower完成复制,显而易见性能会比较差。而异步复制一般认为写入leader后就被认为提交成功,但此时如果主节点宕机,而follower都还没来得及同步新写入的数据导致数据落后于leader副本,此时会造成数据丢失。而kafka通过ISR中HW与LEO的机制,使得在数据同步复制过程中仍可以持续消费数据至最新的分区HW位置,有效的权衡了数据可靠性与性能之间的关系。
总结
本文简单介绍了kafka的体系结构组成以及各部分职责和相关重要概念主题topic与分区partition,并介绍了kafka的作用并对其重要特点进行了简单的描述,如分区的多副本机制与kafka消息的顺序性、水平扩展、多副本同步复制机制和可靠性的,相信对kafka的整体架构与特点有了简单的认识,在下一篇文章中,我们将学习kafka消息的生产者cosnumer.