<cite id="fzn17"></cite>
<var id="fzn17"></var><cite id="fzn17"><video id="fzn17"></video></cite>
<cite id="fzn17"></cite>
<var id="fzn17"></var>
<menuitem id="fzn17"><span id="fzn17"><thead id="fzn17"></thead></span></menuitem>
<cite id="fzn17"><span id="fzn17"><var id="fzn17"></var></span></cite><var id="fzn17"><span id="fzn17"><var id="fzn17"></var></span></var>
<var id="fzn17"></var>
<menuitem id="fzn17"></menuitem>
<cite id="fzn17"><video id="fzn17"></video></cite>
|
|
51CTO旗下网站
|
|
移动端

1.1 基本概念

《深入理解Kafka:核心设计与实践原理》本书主要阐述了Kafka中生产者客户端、消费者客户端、主题与分区、日志存储、原理解析、监控管理、应用扩展及流式计算等内容。本节为大家介绍基本概念。

作者:朱忠华来源:电子工业出版社|2019-01-20 13:30

第1章 初识Kafka

Kafka 起初是由LinkedIn 公司采用Scala 语言开发的一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,?#24544;?#34987;捐献给Apache 基金会。目前Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、?#27801;志?#21270;、可水平扩展、支持流数据处理等多种特性而被广泛使用。

目前越来越多的开源分布式处理系统如Cloudera、Storm、Spark、Flink 等都支持与Kafka 集成。Kafka 之所以受到越来越多的青睐,与它所“扮演”的三大角色是分不开的:

消息系统:Kafka 和传统的消息系统(也称作消息中间件)都具备系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性等功能。与此同时,Kafka 还提供了大多数消息系统难以实现的消息顺序性保障及回溯消费的功能。

存储系统:Kafka 把消息?#24535;?#21270;到磁盘,相比于其他基于内存存储的系统而言,有效地降低了数据丢失的风险。也正是得益于Kafka 的消息?#24535;?#21270;功能和多副本机制,我们可以把Kafka 作为长期的数据存储系统来使用,只需要把对应的数据保留策略设置为“永久”或启用主题的日志压缩功能即可。

流式处理平台:Kafka 不仅为每个流行的流式处理框架提供了可靠的数据来源,还提供了一个完整的流式处理类库,比如窗口、连接、变换和聚合等各类操作。

1.1 基本概念

一个典型的Kafka 体?#23548;?#26500;包括若干Producer、若干Broker、若干Consumer,以及一个ZooKeeper 集群,如图1-1 所示。其中ZooKeeper 是Kafka 用来负责集群元数据的管理、控制器的选举等操作的。Producer 将消息发送到Broker,Broker 负责将收到的消息存储到磁盘中,而Consumer 负责从Broker 订阅并消费消息。

整个Kafka 体系结构中引入了以下3 个术语。

(1)Producer:生产者,也就是发送消息的一方。生产者负责创建消息,?#32531;?#23558;其投递到Kafka 中。

(2)Consumer:消费者,也就是接收消息的一方。消费者连接到Kafka 上并接收消息,进而进行相应的业务逻辑处理。

(3)Broker:服务代理节点。对于Kafka 而言,Broker 可以简单地看作一个独立的Kafka服务节点或Kafka 服务实例。大多数情况下?#37096;?#20197;将Broker 看作一台Kafka 服务器,前提是这台服务器?#29616;?#37096;署了一个Kafka 实例。一个或多个Broker 组成了一个Kafka 集群。一般而言,我们更习惯使用首字母小写的broker 来表示服务代理节点。

在Kafka 中还有两个特别重要的概念—主题(Topic)与分区(Partition)。Kafka 中的消息以主题为单位进行归类,生产者负责将消息发送到特定的主题(发送到Kafka 集群中的每一条消息都要指定一个主题),而消费者负责订阅主题并进行消费。

主题是一个逻辑?#31995;?#27010;念,它还可以细分为多个分区,一个分区只属于单个主题,很多时候也会把分区称为主题分区(Topic-Partition)。同一主题下的不同分区包含的消息是不同的,分区在存储层面可以看作一个可追加的日志(Log)文件,消息在被追加到分区日志文件的时候都会分配一个特定的偏移量(offset)。offset 是消息在分区中的唯一标识,Kafka 通过它来保证消息在分区内的顺序性,不过offset 并不跨越分区,也就是说,Kafka 保证的是分区有序而不是主题有序。

如图1-2 所示,主题中有4 个分区,消息被顺序追加到每个分区日志文件的尾部。Kafka中的分区可以分布在不同的服务器(broker)上,也就是说,一个主题可以横跨多个broker,?#28304;?#26469;提供比单个broker 更强大的性能。

每一条消息被发送到broker 之前,会根据分区规则选择存储到哪个具体的分区。如果分区规则设定得合理,所有的消息都可以均匀地分配到不同的分区中。如果一个主题只对应一个文件,那么这个文件所在的机器I/O 将会成为这个主题的性能瓶?#20445;?#32780;分区解决了这个问题。在创建主题的时候可以通过指定的参数来设置分区的个数,?#27604;灰部?#20197;在主题创建完成之后去修改分区的数量,通过增加分区的数量可以实现水平扩展。

Kafka 为分区引入了多副本(Replica)机制,通过增加副本数量可以提升容灾能力。同一分区的不同副本中保存的是相同的消息(在同一时刻,副本之间并非完全一样),副本之间是“一主多从”的关系,其中leader 副本负责处理读写请求,follower 副本只负责与leader 副本的消息同步。副本处于不同的broker 中,当leader 副本出现?#25910;?#26102;,从follower 副本中重新选举新的leader 副本对外提供服务。Kafka 通过多副本机制实现了?#25910;系?#33258;动转移,当Kafka 集群?#24515;?#20010;broker 失效时仍然能保证服务可用。

如图1-3 所示,Kafka 集群中有4 个broker,某个主题中有3 个分区,且副本因子(即副本个数)也为3,如此每个分区便有1 个leader 副本和2 个follower 副本。生产者和消费者只与leader副本进行?#25442;ィ?#32780;follower 副本只负责消息的同步,很多时候follower 副本中的消息相对leader副本而言会有一定的滞后。

Kafka 消费端也具备一定的容灾能力。Consumer 使用拉(Pull)模式从服务端拉取消息,并且保存消费的具体位置,当消费者宕机后恢复上线时可以根据之前保存的消费位置重新拉取需要的消息进行消费,这样就不会造成消息丢失。

分区中的所有副本统称为AR(Assigned Replicas)。所有与leader 副本保?#24544;?#23450;程度同步的副本(包括leader 副本在内)组成ISR(In-Sync Replicas),ISR 集合是AR 集合中的一个子集。消息会先发送到leader 副本,?#32531;骹ollower 副本才能从leader 副本中拉取消息进行同步,同步期间内follower 副本相对于leader 副本而言会有一定程度的滞后。前面所说的“一定程度的同步”是指可忍受的滞后范围,这个范围可以通过参数进?#20449;?#32622;。与leader 副本同步滞后过多的副本(不包括leader 副本)组成OSR(Out-of-Sync Replicas),由此可见,AR=ISR+OSR。在正常情况下,所有的follower 副本都应该与leader 副本保?#24544;?#23450;程度的同步,即AR=ISR,OSR 集合为空。

leader 副本负责维护和跟踪ISR 集合中所有follower 副本的滞后状态,当follower 副本落后太多或失效时,leader 副本会把它从ISR 集合中剔除。如果OSR 集合中有follower 副本“追上”了leader 副本,那么leader 副本会把它从OSR 集?#29486;?#31227;至ISR 集合。默认情况下,当leader 副本发生?#25910;?#26102;,只?#24615;贗SR 集合中的副本才有资格被选举为新的leader,而在OSR 集合中的副本则没有任?#20301;?#20250;(不过这个原则?#37096;?#20197;通过修改相应的参数配置来改变)。

ISR 与HW 和LEO 也有紧密的关系。HW 是High Watermark 的缩写,俗称高水位,它标识了一个特定的消息偏移量(offset),消费者只能拉取到这个offset 之前的消息。

如图1-4 所示,它代表一个日志文件,这个日志文件中有9 条消息,第一条消息的offset(LogStartOffset)为0,最后一条消息的offset 为8,offset 为9 的消息用虚线框表示,代表下一条待写入的消息。日志文件的HW 为6,表示消费者只能拉取到offset 在0 至5 之间的消息,而offset 为6 的消息对消费者而言是不可见的。

LEO 是Log End Offset 的缩写,它标识当前日志文件中下一条待写入消息的offset,图1-4中offset 为9 的位置即为当前日志文件的LEO,LEO 的大小相当于当前日志分区中最后一条消息的offset ?#23548;?。分区ISR 集合中的每个副本都会维护自身的LEO,而ISR 集合中最小的LEO即为分区的HW,对消费者而言只能消费HW 之前的消息。

注意要点:很多资料中误将图1-4 中的offset 为5 的位置看作HW,而把offset 为8 的位置看作LEO,这显然是不对的。

为了让读者更好地理解ISR 集合,以及HW 和LEO 之间的关系,下面通过一个简单的示例来进行相关的?#24471;鰲?#22914;图1-5 所示,假设某个分区的ISR 集合中有3 个副本,即一个leader副本和2 个follower 副本,此时分区的LEO 和HW 都为3。消息3 和消息4 从生产者发出之后会被先存入leader 副本,如图1-6 所示。

在消息写入leader 副本之后,follower 副本会发送拉取请求来拉取消息3 和消息4 以进行消息同步。

在同步过程中,不同的follower 副本的同步效率也不尽相同。如图1-7 所示,在某一时刻follower1 完全跟上了leader 副本而follower2 只同步了消息3,如此leader 副本的LEO 为5,follower1 的LEO 为5,follower2 的LEO 为4,那么当前分区的HW 取最小值4,此时消费者可以消费到offset 为0 至3 之间的消息。

写入消息(情形4)如图1-8 所示,所有的副本都成功写入了消息3 和消息4,整个分区的HW 和LEO 都变为5,因此消费者可以消费到offset 为4 的消息了。

由此可见,Kafka 的复制机制既不是完全的同步复制,也不是单纯的异步复制。事实上,同步复制要求所?#24515;?#24037;作的follower 副本都复制完,这条消息才会被确认为已成功提交,这种复制方式极大地影响了性能。而在异步复制方式下,follower 副本异步地从leader 副本中复制数据,数据只要被leader 副本写入就被认为已经成功提交。在这?#26234;?#20917;下,如果follower 副本都还没有复制完而落后于leader 副本,突然leader 副本宕机,则会造成数据丢失。Kafka 使用的这种ISR 的方式则有效地权衡了数据可靠性和性能之间的关系。


?#19981;?#30340;朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你?#19981;?/dt>

订阅专栏+更多

活学活用 Ubuntu Server

活学活用 Ubuntu Server

实战直通车
共35章 | UbuntuServer

216人订?#38590;?#20064;

Java EE速成指南

Java EE速成指南

掌握Java核心
共30章 | 51CTO王波

83人订?#38590;?#20064;

Mysql DBA修炼之路

Mysql DBA修炼之路

MySQL入门到高阶
共24章 | 武凤涛

468人订?#38590;?#20064;

澳洲幸运5官方
<cite id="fzn17"></cite>
<var id="fzn17"></var><cite id="fzn17"><video id="fzn17"></video></cite>
<cite id="fzn17"></cite>
<var id="fzn17"></var>
<menuitem id="fzn17"><span id="fzn17"><thead id="fzn17"></thead></span></menuitem>
<cite id="fzn17"><span id="fzn17"><var id="fzn17"></var></span></cite><var id="fzn17"><span id="fzn17"><var id="fzn17"></var></span></var>
<var id="fzn17"></var>
<menuitem id="fzn17"></menuitem>
<cite id="fzn17"><video id="fzn17"></video></cite>
<cite id="fzn17"></cite>
<var id="fzn17"></var><cite id="fzn17"><video id="fzn17"></video></cite>
<cite id="fzn17"></cite>
<var id="fzn17"></var>
<menuitem id="fzn17"><span id="fzn17"><thead id="fzn17"></thead></span></menuitem>
<cite id="fzn17"><span id="fzn17"><var id="fzn17"></var></span></cite><var id="fzn17"><span id="fzn17"><var id="fzn17"></var></span></var>
<var id="fzn17"></var>
<menuitem id="fzn17"></menuitem>
<cite id="fzn17"><video id="fzn17"></video></cite>
莱加内斯对阵皇马历史交锋 莱斯特城夺冠主力阵容 海南飞鱼开奖直播 水果拉霸怎么玩 勒沃库森10号 诺亚方舟游戏 类似招财鞭炮的游戏 上海上港和上海东亚 福建11选5开奖结果 浙江福彩3d走势图