1.概述

转载:https://honeypps.com/mq/kafka-params-analysis-of-broker-id/

2.Kafka参数broker.id详解

kafka在启动服务之前必须要设定3个参数:broker.id、log.dirs、zookeeper.connect,这里我们就来重点说一下broker.id这个参数。在Kafka集群中,每个broker都有一个唯一的id值用来区分彼此。Kafka在启动时会在zookeeper中/brokers/ids路径下创建一个与当前broker的id为名称的虚节点,Kafka的健康状态检查就依赖于此节点。当broker下线时,该虚节点会自动删除,其他broker或者客户端通过判断/brokers/ids路径下是否有此broker的id来确定该broker的健康状态。

可以通过配置文件config/server.properties里的broker.id参数来配置broker的id值,默认情况下broker.id值为-1。Kafka broker的id值必须大于等于0时才有可能正常启动,但是这里并不是只能通过配置文件config/server.properties来修改这个值,还可以通过meta.properties文件或者自动生成功能来实现broker的id值的设置。

首先来了解一下meta.properties文件。meta.properties文件中的内容参考如下:

#
#Sun May 27 23:03:04 CST 2018
version=0
broker.id=1

meta.properties文件中记录了与当前Kafka版本对应的一个version字段,不过目前只有一个固定值0。还有一个broker.id即为当前Kafka broker的id值。Kafka成功启动之后在每个根目录下都会有一个meta.properties文件。

Kafka服务启动时也会加载配置文件config/server.properties里的参数log.dir和log.dirs,这两个参数用来配置Kafka日志文件所存放的根目录。一般情况下,log.dir用来配置单个根目录,log.dirs用来配置多个根目录,但是Kafka并没有对此做强制性限制,也就是说log.dir和log.dirs都可以用来配置单个或者多个根目录。log.dirs的优先级比log.dir高,如果没有配置log.dirs则才以log.dir配置的为准。默认情况下只配置了log.dir参数,其值为/tmp/kafka-logs。

meta.properties文件与broker.id的关联如下:

  1. 如果log.dir或log.dirs中配置了多个根目录,那么这些根目录中的meta.properties文件所配置的broker.id不一致的话则会报出InconsistentBrokerIdException的异常。
  2. 如果config/server.properties配置文件里配置的broker.id的值和meta.properties文件里的broker.id的值不一致的话,同样会报出InconsistentBrokerIdException的异常。
  3. 如果config/server.properties配置文件中并未配置broker.id的值,那么就以meta.properties文件中的broker.id为准。
    如果没有meta.properties文件,那么在获取到合适的broker.id值之后会创建一个新的meta.properties文件并将broker.id的值存入其中。
  4. 如果config/server.properties配置文件中并未配置broker.id,并且根目录中也没有任何meta.properties文件(比如服务第一次启动时),那么应该作何处理呢?

对于Kafka中还提供了另外两个参数broker.id.generation.enable和reserved.broker.max.id来配合生成新的broker.id。broker.id.generation.enable参数是用来配置是否开启自动生成broker.id的功能,默认情况下为true,即开启此功能。自动生成的broker.id是有一个基准值的,即自动生成的broker.id必须超过这个基准值,这个基准值通过reserved.broker.max.id参数配置,默认值为1000,也就是说默认情况下自动生成的broker.id从1001开始。

自动生成broker.id的原理是先往/brokers/seqid节点中写入一个空字符串,然后获取返回的Stat信息中的version的值,然后将version的值和reserved.broker.max.id参数配置的值相加可得。之所以是先往节点中写入数据再获取Stat信息,这样可以确保返回的version值大于0,进而就可以确保生成的broker.id值大于reserved.broker.max.id参数配置的值,符合非自动生成的broker.id的值在[0, reserved.broker.max.id]区间的设定。

初始化时/kafka/brokers/seqid的状态如下:

[zk: xxx.xxx.xxx.xxx:2181(CONNECTED) 6] get /kafka/brokers/seqid
null
cZxid = 0x200001b2b
ctime = Mon Nov 13 17:39:54 CST 2017
mZxid = 0x200001b2b
mtime = Mon Nov 13 17:39:54 CST 2017
pZxid = 0x200001b2b
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0

可以看到dataVersion=0,这个就是前面所说的version。在插入一个空字符串之后,dataVersion就自增1,表示数据发生了变更,这样通过zookeeper的这个功能来实现集群层面的序号递增的功能,整体上相当于一个发号器。

[zk: xxx.xxx.xxx.xxx:2181(CONNECTED) 7] set /kafka/brokers/seqid ""
cZxid = 0x200001b2b
ctime = Mon Nov 13 17:39:54 CST 2017
mZxid = 0x2000e6eb2
mtime = Mon May 28 18:19:03 CST 2018
pZxid = 0x200001b2b
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 0

大多数情况下我们一般都是通过并且习惯于用最普通的config/server.properties配置文件的方式来设定broker.id的值,但是如果知晓其中的细枝末节的话,在遇到诸如InconsistentBrokerIdException异常时可以处理的游刃有余,也可以通过自动生成broker.id的功能来实现一些另类的功能。

重要参考

https://issues.apache.org/jira/browse/KAFKA-4093

https://cwiki.apache.org/confluence/display/KAFKA/KIP-78%3A+Cluster+Id

https://cwiki.apache.org/confluence/display/KAFKA/KIP-238:+Expose+Kafka+cluster+ID+in+Connect+REST+API

https://blog.csdn.net/u013256816/article/details/80546337

【Kafka】Kafka broker id 解释以及 自动生成id相关推荐

  1. oracle 插入表数据时,自动生成ID

    今天因为某些原因,需要把达梦数据库(oracle)里面的一张视图的大量数据某些字段插到另外一张表里面,但是又因为这张视图没有ID,插入表ID又不能为null,这时候就可以在插入的时候自动生成ID,记录 ...

  2. Oracle自动生成ID,自动编号,自增补零填充

    问题 在pl/sql中,需将某个查询结果插入到一个新表tableNameA中时,如何通过sql自动生成ID列,且形如:ID0001,ID0002,ID0003--. 解决方案 insert into ...

  3. hive sql自动生成id的两种方法随机id和自增id

    文章目录 1.生成自增id:row number() over(order by) 2.随机不重复id: regexp_replace(reflect('java.util.UUID','random ...

  4. MybatisPlus插入时设置的自动生成ID、时间等为空

    发生场景 通过map接收前端传入的对象数据,在map中装入了一个key对应了一个list集合.通过获取list,强转为指定类的List<自定义类>集合,然后使用mybatisplus的插入 ...

  5. mysql自动生成id方式_Mysql全局ID生成方法

    本文给大家介绍mysql全局id生成方法,涉及到mysql全局id相关知识,感兴趣的朋友一起学习吧 生产系统随着业务增长总会经历一个业务量由小变大的过程,可扩展性是考量数据库系统高可用性的一个重要指标 ...

  6. android 自动生成id,《转载》生成Android设备的唯一ID

    1.最简单的方式:获取IMEI号 TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVIC ...

  7. ES批量索引写入时的ID自动生成算法

    对bulk request的处理流程: 1.遍历所有的request,对其做一些加工,主要包括:获取routing(如果mapping里有的话).指定的timestamp(如果没有带timestamp ...

  8. 分布式文档系统-document id的手动指定与自动生成两种方式解析(来自学习笔记:龙果学院ES课程)

    1.手动指定document id (1)根据应用情况来说,是否满足手动指定document id的前提: 一般来说,是从某些其他的系统中,导入一些数据到es时,会采取这种方式,就是使用系统中已有数据 ...

  9. 15.分布式文档系统-document id的手动指定与自动生成两种方式解析

    课程大纲 1.手动指定document id 2.自动生成document id ----------------------------------------------------------- ...

最新文章

  1. 薏米红豆粥的功效和实践演示
  2. 使用JNA,让java调用原生代码
  3. maven netty 配置_SpringBoot整合Netty(附源码)
  4. figma设计_设计原型的最简单方法:Figma速成课程
  5. Java学习笔记--导航
  6. 【报告分享】2021年中国人工智能与教育融合应用报告.pdf(附下载链接)
  7. 剪枝综述论文阅读:Methods for Pruning Deep Neural Networks
  8. 士林变频器面板如何调速度_工业电气设计|变频器在应用中的故障处理实例分享...
  9. Redis常用管理脚本
  10. python裁剪图片并保存_Python PIL:如何保存裁剪后的图像?
  11. Flash Player10一个非常牛的功能SaveBitmap
  12. Maven的核心概念(五分钟快速掌握)
  13. Java知多少(51)finally
  14. 病毒库的备份及***隐藏地址
  15. java工商银行项目_工商银行聚合支付,java开发实现
  16. html5 做屏幕保护效果,电脑屏保制作软件如何制作屏保 及如何设置屏幕保护
  17. 仿网易云音乐网站(加入个人社区)
  18. c语言大学教程答案pdf,C++大学教程(第九版) 保罗·戴特尔(Paul Deitel)等著 完整中文pdf扫描版[197MB]...
  19. 理解偏差(Bias)和方差(Variance)
  20. flink-cdc 同步mysql数据到ES时间格式问题。

热门文章

  1. 新年首发成功!SpaceX“猎鹰9号”火箭发射升空
  2. 消息称苹果正开发基于自研ARM芯片的游戏主机
  3. 趁618买iPhone 11还是等iPhone 12?李楠有话要说
  4. 迪士尼前高管凯文·梅耶尔加盟字节跳动,出任COO
  5. 硬核数据研究:年轻人为什么这么喜欢“哈哈哈哈”?
  6. 三星Galaxy A70s现身GeekBench数据库:搭载6400万像素传感器
  7. 宁德时代811电芯初现真容 搭配宝马X1混动汽车能量密度提升近6成
  8. B站陈睿:70 后也正在爱上哔哩哔哩
  9. 新能源汽车累计补贴审核情况出炉:比亚迪、吉利两家独大
  10. 工信部:不得利用“携号转网”实施恶性竞争行为