栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

Kafka专题-3 Kafka核心概念

Kafka专题-3 Kafka核心概念

一个典型的Kafka体系架构包括多个Producer,多个Broker,多个Consumer以及一个Zookeeper集群。
Zookeeper负责Kafka集群元数据的管理、控制器的选举等操作;
Producer负责生产消息发送到Broker;
Broker负责将收到的消息存储到磁盘;
Consumer负责从Broker订阅并消费消息;

Kafka体系结构

Kafka核心概念:topic与partition

Kafka底层实现来说,topic和partition都是逻辑上的概念,topic划分为多个分区分布在多个broker集群上,分区可以有1至多个副本,每个副本对应一个日志文件,每个日志文件对应1至多个日志分段(LogSegment),每个日志分段还可以细分为索引文件、日志存储文件、快照文件;

Broker集群的多分区多副本分布

4分区2副本的Topic在4个broker集群的分布如下:
分区写入策略(生产者端)

上面提到消息发送至Broker集群存在多分区的情况下,Kafka是如何选择哪个分区存储呢?
这里则需要引入分区策略概念,所谓分区策略是决定生产者将消息发送到哪个分区的算法;

Kafka在Producer配置中,partitioner.class 配置项可指定自定义分区算法,需配置全限定类名(需实现Partitioner接口);同时Kafka提供了三种可配置分区算法类
1.默认分区算法(DefaultPartitioner):通过计算消息key的hash值取分区数的模 = 选择的分区号

// hash the keyBytes to choose a partition
return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
    轮询分区算法(RoundRobinPartitioner):通过集群内可用的分区数进行轮询计算选择的分区号
int nextValue = nextValue(topic);
List availablePartitions = cluster.availablePartitionsForTopic(topic);
if (!availablePartitions.isEmpty()) {
    int part = Utils.toPositive(nextValue) % availablePartitions.size();
    return availablePartitions.get(part).partition();
} else {
    // no partitions are available, give a non-available partition
    return Utils.toPositive(nextValue) % numPartitions;
}

3.Sticky分区算法(UniformStickyPartitioner): 沿用上一次选择的topic分区号,若没有则随机。

Integer part = indexCache.get(topic);
if (part == null) {
	return nextPartition(topic, cluster, -1);
}
return part;

分区分配策略(消费者端)

同一个Group组的多个消费者是如何消费一个Topic多个Partition的消息?

Kafka在Consumer配置中,partition.assignment.strategy 配置项可指定某种分区分配策略,Kafka提供了三种分区分配策略
1.RangeAssignor(默认-范围分区)
对消费者进行排序,使用 分区数/消费者数=n,第i个消费者则消费n*i~ n(i+1)的分区编号的分区,平均每个消费者都消费n个分区,剩余的分区都分配至第一个消费者。
2.RoundRobinAssignor(轮询分区)
按照消费者 顺序依次分配分区,在消费组里的消费者订阅Topic相同时,分区数分布最为均匀。
使用轮询分区策略必须满足两个条件:
(1)每个主题的消费者实例具有相同数量的流
(2)每个消费者订阅的主题必须是相同的
3.StickyAssignor(粘滞分区)
目标:分区的分配尽可能的均匀;分区的分配尽可能和上次分配保持相同;
好处:使得分区发生变化时,由于分区的粘性,减少了不必要的分区移动 分区多副本机制

kafka为了提高partition的可靠性而提供了副本的概念(Replica),通过副本机制来实现冗余备份
一主多从:每个分区可以有多个副本,并且在副本集合有1个leader副本,和多个follower副本组成
所有的读写请求都是由leader副本来进行处理。
follower副本会从leader副本同步消息日志

副本同步机制

这里需要说明Kafka副本同步

思考:为什么Kafka的主从模式,不是读写分离模式?
如果Kafka的副本机制提供写操作,那么leader与follower副本就必须实现强一致性同步,并且Kakfa的主从同步是Topic分区层面的逻辑同步,会导致复杂度提高,并且降低Kafka的性能;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/747878.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号