阅读 169

中间件系列之Kafka-1-基本概念

Kafka 是由 Linkedin公司开发的,一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系统

消息与批量提交

Kafak的内部数据单元成为消息,类似与数据库的一条记录。对于Kafka而言,消息只是一个字节数组,每个消息都有一个可选的元数据(metadata),称为键值(key)。当消息被写到分区(partition)时,消息的键值可以控制这个分派的过程,例如哈希。

对于每个消息来说,花费在网络往返传输的时间上比较多,为了提高效率,消息以批量提交的方式来写入Kafka。这些批量的消息都拥有相同的主题(topic)和分区(partition)。当然,也不是无脑大批量的进行提交,必须要考虑吞吐(throughput)和延迟(latency)的权衡,批量提交的消息越多,单位时间可以处理的消息也就越多,但每个消息的延迟就越大。另外,批量提交的消息是经过压缩的,因此传输和存储更高效,但代价是处理要花费更多的时间。

主题与分区

在Kafka中,消息以主题(topic)来分类,主题的概念类似于数据库的表。主题可以分成多个分区(partition),一个分区对应于一个单独的日志。消息不断追加到日志的末尾,在读取时从头到尾按序读取。一个主题通常有几个分区,分区内部有序,但分区相互之间不保证顺序。

分区可以分布在不同的机器上,这也就意味着一个主题可以水平扩展到多个机器,以提供冗余度和横向扩展性。

生产者和消费者

生产者,创建消息,通常来说不关心消息被写入到哪个分区,在默认情况下Kafka会将消息均衡分配到所有的分区。但在某些情况下我们可能希望控制消息的分配,这可以通过消息键值和分配器(partitioner)来完成,分配器会对键值进行哈希并将消息分配到特定分区,这保证了拥有相同键值的消息会被分配到相同的分区。

消费者,读取消息,通常订阅一个或多个主题。在读取时,消费者记录当前已经读取的消息位移(offset)。位移是一个持续增长的整数值,分区内部的每个消息具有唯一的位移值。通过记录每个分区的已读取消息的位移,消费者可以停止或者重启而不丢失消费位置。

消费者以消费组(consumer group)来工作,消费组包含一个或多个消费者,它们一起协作来消费同一个主题的消息。消费组保证主题内一个分区只被消费组内的一个消费者来消费。下面是关于consumer的两条原则:

  • 假如所有消费者都在同一个消费者组中,那么它们将协同消费订阅Topic的部分消息(根据分区与消费者的数量分配),保存负载平衡;
  • 假如所有消费者都在不同的消费者组中,并且订阅了同个Topic,那么它们将可以消费Topic的所有消息;

如下例所示,分区0和分区3分别被消费者0和消费者2消费,而分区1和2则被消费1消费。

broker和集群

一个独立的Kafka服务器即称为broker。broker接收生产者的消息并赋予其位移值,然后写入到磁盘;broker同时服务消费者拉取分区消息的请求,返回目前已经提交的消息。

若干个broker组成一个集群(cluster),其中集群内某个broker会成为集群控制器(cluster controller),它负责管理集群,包括分配分区到broker、监控broker故障等。在集群内,一个分区由一个broker负责,这个broker也称为这个分区的leader;当然一个分区可以被复制到多个broker上来实现冗余,这样当存在broker故障时可以将其分区重新分配到其他broker来负责。

而随着业务的进一步发展,我们往往需要多个集群,来达成例如基于数据的隔离,基于安全的隔离,多数据中心(容灾)等目的。Kafka利用MirrorMaker来实现这个功能,用户只需简单的进行相应配置即可。

MirrorMaker是Kafka内置的一个用于集群间做数据镜像的简单工具。它的核心是一个包含若干个消费者的消费组,该消费组从指定的主题中读取数据,然后使用生产者把这些消息推送到另一个集群。每个消费者负责一部分主题和分区,而生产者则只需要一个,被这些消费者共享;每隔60秒消费者会通知生产者发送消息数据,然后等待另一个集群的Kafka接收写入这些数据;最后这些消费者提交已写入消息的位移。MirrorMaker保证数据不丢失,而且在发生故障时不超过60秒的数据重复。内部架构如下所示:

分布式

在开篇就提到,Kafka是一个分布式的消息系统,所以当我们配置了多个Kafka Server节点后,它就拥有分布式的能力,比如容错等。partition会被分布在各个Server节点上,同时它们中间又有一个leader,它会处理所有的读写请求,其他followers会复制leader上的数据信息,一旦当leader因为某些故障而无法提供服务后,就会有一个follower被推举出来成为新的leader来处理这些请求。

另外,kafka作为一个高水准的系统,提供了以下的保证:

  • 消息的添加是有序的,生产者越早向订阅的Topic发送的消息,会更早的被添加到Topic中,当然它们可能被分配到不同的分区;
  • 消费者在消费Topic分区中的消息时是有序的;
  • 对于有N个复制节点的Topic,系统可以最多容忍N-1个节点发生故障,而不丢失任何提交给该Topic的消息丢失;

综上,一个完整的Kafka架构一般如下所示

img

文章分类
后端
文章标签