设为首页 - 加入收藏 黄石站长网 (http://www.0714zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 展示 tomcat
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

十五个点,理解Apache Kafka

发布时间:2019-07-17 13:56 所属栏目:[教程] 来源:Androidrobot
导读:一、介绍 Kafka在世界享有盛名,大部分互联网公司都在使用它,那么它到底是什么呢? Kafka由LinkedIn公司于2011年推出,自那时起功能逐步迭代,目前演变成一个完整的平台级产品,它允许您冗余地存储巨大的数据量,拥有一个具有巨大吞吐量(数百万/秒)的消息

一、介绍

Kafka在世界享有盛名,大部分互联网公司都在使用它,那么它到底是什么呢?

十五个点,理解Apache Kafka

Kafka由LinkedIn公司于2011年推出,自那时起功能逐步迭代,目前演变成一个完整的平台级产品,它允许您冗余地存储巨大的数据量,拥有一个具有巨大吞吐量(数百万/秒)的消息总线,并且支持实时流任务处理。总的来说,Kafka是一个分布式,可水平扩展,容错的日志提交系统

这些描述都非常抽象,让我们一个接一个地理解它们的意思,随后深入探讨其工作原理。

二、分布式

分布式系统意味着不同机器上的服务实例一起工作成一个整体为用户提供完整的服务,Kafka的分布式体现在存储、接收信息、发送信息在不同的节点上,它带来的好处是可扩展性和容错性。

三、水平可扩展

我们先给垂直可扩展下一个定义,比如说,你的传统数据库服务开始变得超负载,可以通过简单地扩充该服务器资源(CPURAMSSD)缓存这个问题,这就叫垂直扩展-单点增加资源,不过有两大致命的缺点:底层硬件资源有限、需要停机操作。反之,水平扩展通过增加更多的机器部署服务解决类似问题。

四、容错

分布式系统被设计成可容许一定程序的错误,不像单点部署发生异常时整体服务都将不可用,有五个节点的Kafka实例,即使有2个节点宕机了仍能继续工作。

五、commit日志

一个commit日记类似预写式日记(WAL)和事务日记,它是可追加的有序的持久化数据,无法进行修改或者删除。

十五个点,理解Apache Kafka

这种结构是Kafka的核心,它具备排序功能,而排序则可以保证确定性的处理,这两者都是分布式系统中的重要问题。

Kafka通常会将消息持久化到磁盘上,它充分利用磁盘的有序读取特性,读写的时间复杂度都为O(1),这是相当了不起的,另外读取和写入操作不会相互影响,写入不会加锁阻塞读取操作。

六、如何工作的

生产者发到消息至Kafka Node节点,存储在主题Topic中,消费者订阅主题以接收消息,这是一个生产订阅模式。为了使一个节点Topic的数据量不至过大,Kafka引入分区的概念,从而具备更好的性能和伸缩性。Kafka保证分区内的所有消息都按照到达顺序排序,区分消息的方式是通过其偏移量offset,你可以将其理解为普通数组的下标索引。

十五个点,理解Apache Kafka

Kafka中Broker服务节点是愚蠢的,消费者是聪明的,Kafka不会记录消费者读取的操作和删除消息,相反,数据被存储一段时间或者达到一定的大小阈值,消费者可以自由调整偏移量offset以重复获取他们想要的消息或者舍弃。

值得注意的是为了避免进程两次读取相同的消息,Kafka引入了消费者组的概念,其中包含一个或者多个消息者实例,约定每个组只能同时有一个实例消费分区的消息。不过这引来了一个麻烦,连社区也无力解决,也就是Kafka中的重平衡Rebalance问题,它本质是一种协议,规定一个消费者组下的所有消费者实例如何达成一致,来分配订阅主题的每个分区,当组成员数发生变更、订阅主题数发生变更、订阅主题的分区数发生变更时都会触发Rebalance,从而达到最公平的分配策略,不过他和GC的STW类似,在Rebalance期间,所有的消费者实例都会停止消费,然后重新分配连接。我们应该尽量避免这种情况的发生,尽量让消费实例数等于分区数。

十五个点,理解Apache Kafka

七、持久化至磁盘

正如前面提及的,Kafk将消息存储至磁盘而不是内存RAM,你或许会惊讶它是如何做出这种选择的,背后应该有许多优化使其可行,没错,事实上优化点包括:

  1. Kafka的通信协议支持消息合并,减少网络流量传输,Broker节点一次持续存储大量数据,消费者可以一次获取大量的消息
  2. 操作系统通过提前读入(read-ahead)和write-behind缓存技术,使得磁盘上的线性读写速度快,现代磁盘速度慢的结论是基于需要磁盘搜索的场景
  3. 现代操作系统引入页面缓存(Page cache)技术,页缓冲由多个磁盘块构造,在linux读写文件时,它用于缓存文件的逻辑内容,从而加块对磁盘映射和数据的访问
  4. Kafka存储消息使用的是不可变的标准二进制格式,可以充分利用零拷贝技术(zero-copy),将数据从页缓存直接复制到socket通道中

八、数据分布式和复制

我们来谈谈Kafka如何实现容错以及如何在节点间分配数据。

Kafka将分区数据拷贝复制到多个Brokers节点上,避免某个Broker死亡导致数据不可达。每时每刻,一个Broker节点”拥有”一个分区,并且是应用程序从该分区读取写入的节点,这称为分区leader,它将收到的数据复制到其他N个Broker节点上,它们称为follower,并准备好在leader节点死亡时被选举为leader。这种模式使得消息不易丢失,你可以根据消息的重要程序合理调整replication factor参数,下图是4个Broker节点,拥有3个复制副本的示例:

十五个点,理解Apache Kafka

你或许会有疑问,生产者或者消费者是如何正确得知分区的leader是哪个节点的?事实上,Kafka将这些信息保存到Zookeeper服务中。

九、Zookeeper服务

Zookeeper是一个分布式KV对目录存储系统,特点是可靠性高、读取性能高,但是写入性能差,常被用于存储元数据和保存集群状态,包括心跳、配置等等。

Kafka将以下消息保存至Zookeeper中:

  1. 消费者组的每个分区的偏移量,不过后来Kafka将其保存至内部主题__consumer_offsets中
  2. 访问权限列表
  3. 生产者和消费者速率限定额度
  4. 分区leader信息和它们的健康状态
十五个点,理解Apache Kafka

十、Controller控制器

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章