美文网首页Kafka文字欲
无镜--kafka之TOPIC

无镜--kafka之TOPIC

作者: 绍圣 | 来源:发表于2019-04-10 22:26 被阅读0次

    前面在说kafka生产者的时候,经常会提到topic。这是kafka中核心的概念。说起topic就会涉及到partition,replica,zk。

    简介

    生产者产生的消息,会提交到对应topic对应的partition下,而此partition的leader又处于一个节点(broker)上。为了数据的可靠性,partition会有多个replica(副本),replica会处于不同的节点上,replica同时会同步主副本上的消息。

    topic partition replica的关系


    Topic的创建

    命令创建

    在kafka的安装目录下执行kafka-topics.sh

    ./bin/kafka-topics.sh --create --topic test --zookeeper XXXX --partitions 3 --replication-factor 2

    以上语句创建:topic名称为test,partition为3,replica为2的一个kafka消息队列。

    Producer创建topic

    服务端的配置文件中设置的auto.create.topics.enable为true,Producer向服务器一个不存在的topic发送数据,该topic会被自动创建。

    Partition的replica是如何分配的

    创建时指定replica分配

    ./bin/kafka-topics.sh --create --topic test --zookeeper XXXX --replica-assignment 1:2,3:4,5:6

    test的topic有三个partition,其中partition_0的replica分布在broker1和2上,partition_1的replica分布在broker3和4上,partition_2的replica分布在broker5和6上。

    replica自动分配

    replica分配的原则:

    1,将副本平均分布在所有的broker上。

    2,partition的多个副本分配在不同的broker上。

    3,如果broker是机架信息的话,partition的多个副本应该分配到不同的机架上。

    机架感知:kafka在0.10时引入了机架感知,如果在集群很大的情况下,所有的replica都在同一个机架上,那么一旦此机架出问题,那么所有的replica都将失效(当然这种情况非常少)。现在kafka可以让replica分布到不同的机架上,提高了整个集群的稳定性和可用性。所以如果指定了机架信息,那么kafka在分配replica的时候,就会尽可能的为partition的多个副本分配不同的机架的broker。

    在不考虑机架的情况下,分配原则是:

    1,从broker列表中随机选择一个broker,使用round-robin轮询算法分配每一个partition的第一个副本。

    2,对剩下的partition的副本,采用逐渐增加broker.id来选择出broker来分配给replica

    服务端会将replica分布直接更新到zk上。这样监控此ZK目录变化的方法会被触发:

    1,获取zk的topic变更信息,得到新的topic列表以及被删除的topic列表。

    2,将被删除的topic列表的replicas从kafkaController的缓存中删除,将新增的topic的replicas增加到kafkaController的缓存中。

    3,调用kafkaController的onNewTopicCreation()方法创建partition和replica对象。

    当partition和replica都是上线状态后(这里涉及到partition和replica的状态机变化,后面重点分析kafkaController的时候,来详细分析一下),此topic就创建好了。

    参考:

    Kafka 源码解析之 topic 创建过程(三) | Matt's Blog

    相关文章

      网友评论

        本文标题:无镜--kafka之TOPIC

        本文链接:https://www.haomeiwen.com/subject/fhdcbftx.html