十五个点,理解Apache Kafka
副标题[/!--empirenews.page--]
一、介绍 Kafka在世界享有盛名,大部分互联网公司都在使用它,那么它到底是什么呢? Kafka由LinkedIn公司于2011年推出,自那时起功能逐步迭代,目前演变成一个完整的平台级产品,它允许您冗余地存储巨大的数据量,拥有一个具有巨大吞吐量(数百万/秒)的消息总线,并且支持实时流任务处理。总的来说,Kafka是一个分布式,可水平扩展,容错的日志提交系统 这些描述都非常抽象,让我们一个接一个地理解它们的意思,随后深入探讨其工作原理。 二、分布式 分布式系统意味着不同机器上的服务实例一起工作成一个整体为用户提供完整的服务,Kafka的分布式体现在存储、接收信息、发送信息在不同的节点上,它带来的好处是可扩展性和容错性。 三、水平可扩展 我们先给垂直可扩展下一个定义,比如说,你的传统数据库服务开始变得超负载,可以通过简单地扩充该服务器资源(CPURAMSSD)缓存这个问题,这就叫垂直扩展-单点增加资源,不过有两大致命的缺点:底层硬件资源有限、需要停机操作。反之,水平扩展通过增加更多的机器部署服务解决类似问题。 四、容错 分布式系统被设计成可容许一定程序的错误,不像单点部署发生异常时整体服务都将不可用,有五个节点的Kafka实例,即使有2个节点宕机了仍能继续工作。 五、commit日志 一个commit日记类似预写式日记(WAL)和事务日记,它是可追加的有序的持久化数据,无法进行修改或者删除。 ![]() 这种结构是Kafka的核心,它具备排序功能,而排序则可以保证确定性的处理,这两者都是分布式系统中的重要问题。 Kafka通常会将消息持久化到磁盘上,它充分利用磁盘的有序读取特性,读写的时间复杂度都为O(1),这是相当了不起的,另外读取和写入操作不会相互影响,写入不会加锁阻塞读取操作。 六、如何工作的 生产者发到消息至Kafka Node节点,存储在主题Topic中,消费者订阅主题以接收消息,这是一个生产订阅模式。为了使一个节点Topic的数据量不至过大,Kafka引入分区的概念,从而具备更好的性能和伸缩性。Kafka保证分区内的所有消息都按照到达顺序排序,区分消息的方式是通过其偏移量offset,你可以将其理解为普通数组的下标索引。 ![]() Kafka中Broker服务节点是愚蠢的,消费者是聪明的,Kafka不会记录消费者读取的操作和删除消息,相反,数据被存储一段时间或者达到一定的大小阈值,消费者可以自由调整偏移量offset以重复获取他们想要的消息或者舍弃。 值得注意的是为了避免进程两次读取相同的消息,Kafka引入了消费者组的概念,其中包含一个或者多个消息者实例,约定每个组只能同时有一个实例消费分区的消息。不过这引来了一个麻烦,连社区也无力解决,也就是Kafka中的重平衡Rebalance问题,它本质是一种协议,规定一个消费者组下的所有消费者实例如何达成一致,来分配订阅主题的每个分区,当组成员数发生变更、订阅主题数发生变更、订阅主题的分区数发生变更时都会触发Rebalance,从而达到最公平的分配策略,不过他和GC的STW类似,在Rebalance期间,所有的消费者实例都会停止消费,然后重新分配连接。我们应该尽量避免这种情况的发生,尽量让消费实例数等于分区数。 ![]() 七、持久化至磁盘 正如前面提及的,Kafk将消息存储至磁盘而不是内存RAM,你或许会惊讶它是如何做出这种选择的,背后应该有许多优化使其可行,没错,事实上优化点包括:
八、数据分布式和复制 我们来谈谈Kafka如何实现容错以及如何在节点间分配数据。 Kafka将分区数据拷贝复制到多个Brokers节点上,避免某个Broker死亡导致数据不可达。每时每刻,一个Broker节点”拥有”一个分区,并且是应用程序从该分区读取写入的节点,这称为分区leader,它将收到的数据复制到其他N个Broker节点上,它们称为follower,并准备好在leader节点死亡时被选举为leader。这种模式使得消息不易丢失,你可以根据消息的重要程序合理调整replication factor参数,下图是4个Broker节点,拥有3个复制副本的示例: ![]() 你或许会有疑问,生产者或者消费者是如何正确得知分区的leader是哪个节点的?事实上,Kafka将这些信息保存到Zookeeper服务中。 九、Zookeeper服务 Zookeeper是一个分布式KV对目录存储系统,特点是可靠性高、读取性能高,但是写入性能差,常被用于存储元数据和保存集群状态,包括心跳、配置等等。 Kafka将以下消息保存至Zookeeper中:
![]() 十、Controller控制器 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |