6

Kafka 博文索引

 3 years ago
source link: http://www.cnblogs.com/buttercup/p/14402878.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

博文索引

Kafka 简介

数据是系统的燃料,系统的效率高低很大程度取决于数据流转是否及时:

  • 将数据从生产源头移动到分析处理终端,这个过程完成得越快,组织的反应就越敏捷。
  • 移动工具越是简单易用,花费在数据移动上的精力就越少,开发者就越能专注于核心业务。

VFVNZfI.png!mobile

Kafka 是一款为数据整合而生的基于发布与订阅的消息系统 Messaging System ,方便用户在多系统间实现松散耦合的异步数据传输。

Kafka 为消息提供顺序持久化保存,可按需读取。并通过集群部署与冗余副本保障数据安全并提供性能伸缩能力。

vuqEBzY.gif!mobile

核心概念

  • 消息 message :最基本的数据单元,由字节数组组成。消息可以有一个可选的键 key ,键也是一个字节数组。

  • 主题 topic :消息通过主题进行分类。主题就好比数据库的表,或者文件系统里的文件夹。

  • 分区 partition :一个提交日志,主题可以被分为若干个分区。消息以追加的方式写入分区尾部,然后以先入先出的顺序读取。

  • 偏移 offset :一个不断递增的整数值,在创建消息时指定。同个分区中每个消息的偏移量都是唯一的。

  • 生产者 producer :创建消息并将其发布到一个特定的主题上。

  • 消费者 consumer :订阅主题并按照消息生成的顺序读取消息。

消息分区

Kafka 通过分区来实现 数据冗余可伸缩性 :分区可以分布在不同的服务器上,一个主题可以横跨多个服务器,以此来提供比单个服务器更强大的性能。

RZbuM36.gif!mobile

要注意,由于一个主题一般包含几个分区,因此无法在整个主题范围内保证消息的顺序。生产者在默认情况下,会把消息均衡地分布到主题的所有分区上,而并不关心特定消息会被写到哪个分区。

为了保证消息顺序可控,可以为同类消息指定相同的键,然后生产者会根据键的 hashmod 结果选取分区,从而保证具有相同键的消息总会被写到相同的分区上。

消费者组

每个分区只能被分配给一个消费者,然后消费者会按照消息生成的顺序读取它们。

过程中,消费者会记录已读消息的偏移量,避免重复消费同一条消息。

rqieeyy.gif!mobile

消息系统中常见的通信模型有两种:

  • 消息队列 message queue点对点 point to point 的排他通信,每条消息只会被消费一次。
  • 发布/订阅 pub/sub :类似广播通信,每条消息可能会被消费多次。

VnaY3qa.png!mobile

为了同时支持这两种模式,Kafka 在消费者端引入了 消费者组群 counsumer group 这一逻辑概念:

  • 不同的消费者组群之间彼此互不相关,两者消费到的消息是一致的,此时相当于实现了 发布/订阅 模型。
  • 而同个组群的消费者之间存在互斥关系,每个消费者只能消费部分数据,此时相当于实现了 消息队列 模型。

集群

一个独立的 Kafka 服务器被称为 broker,其主要职责有两个:

  • 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。
  • 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息。

An6R7f.gif!mobile

为保证可用性,broker 以集群的方式部署。每个集群会自动选举出一个 controller 负责管理工作,包括将分区分配给 broker 和监控 broker。

一个分区从属于一个 broker,该 broker 被称为分区的 leader。

如果分区允许多副本 replica ,这些副本会分布在多个 broker 上,此时会发生分区复制 replication

这种复制机制为分区提供了消息冗余,当 leader 失效时分区会被其他 broker 接管,相关的消费者和生产者都会重连新的 leader。

优势

  • 系统解耦:异构系统可以通过 Kafka 进行通信,减少系统之间协调与开发成本。
  • 模型丰富:通过消费者组的概念,一份数据可以同时支持不同的通信模型,同能够满足不同的应用需求
  • 磁盘存储:Kafka 会将消息持久化到磁盘,允许消息积压并保证数据不会丢失,无需担心生产与消费速率不匹配的问题。
  • 横向扩展:Kafka 通过集群与分区的方式实现了横向扩展,并且可以在线对集群进行扩容。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK