kafka笔记(二)Admin Client API

kafka核心Api

1、五类kafka客户端作用区别

Kafka客户端操作

Kafka客户端API类型

  • Admin Client API:允许管理和检测topic、broker以及其他kafka对象
  • Producer API:发布消息到1个或多个topic
  • Consumer API:订阅一个或多个topic,并处理产生的消息
  • Streams API:高效地将输入流转换到输出流
  • Connector API:从一些源系统或应用程序中拉取数据到kafka

Admin Client API

API作用
Admin ClientAdminClient客户端对象
NewTopic创建Topic
CreateTopic Result创建Topic的返回结果
List Topic Result查询topic列表
List Topic Options查询Topic列表及选项
DescribeTopicResult查询Topics
DescribeConfigsResult查询Topics配置项

topic增删查

package com.zmx.kafkatest.admin;
import org.apache.kafka.clients.admin.*;
import org.apache.kafka.common.KafkaFuture;
import java.util.*;

public class AdminSample {

    public final static String TOPIC_NAME = "test_444";

    public static void main(String[] args) throws Exception {
//        AdminClient adminClient = AdminSample.adminClient();
//        System.out.println("adminClient : " + adminClient);

        //创建topic实例
//        createTopic();

        //删除topic
//        delTopic();

        //查看topic
        listTopic();
    }

    /**
     * 删除topic
     */
    public static void delTopic() throws Exception {
        AdminClient adminClient = adminClient();
        DeleteTopicsResult deleteTopicsResult = adminClient.deleteTopics(Arrays.asList(TOPIC_NAME));
        System.out.println("deleteTopicsResult = " + deleteTopicsResult.all().get());;

    }

    /**
     * 查看topic列表
     * @throws Exception
     */
    public static void listTopic() throws Exception {
        AdminClient adminClient = adminClient();

        //是否查看internal选项
        ListTopicsOptions options = new ListTopicsOptions();
        options.listInternal(true);
        ListTopicsResult listTopicsResult = adminClient.listTopics(options);

        //查看topic名字
        Set<String> topicNames = listTopicsResult.names().get();
        topicNames.stream().forEach(System.out::println);

        //打印listings()
        Collection<TopicListing> topicListings = listTopicsResult.listings().get();
        topicListings.stream().forEach((topicListing) -> {
            System.out.println("topic_name:" + topicListing.name());
        });

        //打印namesToListings()
        KafkaFuture<Map<String, TopicListing>> mapKafkaFuture = listTopicsResult.namesToListings();
        for (Map.Entry<String, TopicListing> entries : mapKafkaFuture.get().entrySet()) {
            System.out.println("mapTopicName = (" + entries.getKey() + ")----mapTopicValue=" + entries.getValue());
        }
    }


    /*
    创建topic实例
     */
    public static void createTopic() {
        AdminClient adminClient = adminClient();

        //副本因子
        Short rs = 1;
        NewTopic newTopic = new NewTopic(TOPIC_NAME, 1, rs);
        CreateTopicsResult topics = adminClient.createTopics(Arrays.asList(newTopic));
        System.out.println("topics = " + topics);

    }

    /*
     * 设置AdminClient
     */
    public static AdminClient adminClient() {
        Properties properties = new Properties();
        properties.setProperty(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.136.131:9092");
        AdminClient adminClient = AdminClient.create(properties);
        return adminClient;
    }
}

Topic描述信息查看

package com.zmx.kafkatest.admin;
import org.apache.kafka.clients.admin.*;
import org.apache.kafka.common.config.ConfigResource;
import java.util.Arrays;
import java.util.Map;
import java.util.Properties;

public class DescribeAdminSample {
    public final static String TOPIC_NAME = "test_333";
    public final static String IpNum = "192.168.136.131:9092";

    public static void main(String[] args) throws Exception {
//        describeTopic();
        descConf();
    }

    /**
     * topic配置信息
     */
    public static void descConf() throws Exception {
        AdminClient adminClient = adminClient();

        //TODO 这里做一个预留,集群时会讲到
//        ConfigResource configResource=new ConfigResource(ConfigResource.Type.BROKER, TOPIC_NAME);

        ConfigResource configResource = new ConfigResource(ConfigResource.Type.TOPIC, TOPIC_NAME);
        DescribeConfigsResult describeConfigsResult = adminClient.describeConfigs(Arrays.asList(configResource));
        Map<ConfigResource, Config> configResourceConfigMap = describeConfigsResult.all().get();
        configResourceConfigMap.entrySet().stream().forEach((entry) -> {
            System.out.println("ConfigResource = " + entry.getKey() + ",Config =" + entry.getValue());
        });
        /*显示结果
        ConfigResource =
          ConfigResource(
            type=TOPIC,
            name='test_333'),
          Config =
            Config(
              entries=[
                ConfigEntry(
                  name=compression.type,
                  value=producer,
                  source=DEFAULT_CONFIG,
                  isSensitive=false,
                  isReadOnly=false,
                  synonyms=[]), ConfigEntry(name=leader.replication.throttled.replicas, value=, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=message.downconversion.enable, value=true, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=min.insync.replicas, value=1, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=segment.jitter.ms, value=0, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=cleanup.policy, value=delete, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=flush.ms, value=9223372036854775807, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=follower.replication.throttled.replicas, value=, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=segment.bytes, value=1073741824, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=retention.ms, value=604800000, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=flush.messages, value=9223372036854775807, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=message.format.version, value=3.0-IV1, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=file.delete.delay.ms, value=60000, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=max.compaction.lag.ms, value=9223372036854775807, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=max.message.bytes, value=1048588, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=min.compaction.lag.ms, value=0, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=message.timestamp.type, value=CreateTime, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]),
                ConfigEntry(
                  name=preallocate,
                  value=false, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=min.cleanable.dirty.ratio, value=0.5, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=index.interval.bytes, value=4096, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=unclean.leader.election.enable, value=false, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=retention.bytes, value=-1, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=delete.retention.ms, value=86400000, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=segment.ms, value=604800000, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=message.timestamp.difference.max.ms, value=9223372036854775807, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[]), ConfigEntry(name=segment.index.bytes, value=10485760, source=DEFAULT_CONFIG, isSensitive=false, isReadOnly=false, synonyms=[])])
        * */
    }

    /**
     * 描述Topic describeTopics()
     */
    public static void describeTopic() throws Exception {
        AdminClient adminClient = adminClient();
        DescribeTopicsResult describeTopicsResult = adminClient.describeTopics(Arrays.asList(TOPIC_NAME));
        Map<String, TopicDescription> stringTopicDescriptionMap = describeTopicsResult.all().get();
        stringTopicDescriptionMap.entrySet().stream().forEach((entry) -> {
            System.out.println("name = " + entry.getKey() + ",desc=" + entry.getValue());
        });

        /*显示结果
        name = test_333,
        desc=
            (name=test_333,
            internal=false,
            partitions=
                (partition=0,
                leader=192.168.136.131:9092 (id: 0 rack: null),
                replicas=192.168.136.131:9092 (id: 0 rack: null),
                isr=192.168.136.131:9092 (id: 0 rack: null)),
            authorizedOperations=null)
         */
    }

    public static AdminClient adminClient() {
        Properties properties = new Properties();
        properties.setProperty(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, IpNum);
        AdminClient adminClient = AdminClient.create(properties);
        return adminClient;
    }
}

修改Topic描述信息选项

package com.zmx.kafkatest.admin;
import org.apache.kafka.clients.admin.*;
import org.apache.kafka.common.config.ConfigResource;
import java.util.*;
import java.util.concurrent.ExecutionException;
public class DescConfSet {
    public final static String TOPIC_NAME = "test_333";
    public final static String IpNum = "192.168.136.131:9092";

    public static void main(String[] args) throws Exception {
        newAltDescConfig();
//        oldAltDescConfig();
    }

    /*
     *新版修改方法修改描述信息参数
     * incrementalAlterConfigs(Map<ConfigResource, Collection<AlterConfigOp>> configs)
     * */
    public static void newAltDescConfig() throws Exception {
        AdminClient adminClient = adminClient();

        Map<ConfigResource, Collection<AlterConfigOp>> configMaps = new HashMap<>();

        //组织两个参数 声明一个ConfigResource,用来判断是给什么用的,此处是给topic,名字是java_test用的
        ConfigResource configResource = new ConfigResource(ConfigResource.Type.TOPIC, TOPIC_NAME);
        //更改preallocate选项
        ConfigEntry configEntry = new ConfigEntry("preallocate", "true");
        //设置一个AlterConfigOp对象用来,处理做什么操作,这里使用的SET(或者APPEND)类型的添加操作
        /*
        APPEND :添加ConfigEntry给目标Topic。
        DELETE :删除ConfigEntry给目标Topic。
        SET :设置ConfigEntry给目标Topic。
        SUBTRACT :减少ConfigEntry给目标Topic
        */
        AlterConfigOp alterConfigOp = new AlterConfigOp(configEntry, AlterConfigOp.OpType.SET);
        //添加到Collection中,用于传到incrementalAlterConfigs方法中
        Collection<AlterConfigOp> configOps = new ArrayList<>();
        configOps.add(alterConfigOp);
        configMaps.put(configResource, configOps);
        //调用方法
        AlterConfigsResult alterConfigsResult = adminClient.incrementalAlterConfigs(configMaps);
        System.out.println("修改配置信息:"+alterConfigsResult.all().get());
		//返回结果值:null
    }

    /*
    * 旧版修改配置信息
    * 方法:alterConfigs(Map<ConfigResource, Config> configs)
    * */
    public static void oldAltDescConfig() throws Exception {
        AdminClient adminClient = adminClient();
        Map<ConfigResource,Config> configMaps=new HashMap<>();
        ConfigResource configResource=new ConfigResource(ConfigResource.Type.TOPIC,TOPIC_NAME);
        Config config = new Config(Arrays.asList(new ConfigEntry("preallocate", "false")));
        configMaps.put(configResource,config);
        AlterConfigsResult alterConfigsResult = adminClient.alterConfigs(configMaps);
        System.out.println("修改配置信息:"+alterConfigsResult.all().get());

    }

    public static AdminClient adminClient() {
        Properties properties = new Properties();
        properties.setProperty(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, IpNum);
        AdminClient adminClient = AdminClient.create(properties);
        return adminClient;
    }
}

增加Partition

package com.zmx.kafkatest.admin;
import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.AdminClientConfig;
import org.apache.kafka.clients.admin.CreatePartitionsResult;
import org.apache.kafka.clients.admin.NewPartitions;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/*
 * Partition增加
 * */
public class IncrPartition {
    public final static String TOPIC_NAME = "test_333";
    public final static String IpNum = "192.168.136.131:9092";

    public static void main(String[] args) throws Exception {
        incrPartitions(2);
    }

    /**
     * createPartitions(Map<String, NewPartitions> newPartitions)
     * 添加成功后可以在服务器上kafka-logs目录下看到test_333-0和test_333-1两个
     */
    public static void incrPartitions(int partitions) throws Exception {
        AdminClient adminClient = adminClient();
        //声明方法参数
        Map<String, NewPartitions> partitionsMap = new HashMap<>();
        //增加2个partitions
        NewPartitions newPartitions = NewPartitions.increaseTo(partitions);
        partitionsMap.put(TOPIC_NAME, newPartitions);
        CreatePartitionsResult partitionsResult = adminClient.createPartitions(partitionsMap);
        System.out.println("partitionsResult = " + partitionsResult.all().get());
        //返回值:null
    }

    /*
     * 设置AdminClient
     */
    public static AdminClient adminClient() {
        Properties properties = new Properties();
        properties.setProperty(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, IpNum);
        AdminClient adminClient = AdminClient.create(properties);
        return adminClient;
    }
}

Topic级别配置

与Topic相关的配置既包含服务器默认值,也包含可选的每个Topic覆盖值。 如果没有给出每个Topic的配置,那么服务器默认值就会被使用。 通过提供一个或多个 --config 选项,可以在创建Topic时设置覆盖值。 本示例使用自定义的最大消息大小和刷新率创建了一个名为 my-topic 的topic:
bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic my-topic --partitions 1 \ --replication-factor 1 --config max.message.bytes=64000 --config flush.messages=1

也可以在使用alter configs命令稍后更改或设置覆盖值. 本示例重置my-topic的最大消息的大小:
bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name my-topic --alter --add-config max.message.bytes=128000

您可以执行如下操作来检查topic设置的覆盖值:
bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name my-topic --describe

您可以执行如下操作来删除一个覆盖值:
bin/kafka-configs.sh --bootstrap-server localhost:9092 --entity-type topics --entity-name my-topic --alter --delete-config max.message.bytes

以下是Topic级别配置。 “服务器默认属性”列是该属性的默认配置。 一个Topic如果没有给出一个明确的覆盖值,相应的服务器默认配置将会生效。

名称描述类型默认值有效值服务器默认属性重要性
cleanup.policy此配置指定要在日志段上使用的保留策略。“ delete”策略(这是默认策略)将在达到保留时间或大小限制时丢弃旧段。“compact”策略将启用日志压缩,这将保留每个键的最新值。也可以在逗号分隔的列表中指定这两个策略(例如“ delete,compact”)。在这种情况下,根据保留时间和大小配置,旧的段将被丢弃,而保留的段将被压缩。listdelete[compact, delete]log.cleanup.policymedium
compression.type为给定的topic指定最终压缩类型。这个配置接受标准的压缩编解码器 (‘gzip’, ‘snappy’, lz4) 。它为’uncompressed’时意味着不压缩,当为’producer’时,这意味着保留producer设置的原始压缩编解码器。stringproducer[uncompressed, zstd, lz4, snappy, gzip, producer]compression.typemedium
delete.retention.ms保留 日志压缩 topics的删除墓碑标记的时间。此设置还对consumer从偏移量0开始时必须完成读取的时间进行限制,以确保它们获得最后阶段的有效快照(否则,在完成扫描之前可能会收集到删除墓碑)。long86400000 (1 day)[0,…]log.cleaner.delete.retention.msmedium
file.delete.delay.ms删除文件系统上的一个文件之前所需等待的时间long60000 (1 minute)[0,…]log.segment.delete.delay.msmedium
flush.messages这个设置允许指定一个时间间隔n,每隔n个消息我们会强制把数据fsync到log。例如,如果设置为1,我们会在每条消息之后同步。如果是5,我们会在每五个消息之后进行fsync。一般来说,我们建议您不要设置它,而是通过使用replication机制来持久化数据,和允许更高效的操作系统后台刷新功能。这个设置可以针对每个topic的情况自定义long9223372036854775807[1,…]log.flush.interval.messagesmedium
flush.ms这个设置允许指定一个时间间隔,每隔一段时间我们将强制把数据fsync到log。例如,如果这个设置为1000,我们将在1000 ms后执行fsync。一般来说,我们建议您不要设置它,而是通过使用replication机制来持久化数据,和允许更高效的操作系统后台刷新功能long9223372036854775807[0,…]log.flush.interval.msmedium
follower.replication.throttled.replicas应该在follower侧限制日志复制的副本列表。该列表应以[PartitionId]:[BrokerId],[PartitionId]:[BrokerId]:…的形式描述一组副本,或者也可以使用通配符“*”来限制该topic的所有副本list“”[partitionId]:[brokerId],[partitionId]:[brokerId],…follower.replication.throttled.replicasmedium
index.interval.bytes此设置控制Kafka向其偏移索引添加索引条目的频率。默认设置确保我们大约每4096个字节索引一条消息。更多的索引允许读取更接近日志中的确切位置,但这会使索引更大。您可能不需要改变该值int4096 (4 kibibytes)[0,…]log.index.interval.bytesmedium
leader.replication.throttled.replicas应该在leader侧限制日志复制的副本列表。该列表应以[PartitionId]:[BrokerId],[PartitionId]:[BrokerId]:…的形式描述一组副本,或者也可以使用通配符“*”来限制该topic的所有副本list“”[partitionId]:[brokerId],[partitionId]:[brokerId],…leader.replication.throttled.replicasmedium
max.compaction.lag.ms消息在日志中保持压缩的最长时间。只适用于被压缩的日志long9223372036854775807[1,…]log.cleaner.max.compaction.lag.msmedium
max.message.bytesKafka允许的最大记录批次大小。如果这个参数被增加了且consumers是早于0.10.2版本,那么consumers的fetch size必须增加到该值,以便他们可以取得这么大的记录批次。在最新的消息格式版本中,记录总是分组成多个批次以提高效率。在以前的消息格式版本中,未压缩的记录不会分组到多个批次,并且限制在该情况下只能应用单条记录int1048588[0,…]message.max.bytesmedium
message.format.version指定broker将用于将消息附加到日志的消息格式版本。该值应该是有效的ApiVersion。如:0.8.2,0.9.0.0,0.10.0,查看ApiVersion获取更多细节。通过设置特定的消息格式版本,用户将发现磁盘上的所有现有消息都小于或等于指定的版本。不正确地设置此值将导致旧版本的使用者中断,因为他们将收到他们不理解的格式的消息string3.0-IV1[0.8.0, 0.8.1, 0.8.2, 0.9.0, 0.10.0-IV0, 0.10.0-IV1, 0.10.1-IV0, 0.10.1-IV1, 0.10.1-IV2, 0.10.2-IV0, 0.11.0-IV0, 0.11.0-IV1, 0.11.0-IV2, 1.0-IV0, 1.1-IV0, 2.0-IV0, 2.0-IV1, 2.1-IV0, 2.1-IV1, 2.1-IV2, 2.2-IV0, 2.2-IV1, 2.3-IV0, 2.3-IV1, 2.4-IV0, 2.4-IV1, 2.5-IV0, 2.6-IV0, 2.7-IV0, 2.7-IV1, 2.7-IV2, 2.8-IV0, 2.8-IV1, 3.0-IV0, 3.0-IV1, 3.1-IV0, 3.2-IV0, 3.3-IV0, 3.3-IV1, 3.3-IV2, 3.3-IV3]log.message.format.versionmedium
message.timestamp.difference.max.msbroker接收消息时所允许的时间戳与消息中指定的时间戳之间的最大差异。如果message.timestamp.type=CreateTime,则如果时间戳的差异超过此阈值,则将拒绝消息。如果message.timestamp.type=LogAppendTime,则忽略此配置long9223372036854775807[0,…]log.message.timestamp.difference.max.msmedium
message.timestamp.type定义消息中的时间戳是消息创建时间还是日志附加时间。值应该是“CreateTime”或“LogAppendTime”stringCreateTime[CreateTime, LogAppendTime]log.message.timestamp.typemedium
min.cleanable.dirty.ratio此配置控制日志compaction尝试清理日志的频率(假设启用了日志compaction)。默认情况下,我们将避免清理已压缩超过50% 的日志。这个比率将日志中浪费的最大空间限制为重复(50% 的日志最多可以是重复的)。更高的比率意味着更少、更有效率的清理,但是也意味着更多浪费在日志中的空间。如果同时指定了 max.compaction.lag.msmin.compaction.lag.ms 的配置,那么日志compaction会尽快认为log符合压缩的条件: (i)达到污染比率阈值,并且log至少在 min.compaction.lag.ms 期间有污染(未压缩)记录; 或(ii)如果log记录最多在 max.compaction.lag.ms 期间有污染(未压缩)记录。double0.5[0,…,1]log.cleaner.min.cleanable.ratiomedium
min.compaction.lag.ms消息在日志中保持未压缩的最短时间。仅适用于正在压缩的日志long0[0,…]log.cleaner.min.compaction.lag.msmedium
min.insync.replicas当producer将ack设置为“all”(或“-1”)时,此配置指定必须确认写入才能被认为成功的副本的最小数量。如果这个最小值无法满足,那么producer将引发一个异常(NotEnough Replicas或NotEnough ReplicasAfterAppend)。当使用时,min.insync.Copicasack允许您执行更好的持久化保证。一个典型的场景是创建一个复制因子为3的topic,将min.insync.Copicas设置为2,并生成带有“All”的ack。这将确保如果大多数副本没有接收到写,则producer将引发异常int1[1,…]min.insync.replicasmedium
preallocate如果在创建新的日志段时应该预分配磁盘上的文件,则为 true。booleanfalselog.preallocatemedium
retention.bytes如果使用“delete”保留策略,此配置控制分区(由日志段组成)在放弃旧日志段以释放空间之前的最大大小。默认情况下,没有大小限制,只有时间限制。由于此限制是在分区级别强制执行的,因此,将其乘以分区数,计算出topic保留值,以字节为单位。long-1log.retention.bytesmedium
retention.ms如果使用“delete”保留策略,此配置控制保留日志的最长时间,然后将旧日志段丢弃以释放空间。这代表了用户读取数据的速度的SLA。如果设置为 -1,则不应用时间限制。long604800000 (7 days)[-1,…]log.retention.msmedium
segment.bytes此配置控制日志的段文件大小。保留和清理总是一次完成一个文件,所以更大的段大小意味着更少的文件,但对保留的粒度控制更少。int1073741824 (1 gibibyte)[14,…]log.segment.bytesmedium
segment.index.bytes此配置控制将偏移量映射到文件位置的索引的大小。我们预先分配这个索引文件,并只在日志滚动后缩小它。通常不需要更改此设置。int10485760 (10 mebibytes)[4,…]log.index.size.max.bytesmedium
segment.jitter.ms从预定的分段滚动时间减去最大随机抖动,以避免段滚动产生惊群效应。long0[0,…]log.roll.jitter.msmedium
segment.ms这个配置控制在一段时间后,Kafka将强制日志滚动,即使段文件没有满,以确保保留空间可以删除或合并旧数据。long604800000 (7 days)[1,…]log.roll.msmedium
unclean.leader.election.enable指示是否启用不在ISR集合中的副本选为领导者作为最后的手段,即使这样做可能导致数据丢失。booleanfalseunclean.leader.election.enablemedium
message.downconversion.enable此配置控制是否启用消息格式的下转换以满足使用请求。当设置为 false 时,代理将不会为需要旧消息格式的消费者执行向下转换。代理使用 UNSUPPORTED _ VERION 错误来响应来自这些旧客户机的使用请求。此配置不适用于复制到跟随者可能需要的任何消息格式转换。booleantruelog.message.downconversion.enablelow
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欣子.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值