Kafka学习(3) - Kafka之Topic创建

本文根据原创整理而来 原创出处
https://blog.csdn.net/u013256816/article/details/78851989

Kafka之Topic创建

kafka的创建有两种方式:
1.如果kafka broker中的config/server.properties配置文件中配置了auto.create.topics.enable参数为true(默认是true),那么当生产者向一个尚未创建的topic发送消息时,会自动创建一个num.partitions(默认值为1)个分区和default.replication.factor(默认值为1)个副本的对应topic。一般不建议将auto.create.topics.enable参数设置为true,因为这个参数会影响topic的管理与维护。
2. 通过kafka提供的kafka-topics.sh脚本来创建,并且我们也建议通过这种方式(或者相关的变种方式)来创建topic。

通过kafka-topics.sh脚本来创建一个名为topic-test1并且副本数为2、分区数为4的topic
创建topic时除了需要zookeeper的地址参数外,还需要指定topic的名称、副本因子replication-factor以及分区个数partitions等必选参数 ,还可以包括disable-rack-aware、config、if-not-exists等可选参数。
如果创建的时候带了if-not-exists参数,那么发现topic冲突的时候可以不做任何处理,如果创建的topic在现有的集群中存在,那么会报出异常:TopicExistsException

bin/kafka-topics.sh --create --zookeeper 192.168.0.2:2181/kafka100 --topic topic-test1 --replication-factor 2 --partitions 4

还会检测topic名称中是否包含有“.”或者“”字符的。因为在Kafka的内部做埋点时会根据topic的名称来命名metrics的名称,并且会将句点号“.”改成下划线””。假设遇到一个topic的名称为“topic.1_2”,还有一个topic的名称为“topic_1.2”,那么最后的metrics的名称都为“topic_1_2”,所以就会发生名称冲突
topic的命名同样不推荐(虽然可以这样做)使用双下划线开头,因为以双下划线开头的topic一般看作是kafka的内部topic,比如consumer_offsets和__transaction_state。topic的名称必须由大小写字母、数字、“.”、“-”、“_”组成,不能为空、不能为“.”、不能为“…”,且长度不能超过249

机架

从0.10.x版本开始,kafka可以支持指定broker的机架信息,如果指定了机架信息则在副本分配时会尽可能地让分区的副本分不到不同的机架上,这样即使某个机架上的broker全部崩溃,也能保证其他机架上的副本可以正常工作。指定机架信息是通过kafka的配置文件config/server.properties中的broker.rack参数来配置的

 broker.rack=RACK1

如果出现部分broker配置了机架信息而另一部分没有配置的话,则会抛出AdminOperationException的异常,如果还想要顺利创建topic的话,此时需加上“–disable-rack-aware”

ZK

无论是带机架信息的策略还是不带机架信息的策略,上层调用方法AdminUtils.assignReplicasToBrokers()最后都是获得一个[Int,Seq[Int]]类型的副本分配列表,其最后作为kafka zookeeper节点/brokers/topics/{topic-name}节点数据
可以直接创建一个zookeeper节点来创建一个topic,如果未开启kafka服务的情况下创建zk节点的话,待kafka启动之后是不会再创建实际副本的(只有watch到当前通知才可以)

可以调用kafka.admin.TopicCommand创建Topic,这种方式和kafka-topics.sh的方式如出一辙,可以用这种方式继承到自动化系统中以创建topic,当然对于topic的删、改、查等都可以通过这种方法来实现

public class CreateTopicDemo {
    public static void main(String[] args) {
        //demo: 创建一个副本数为2,分区数为4的主题:topic-test8
        String[] options = new String[]{
                "--create",
                "--zookeeper","192.168.0.2:2181/kafka100",
                "--replication-factor", "2",
                "--partitions", "4",
                "--topic", "topic-test8"
        };
        kafka.admin.TopicCommand.main(options);
    }
}

合法性验证

一般情况下,Kafka生产环境中的auto.create.topics.enable参数会被修改为false,即自动创建Topic这条路会被堵住。kafka-topics.sh脚本创建的方式一般由运维人员操作,普通用户无权过问。那么KafkaAdminClient就为普通用户提供了一个口子,或者将其集成到公司内部的资源申请、审核系统中更加的方便。普通用户在创建Topic的时候,有可能由于误操作或者其他原因而创建了不符合运维规范的Topic,比如命名不规范,副本因子数太低等,这些都会影响后期的系统运维。如果创建Topic的操作是封装在资源申请、审核系统中的话,那么可以在前端就可以根据规则过滤掉不符合规范的申请操作。然而如果用户就是用了KafkaAdminClient或者类似的工具来创建了一个错误的Topic,我们有什么办法可以做相应的规范处理呢?

在Kafka服务端中提供了这样一个参数:create.topic.policy.class.name,其提供了一个入口用来验证Topic创建的合法性。使用方式是自定义实现org.apache.kafka.server.policy.CreateTopicPolicy接口,比如下面的PolicyDemo,然后在kafka broker中的config/server.properties配置文件中配置参数create.topic.policy.class.name=org.apache.kafka.server.policy.PolicyDemo,然后启动Kafka服务即可。PolicyDemo的代码参考如下,主要实现接口中的configure、close以及validate方法,configure方法会在Kafka服务启动的时候执行,validate方法用来鉴定Topic参数的合法性,其在创建Topic的时候执行,close方法在关闭Kafka服务的时候执行。

public class PolicyDemo implements CreateTopicPolicy{
   public void configure(Map<String, ?> configs) {}
   public void close() throws Exception {}
   public void validate(RequestMetadata requestMetadata)
         throws PolicyViolationException {
      if(requestMetadata.numPartitions()!=null || requestMetadata.replicationFactor()!=null){
         if(requestMetadata.numPartitions()< 5){
            throw new PolicyViolationException("Topic should have at least 5 partitions, received: "
                  + requestMetadata.numPartitions());
         }
         if(requestMetadata.replicationFactor()<= 1){
            throw new PolicyViolationException("Topic should have at least 2 replication factor, recevied: "
                  + requestMetadata.replicationFactor());
         }}}}

监控

jmx_port:broker的JMX监控端口。需要在启动broker前设置JMX_PORT环境变量。设置JMX端口后各种支持JMX的监控框架(如zabbix)才可以实时获取kafka提供的各种broker端监控指标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值