Kakfa基础入门 Topic创建与机制探索

43 阅读1分钟

参考视频: 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个集群

46e4cb6a417487236c664d5bcd0549f.png

成功创建主题后,两个partition和replica都会分散到不同的broker中,但是kafka会保证同一个partition的replica不在一个broker中,如下:

0bb99385ebbdcbbd7ba036e7c2a90d2.png

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 567195807a8cccdf8c8665f5b43fe6e.png

b67912e49658e0bf8f611514fb3f168.png

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

至此,创建主题流程结束