前面在说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就创建好了。
参考:
网友评论