欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

欢迎跳转到本文的原文链接:https://honeypps.com/mq/kafka-params-analysis-of-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为准。
  4. 如果没有meta.properties文件,那么在获取到合适的broker.id值之后会创建一个新的meta.properties文件并将broker.id的值存入其中。

如果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://honeypps.com/mq/kafka-params-analysis-of-broker-id/


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


Kafka参数broker.id详解相关推荐

  1. linux中id命令的功能,Linux id命令参数及用法详解

    Linux id命令参数及用法详解--Linux查看当前登陆用户uid,gid. 命          令:id 功能说明:查看显示目前登陆账户的uid和gid及所属分组及用户名 语 法:id [-g ...

  2. python使用kafka原理详解_Python操作Kafka原理及使用详解

    Python操作Kafka原理及使用详解 一.什么是Kafka Kafka是一个分布式流处理系统,流处理系统使它可以像消息队列一样publish或者subscribe消息,分布式提供了容错性,并发处理 ...

  3. linux如何查看kafka消息队列,kafka以及消息队列详解

    kafka以及消息队列详解 Kafka 是LinkedIn 开发的一个高性能.分布式的消息系统. 用途:广泛用于日志收集.流式数据处理.在线和离线消息分发等场景. 1. Kafka 将消息流按Topi ...

  4. linux mount命令参数及用法详解

    linux mount命令参数及用法详解 非原创,主要来自 http://www.360doc.com/content/13/0608/14/12600778_291501907.shtml. htt ...

  5. linux useradd(adduser)命令参数及用法详解(linux创建新用户命令)

    linux useradd(adduser)命令参数及用法详解(linux创建新用户命令) useradd可用来建立用户帐号.帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号 ...

  6. linux的usermod命令参数,linux usermod命令参数及用法详解

    linuxusermod命令参数及用法详解,linux修改用户账号信息命令,usermod可用来修改用户帐号的各项设定.接下来是小编为大家收集的linux usermod命令参数及用法详解,欢迎大家阅 ...

  7. Kafka卡夫卡详解

    Kafka卡夫卡详解 Kafka设计方式 Topics Producers Consumers 参考:https://www.cnblogs.com/shijiaoyun/p/4860734.html ...

  8. linux 的中断 命令,linux skill命令参数及用法详解(linux中断进程执行命令)

    linux skill命令参数及用法详解(linux中断进程执行命令) 发布时间:2012-07-21 12:09:37   作者:佚名   我要评论 linux 冻结进程命令 skill 使用详解 ...

  9. python中的sep参数_Python sep参数使用方法详解

    Python sep参数使用方法详解 这篇文章主要介绍了Python sep参数使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pyth ...

最新文章

  1. 【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )
  2. [推荐算法]ItemCF,基于物品的协同过滤算法
  3. Apache配置虚拟主机,全部指向一个目录
  4. 对人工智能的应用、发展及其影响的思考
  5. 活动目录网域中禁用移动存储(U盘)
  6. 使用Apache ActiveMQ的JMS开发基础
  7. win11 32位官方版原版镜像文件v2021.07
  8. git ssh key生成
  9. mysql中怎样查看和删除唯一索引
  10. 又是骗补贴的?清华虚拟学生华智冰翻车:AI换脸铸就人工智能
  11. 输出排列 递归、回溯法
  12. 拓端tecdat|R语言对二分连续变量进行逻辑回归数据分析
  13. Java架构师之路:从码农到年薪五十万的架构师
  14. 我常去的编程技术网站[最近更新:2011.07.10
  15. .Net Core Nopi 工具的使用
  16. 建材物资管理系统(软件定义)
  17. TFIDF之python实现
  18. win2008服务器系统玩红警,WIN10 64位系统完美运行红色警戒2教程
  19. 扩展银行项目,添加一个(客户类)Customer类。Customer类将包含一个Account对象。...
  20. 《前端中文入门手册》.pdf

热门文章

  1. Sentinel 源码分析(一)
  2. linux敏感目录文件,Windows系统和Linux系统常见敏感信息路径
  3. 解决GitLab中使用SSH的git clone总是提示输入密码且任何密码都不对
  4. 【报错】ValueError: not enough values to unpack expected 2, got1
  5. 【报错笔记】在eclipse中复制代码后代码中会报画红线错,而且项目也会报错。
  6. 20172304 《程序设计与数据结构》第四周学习总结
  7. 在spring中使用自定义注解注册监听器
  8. 关于App开发:模拟服务器数据接口 - MockApi
  9. 算法笔记_029:约瑟夫斯问题(Java)
  10. AngularJS笔记之创建服务方式比较 : factory vs service vs provider