Kafka简介及其集群特性

Apache Kafka™ is a distributed streaming platform.

这是官方的介绍.

Kafka由于其效率,易扩展性,高容错性,被广泛运用.以下我们粗略了解Kafka,进而探讨其集群的一些基本特性,包括高容错的实现.除了能了解Kafka外,还能将其思路运用到别处.

1. 术语解释

为了便于理解这些术语,每段开头都会有总结性的一句话(黑体),这个解释是不精确的,但是有助于快速了解Kafka.

1.1. Broker

Kafka服务器,就是Broker.

BrokerKafka cluster(集群)中的一类节点.它提供了Kafka对外的各种API,其中就包括Producer APIConsumer API,Broker可以向存储结构中写入或者读取数据.

1.2. Topic

消息资源的分类就是Topic.

作为一个分布式流管理服务器,Kafka必须区分各种各样的消息资源,Kafka以自定义类别的方式来区分.一种类别,就被叫做一个Topic.

1.3. Partition

Topic拆解成若干独立的部分就是Partition.

假设在Kafka设计的时候要求只有一个进程可以访问一个Topic(假设是为了避免竞争条件出现).那么首要的问题就是效率不可能高,因为存在浪费,阻塞其他进程访问消息资源.

解决方法就是Partition,将一个Topic分成若干个区域,一个进程访问一个分区,这样就实现了在Topic上的并发.

1.4. Producer

生产者-消费者模型中的生产者.用于产生数据.

Producer是一个抽象概念,其是由BrokerProducer API实现的.用于向整个Kafka集群提供数据.

1.5. Consumer

生产者-消费者模型中的消费者.用于消耗或使用数据.

Consumer也是一个抽象概念,由BrokerConsumer API实现.用于获取消息资源.

值得注意,Kafka集群的存储元数据是有Zookeeper提供的.由Broker负责与Zookeeper进行交互.

2. Kafka集群

2.1. 集群结构

consumer-groups.png

(图片来自http://kafka.apache.org)

  1. P0-P3是指四个Partition
  2. C1-C6是指六个Consumer
  3. 箭头是指Partition分发给Consumer

2.2. 规则

  1. 每个Partition都会被唯一一个Broker接管,这个Broker被叫做PartitionLeader.一个Broker可以作为0个或多个PartitionLeader.
  2. 其他Broker作为这个PartitionFollower,只能通过Leader操作Partition.
  3. Broker之间是跨服务器实现Partition共享的.也就是说每个Broker可以操作到所有的Partition.
  4. 每个Partition通过参数--replication-factor N,会备份N个副本.
  5. Consumer API会将所有Partition广播给每个Consumer Group(Kafka的Consumer会有一个Group标签,相同Group标签的Consumer属于同一Consumer Group).每个Consumer Group内的Consumer将会负载均衡的分配到零个或多个Partition.

3. Kafka集群高容错性和高可扩展性实现

Kafka作为一个分布式流数据服务集群,必须解决的问题之一就是高容错.也就是说集群中的服务器宕机,不会对当前业务产生影响.

高可扩展性可以让Kafka更容易使用,尤其是在需要为Kafka集群增加服务器的场景中.

3.1. Broker间实现高容错性和高可扩展性

由2.2.节中第4.条可知,Partition会被备份到一个或多个Zookeeper(Kafka的存储支持)中.这样就保证了数据的安全.

当有一个Broker宕机后,它作为LeaderPartition立即随机分配给该Partition的一个Follwer,作为新的Leader,以此保证Partition的正常读写.

当有新的Broker加入集群时,直接作为所有PartitionFollower即可.

3.2. Consumer间实现高容错和高可扩展性

如果有个Consumer宕机,或进程终止.它负责消费的Partition会分配给同一Consumer Group的其他Consumer.

当有新的Consumer加入集群,这个Consumer Group中的Partition会按照负载均衡的理念重新分配.

这一切行为,没有特殊的调度程序去协调,是每个Consumer实体的基本功能.

发表新评论