如果我手动在zk中添加`/brokers/topics/{TopicName}`节点会怎么样?
先说结论: 根据上面分析过的源码画出的时序图可以指定; 客户端发起创建Topic的请求,本质上是去zk里面写两个数据
- topic的配置信息
/config/topics/Topic名称
持久节点 - topic的分区信息
/brokers/topics/Topic名称
持久节点 所以我们绕过这一步骤直接去写入数据,可以达到一样的效果;不过我们的数据需要保证准确 因为在这一步已经没有了一些基本的校验了; 假如这一步我们写入的副本Brokerid不存在会怎样,从时序图中可以看到,leaderAndIsrRequest请求
; 就不会正确的发送的不存在的BrokerId上,那么那台机器就不会创建Log文件;
下面不妨让我们来验证一下;
创建一个节点/brokers/topics/create_topic_byhand_zk
节点数据为下面数据;
{"version":2,"partitions":{"2":[3],"1":[3],"0":[3]},"adding_replicas":{},"removing_replicas":{}}
这里我用的工具PRETTYZOO
手动创建的,你也可以用命令行创建;
创建完成之后我们再看看本地有没有生成一个Log文件
可以看到我们指定的Broker,已经生成了对应的分区副本Log文件; 而且zk中也写入了其他的数据
在我们写入zk数据的时候,就已经确定好了哪个每个分区的Leader是谁了,那就是第一个副本默认为Leader