参考视频: www.bilibili.com/video/BV1Gp… P21-P23
客户端代码
package org.example.kafka.admin;
import org.apache.kafka.clients.admin.Admin;
import org.apache.kafka.clients.admin.AdminClientConfig;
import org.apache.kafka.clients.admin.NewTopic;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @create : 2024/6/17 10:31
*/
public class AdminTopicTest {
public static void main(String[] args) {
Map<String,Object> configMap = new HashMap<>();
//kafka端口
configMap.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");
//管理员对象
Admin admin = Admin.create(configMap);
String topicName = "test3";
int partitionNumber = 2; //2个分区
short replicaNumber = 2; //2个副本
NewTopic topic1 = new NewTopic(topicName,partitionNumber,replicaNumber);
admin.createTopics(Arrays.asList(topic1));
admin.close();
}
}
Kafka集群准备 90,91,92 3个集群
成功创建主题后,两个partition和replica都会分散到不同的broker中,但是kafka会保证同一个partition的replica不在一个broker中,如下:
Kafka会尽可能保证Leader均分在不同broker中,在源码中此策略带代码体现如下(version 3.6.2):
private static Map<Integer, List<Integer>> assignReplicasToBrokersRackUnaware(int nPartitions,
int replicationFactor,
List<Integer> brokerList,
int fixedStartIndex,
int startPartitionId)
nPartitions 当前分区号 brokerList broker列表,一组int fixedStartIndex 起始副本索引 随机值 startPartitionId 其他副本索引 随机值
通过列表Id+索引 取模,来决定leader所属的broker
总体创建topic流程 kafka+zookeeper
参考视频:
www.bilibili.com/video/BV1Gp… 10:58
1.Client创建topic, 入参:kafka cluster的端号,分区数,副本数,通过socket发送给相应broker
2.此broker收到后,返回给client相应集群元数据(metadata),其中含有集群controller broker的ip
3.Client收到metaData, 发送创建topic请求给controller broker, 此controller收到后,在zookeeper中创建相应节点
4.controller在zookeeper上的监听器感知到topic发生变动,通过分区状态机和副本状态机通知自己与其他broker创建相应partition与replica
至此,创建主题流程结束