kafka 是 apache 基金会治理的开源流解决平台 (官网 http://kafka.apache.org/),但国内大多数人对其认知根本都是 音讯队列 ,所以咱们先来理解下什么是 音讯队列。
音讯队列
音讯队列顾名思义就是存储音讯的一个队列,音讯 生产者 (producer) 往音讯队列中投放音讯, 消费者 (consumer) 读取音讯队列中的内容。在音讯队列中的每条音讯都会有个地位,就好比数组中的下标(index),在 kafka 中咱们称之为 offset。对于生产者而言,有个非凡的 offset——LEO(log end offset),指向的是音讯队列中下一个将被寄存音讯的地位。
这里重点说下 消费者 (consumer),一个音讯队列当然能够被多个消费者(consumer) 读取,每个消费者 (consumer) 都有惟一一个 group-id 将其辨别开来。kafka 也会记录下来每个消费者 (consumer) 曾经读到哪个地位了(offset)。
问:为什么消费者生产的 offset 是由 kafka 记录,而不是由消费者本人记录?
主题(Topic)
上文咱们以一份数据为例,讲了什么是音讯队列。如果有多份数据(多个队列)该怎么办?也很简略,kafka 中咱们能够应用不同的 主题 (Topic) 将不同的数据辨别开。不同的生产者 (producer) 能够往不同的 Topic 中存放数据,不同的消费者 (consumer) 也能够从不同的 Topic 中读取数据。
分区(Partation)
当一份数据十分大的状况下怎么办?当然是思考 拆分 了。在 kafka 中,你能够设置将一个主题 (Topic) 拆分成多个不同的分区 (Partation),而后以分区(Partation) 的维度来治理、生产和生产数据。拆分带来最显著的益处就是晋升 吞吐性能 ,多个分区(Partation) 之间并行,互不烦扰。
至于怎么拆分,kafka 有提供几个默认分区策略 轮询、随机、hash,当然你能够本人实现本人的分区策略,这里就不过多开展了。
消费者组(Consumer-group)
主题 (Topic) 做完分区当前,消费者如何生产?这里就不得不提到消费者组 (Consumer-group) 的概念,在 kafka 中,为了保证数据的一致性,同一个分区 (Partation) 同时只能被一个消费者 (consumer) 实例生产 ,为了晋升消费者(consumer) 的吞吐量,个别都会设置多个消费者 (consumer) 实例来生产不同的分区(Partation),这些实例独特组成一个消费者组(Consumer-group),他们共用一个 Group-id。
留神:
- 因为同一个分区 (Partation) 同时只能被一个消费者 (consumer) 实例生产,所以超过分区 (Partation) 数量的消费者 (consumer) 实例个数没有任何意义,多余的消费者 (consumer) 实例也会被闲置。
- 如果消费者组 (Consumer-group) 中有实例发生变化(高低线),或者分区(Partation) 数量发生变化,都会触发消费者组rebalence。
正本(Replication)
kafka 如何解决数据高可用的问题?在分布式环境下,要想保证数据尽可能不失落,惟一的办法就是 多复制几份放到不同的机器上,复制进去的数据就叫做正本(Replication)。
这里有几个关键词。
HW: high-water,一个非凡的 offset,只有在这个 offset 以下的音讯能力被消费者 (consumer) 读到,高水位的具体值取决于主从正本数据同步的状态,这里不再开展。
ISR: in-sync-replica,处于同步状态的正本汇合,是指正本数据和主正本数据相差在肯定返回(工夫范畴或数量范畴)之内的正本,当然主正本必定是始终在 ISR 中的。当主正本挂了之后,新的主正本将从 ISR 中被选出来接替它的工作。
OSR: 和 IRS 绝对应 out-sync-replica,其实就是指那些不在 ISR 中的正本。
正本主从同步
当一份数据比复制出多份正本后,必定得波及到主从正本的同步在,从正本会定期从主正本拉去最新的数据。另外须要留神 kafka 中,只有主正本才会对外提供读和写(高版本 kafka 从正本提供了无限的读性能),从正本的惟一作用就是给主正本当备胎。
说到主从同步,顺带提一下 kafka 的 ack 设置。
kafka 中生产者 (producer),能够通过request.required.acks 参数来设置数据可靠性的级别:
- 0: 生产者(producer) 不期待来自主正本的确认,收回去即认为发送胜利,这种状况效率最高但可能有失落数据的危险。
- 1:(默认)生产者(producer) 收回数据后会期待主正本确认收到后,才认为音讯发送胜利,这种状况下主正本宕机时可能会失落音讯。
- -1: (或者是 all):生产者(producer) 期待 ISR 中的所有正本都确认接管到数据后才工作音讯发送胜利,可靠性最高,但因为须要等从正本拉去和确认,效率最低。
Broker
Kafka 是以正本 (Replica) 维度治理数据的,治理这些数据必定是须要管理者的,这个管理者就是 Broker。Broker 会将同一份数据的不同正本(Replication) 调度到不同的机器上,并且在正本(Replication) 数有余时生成新的正本,从而保障在局部 Broker 宕机后也能保证数据不失落。
所有的 Broker 之间也会做一些元数据的互相同步,比方某份主数据在谁哪,从正本要从谁哪去拉取数据……
结语
第一次尝试手绘风解说 kafka 入门常识,讲的很浅显,的确很多细节都没有开展,见谅。