到底什么是Kafka架构设计的任督二脉

发布时间:2021-09-17 15:00:49 作者:柒染
来源:亿速云 阅读:201

今天就跟大家聊聊有关到底什么是Kafka架构设计的任督二脉,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

到底什么是 Kafka 架构设计的任督二脉?

把握住了这个关键点,我相信你将能更好地理解 Kafka 的架构设计,进而顺藤摸瓜地掌握 Kafka 的核心技术方案。

1. Kafka 的技术难点究竟在哪?

前一篇文章《扒开 Kafka 的神秘面纱》 交代了两个关键信息:

到底什么是Kafka架构设计的任督二脉

最终 Kafka 将自己退化成了一个「存储系统」。因此,海量消息的存储问题就是 Kafka 架构设计中的最大技术难点。

2. Kafka 架构设计的任督二脉

下面我们再接着分析下:Kafka 究竟是如何解决存储问题的?

面对海量数据,单机的存储容量和读写性能肯定有限,大家很容易想到一种存储方案:对数据进行分片存储。这种方案在我们实际工作中也非常常见:

类似的拆分思想在 HDFS、ElasticSearch 等中间件中都能看到。

Kafka 也不例外,它同样采用了这种水平拆分方案。在 Kafka 的术语中,拆分后的数据子集叫做  Partition(分区),各个分区的数据合集即全量数据。

我们再来看下 Kafka 中的 Partition 具体是如何工作的?举一个很形象的例子,如果我们把「Kafka」类比成「高速公路」:

这样,一条消息的流转路径就如下图所示,先走主题路由,然后走分区路由,最终决定这条消息该发往哪个分区。

到底什么是Kafka架构设计的任督二脉

其中分区路由可以简单理解成一个 Hash  函数,生产者在发送消息时,完全可以自定义这个函数来决定分区规则。如果分区规则设定合理,所有消息将均匀地分配到不同的分区中。

通过这样两层关系,最终在 Topic 之下,就有了一个新的划分单位:Partition。先通过 Topic 对消息进行逻辑分类,然后通过  Partition 进一步做物理分片,最终多个 Partition 又会均匀地分布在集群中的每台机器上,从而很好地解决了存储的扩展性问题。

因此,Partition 是 Kafka 最基本的部署单元。本文之所以将 Partition 称作 Kafka  架构设计的任督二脉,基于下面两点原因:

因此,以 Partition 作为根,能很自然地联想出 Kafka 架构设计中的各个知识点,形成可靠的知识体系。

下面,请大家继续跟着我的思路,以 Partition 为线索,对 Kafka 的宏观架构进行解析。

3. Kafka的宏观架构设计

接下来,我们再看看 Partition 的分布式能力究竟是如何实现的?它又是怎么和 Kafka 的整体架构关联起来的?

前面讲过 Partition 是 Topic 之下的一个划分单位,它是 Kafka 最基本的部署单元,它将决定 Kafka 集群的组织方式。

假设现在有两个 Topic,每个 Topic 都设置了两个 Partition,如果 Kafka 集群是两台机器,部署架构将会是下面这样:

到底什么是Kafka架构设计的任督二脉

可以看到:同一个 Topic 的两个 Partition 分布在不同的消息服务器上,能做到消息的分布式存储了。但是对于 Kafka  这个高并发系统来说,仅存储可扩展还不够,消息的拉取也必须并行才行,否则会遇到极大的性能瓶颈。

那我们再看看消费端,它又是如何跟 Partition 结合并做到并行处理的?

从消费者来看,首先要满足两个基本诉求:

1、广播消费能力:同一个 Topic 可以被多个消费者订阅,一条消息能够被消费多次。

2、集群消费能力:当消费者本身也是集群时,每一条消息只能分发给集群中的一个消费者进行处理。

为了满足这两点要求,Kafka 引出了消费组的概念,每个消费者都有一个对应的消费组,组间进行广播消费,组内进行集群消费。此外,Kafka 还限定了:每个  Partition 只能由消费组中的一个消费者进行消费。

最终的消费关系如下图所示:假设主题 A 共有 4 个分区,消费组 2 只有两个消费者,最终这两个消费组将平分整个负载,各自消费两个分区的消息。

到底什么是Kafka架构设计的任督二脉

如果要加快消息的处理速度,该如何做呢?也很简单,向消费组 2 中增加新的消费者即可,Kafka 将以 Partition 为单位重新做负载均衡。当增加到  4 个消费者时,每个消费者仅需处理 1 个 Partition,处理速度将提升两倍。

到这里,存储可扩展、消息并行处理这两个难题都解决了。但是高并发架构设计上,还遗留了一个很重要的问题:那就是高可用设计。

在 Kafka 集群中,每台机器都存储了一些 Partition,一旦某台机器宕机,上面的数据不就丢失了吗?

此时,你一定会想到对消息进行持久化存储,但是持久化只能解决一部分问题,它只能确保机器重启后,历史数据不丢失。但在机器恢复之前,这部分数据将一直无法访问。这对于高并发系统来说,是无法忍受的。

所以 Kafka 必须具备故障转移能力才行,当某台机器宕机后仍然能保证服务可用。

如果大家去分析任何一个高可靠的分布式系统,比如 ElasticSearch、Redis Cluster,其实它们都有一套多副本的冗余机制。

没错,Kafka 正是通过 Partition 的多副本机制解决了高可用问题。在 Kafka 集群中,每个 Partition  都有多个副本,同一分区的不同副本中保存的是相同的消息。

副本之间是 “一主多从” 的关系,其中 leader 副本负责读写请求,follower 副本只负责和 leader 副本同步消息,当 leader  副本发生故障时,它才有机会被选举成新的 leader 副本并对外提供服务,否则一直是待命状态。

现在,我假设 Kafka 集群中有 4 台服务器,主题 A 和主题 B 都有两个 Partition,且每个 Partition  各有两个副本,那最终的多副本架构将如下图所示:

到底什么是Kafka架构设计的任督二脉

很显然,这个集群中任何一台机器宕机,都不会影响 Kafka 的可用性,数据仍然是完整的。

理解了上面这些内容,最后我们再反过来看下 Kafka 的整体架构:

到底什么是Kafka架构设计的任督二脉

很显然,在 Kafka 整体架构中,Partition 是发送消息、存储消息、消费消息的纽带。吃透了它,再去理解整体架构,脉络会更加清晰。

以 Partition 为切入点,从宏观角度解析了 Kafka 的整体架构,再简单总结:

看完上述内容,你们对到底什么是Kafka架构设计的任督二脉有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

推荐阅读:
  1. 什么是Kafka?
  2. Kafka笔记整理(二):Kafka Java API使用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

kafka

上一篇:FireFox对XML处理兼容IE节点的示例分析

下一篇:xml中JAXP解析的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》