Kafka系列1:Kafka概况

2020-02-04  本文已影响0人  Dali王

Kafka是当前分布式系统中最流行的消息中间件之一,凭借着其高吞吐量的设计,在日志收集系统和消息系统的应用场景中深得开发者喜爱。
本篇就聊聊Kafka相关的一些知识点。主要包括以下内容:

Kafka简介

Kafka特点

Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
相比于其他的消息队列中间件,Kafka的主要设计目标,也即其特点如下:

  1. 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
  2. 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
  3. 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
  4. 同时支持离线数据处理和实时数据处理。
  5. Scale out:支持在线水平扩展

Kafka基本概念

Broker

Kafka是当前分布式系统中最流行的消息中间件之一,凭借着其高吞吐量的设计,在日志收集系统和消息系统的应用场景中深得开发者喜爱。
本篇就聊聊Kafka相关的一些知识点。主要包括以下内容:

Kafka简介

Kafka特点

Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
相比于其他的消息队列中间件,Kafka的主要设计目标,也即其特点如下:

  1. 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
  2. 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
  3. 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
  4. 同时支持离线数据处理和实时数据处理。
  5. Scale out:支持在线水平扩展

Kafka基本概念

Broker

Topic

Partition

Producer

Consumer

Consumer Group

Leader

Follower

Kafka架构

Kafka一般以集群方式来部署,一个典型的Kafka集群架构如下图所示:
[图片上传失败...(image-7c5767-1580829260873)]

Kafka的几个核心概念

分区Partition

分区的几个特点

复制

复制原理
Kafka利用zookeeper来维护集群成员的信息,每个Broker实例都会被设置一个唯一的标识符,Broker在启动时会通过创建临时节点的方式把自己的唯一标识注册到zookeeper中,Kafka中的其他组件会监视Zookeeper里的/broker/ids路径,所以当集群中有Broker加入或退出时,其他组件就会收到通知。
集群间数据的复制机制,在Kafka中是通过Zookeeper提供的leader选举方式实现数据复制方案。
基本原理是:首先选举出一个leader,其他副本作为Follower,所有的写操作都先发给leader,然后再由leader把消息发给Follower。
复制功能是Kafka架构的核心之一,因为它可以在个别节点不可用时还能保证Kafka整体的可用性。
Kafka中的复制操作也是针对分区的。一个分区有多个副本,副本被保存在Broker上,每个Broker都可以保存上千个属于不同Topic和分区的副本。
副本有两种类型:

消息发送方式

从生产者的角度来看,消息发送到Broker有三种方式:

消息发送确认

消息发送到Broker后怎么算投递成功呢,Kafka有三种确认模式:

消息重发机制

当从Broker接收到的是临时可恢复的异常时,生产者会向Broker重发消息,重发次数的限制值由初始化生产者对象的retries属性决定,在默认情况下生产者会在重试后等待100ms,可以通过retry.backoff.ms属性进行修改。

批次发送

当有多条消息要被发送到同一个分区时,生产者会把它们放到同一个批次里,Kafka通过批次的概念来提高吞吐量,但同时也会增加延迟。
对批次的控制主要通过构建生产者对象时的两个属性来实现:

消费者组

消费者组是Kafka提供的可扩展且具有容错性的消费机制,在一个消费者组内可以有多个消费者,它们共享一个唯一标识,即分组ID。组内的所有消费者协调消费它们订阅的主题下的所有分区的消息,但一个分区只能由同一个消费者组里的一个消费者来消费。

广播和单播

一个Topic可以有多个消费者组,Topic的消息会被复制到所有的消费者组中,但每个消费者组只会把消息发送给一个消费者组里的某一个消费者。
如果要实现广播,只需为每个消费者都分配一个单独的消费者组接口
如果要实现单播,则需要把所有的消费者都设置在同一个消费者组里

再均衡

消费者组里有新消费者加入或者有消费者离开,分区所有权会从一个消费者转移到另一个消费者
再均衡协议规定了一个消费者组下的所有消费者如何达成一致来分配主题下的每个分区
触发再均衡的场景有三种:

消费偏移量

Kafka中有一个叫作_consumer_offset特殊主题用来保存消息在每个分区的偏移量,消费者每次消费时都会往这个主题中发送消息,消息包含每个分区的偏移量。
如果消费者一直处于运行状态,偏移量没什么作用;如果消费者崩溃或者有新的消费者加入消费者组从而触发再均衡操作,再均衡之后该分区的消费者若不是之前的那个,提交偏移量就有用了。
维护消息偏移量对于避免消息被重复消费和遗漏消费,确保消息的ExactlyOnce至关重要,以下是不同的提交偏移量的方式:

Kafka的工程应用

Kafka主要用于三种场景:

基于Kafka的用户行为数据采集

要获取必要的数据进行用户行为等的分析,需要这样几个步骤:

基于Kafka的日志收集

各个应用系统在输出日志时利用高吞吐量的Kafka作为数据缓冲平台,将日志统一输出到Kafka,再通过Kafka以统一接口服务的方式开放给各种消费者。
做统一日志平台的方案,收集重要系统的日志集中到Kafka中,然后再导入ElasticSearch、HDFS、Storm等具体日志数据的消费者中,用于进行实时搜索分析、离线统计、数据备份、大数据分析等。

基于Kafka的流量削峰

为了让系统在大流量场景下仍然可用,可以在系统中的重点业务环节加入消息队列作为消息流的缓冲,从而避免短时间内产生的高流量带来的压垮整个应用的问题。

关注我的公众号,获取更多关于面试、技术的文章及福利资源。

kafka架构图.jpg
上一篇下一篇

猜你喜欢

热点阅读