浅谈ZooKeeper中Kafka相关信息的存储

ZooKeeper是应用甚为广泛的分布式服务协调组件,它对于大数据领域的其他组件,如HDFS、YARN、HBase、Kafka等等,都扮演着基础角色。本文简单描述一下ZK如何存储与Kafka相关的信息。

在kafka.utils.ZkUtils对象的开头,预先定义了很多ZK路径,列举如下。

  val AdminPath = "/admin"
  val BrokersPath = "/brokers"
  val ClusterPath = "/cluster"
  val ConfigPath = "/config"
  val ControllerPath = "/controller"
  val ControllerEpochPath = "/controller_epoch"
  val IsrChangeNotificationPath = "/isr_change_notification"
  val LogDirEventNotificationPath = "/log_dir_event_notification"
  val KafkaAclPath = "/kafka-acl"
  val KafkaAclChangesPath = "/kafka-acl-changes"

  val ConsumersPath = "/consumers"
  val ClusterIdPath = s"$ClusterPath/id"
  val BrokerIdsPath = s"$BrokersPath/ids"
  val BrokerTopicsPath = s"$BrokersPath/topics"
  val ReassignPartitionsPath = s"$AdminPath/reassign_partitions"
  val DeleteTopicsPath = s"$AdminPath/delete_topics"
  val PreferredReplicaLeaderElectionPath = s"$AdminPath/preferred_replica_election"
  val BrokerSequenceIdPath = s"$BrokersPath/seqid"
  val ConfigChangesPath = s"$ConfigPath/changes"
  val ConfigUsersPath = s"$ConfigPath/users"
  val ProducerIdBlockPath = "/latest_producer_id_block"

我们可以通过ZK命令行或可视化工具来观察这些路径下面的存储情况。为了方便梳理,将一些主要的节点画成树形结构,用下图表示。

图中的叶子节点颜色为蓝色表示临时(ephemeral)znode,为黄色则表示永久(persistent)znode。下面我们择重点解释这些ZK路径下的信息。

broker注册信息

路径为/brokers/ids/[broker_id],其中存储的数据示例如下。

{
  "listener_security_protocol_map": {
    "PLAINTEXT": "PLAINTEXT"
  },
  "endpoints": ["PLAINTEXT://hadoop7:9092"],
  "jmx_port": 9393,
  "host": "hadoop7",
  "timestamp": "1554349917296",
  "port": 9092,
  "version": 4
}
  • jmx_port:JMX端口号。
  • host:所在主机名或IP地址。
  • timestamp:启动时的时间戳。
  • port:开放的TCP端口号。
  • version:版本号。以下所有version值均是代表版本号,不再赘述。

当Kafka集群中有节点上下线时,这个路径下的数据就会更新。

topic注册信息

路径为/brokers/topics/[topic_name], 其中存储的数据示例如下。

{
  "version": 1,
  "partitions": {
    "8": [103],
    "4": [109],
    "9": [104],
    "5": [110],
    "6": [111],
    "1": [106],
    "0": [105],
    "2": [107],
    "7": [102],
    "3": [108]
  }
}
  • partitions:topic中各个partition的ID,以及其对应的ISR中各个broker的ID的列表。

当有topic被创建或删除,以及partition发生变更时,这个路径下的数据就会更新。通过对topic以及上节所述节点变更注册监听,就能实现producer的负载均衡。

另外,在/admin/delete_topics下还保存有已经标记为删除的topic名称(只有名称,没有其他数据)。在/config/topics/[topic_name]下保存有各个topic的自定义配置。

partition状态信息

路径为/brokers/topics/[topic_name]/partitions/[partition_id]/state,其中存储的数据示例如下。

{
  "controller_epoch": 17,
  "leader": 105,
  "version": 1,
  "leader_epoch": 2,
  "isr": [105]
}
  • controller_epoch:controller的纪元(代数),即集群重新选举controller的次数。
  • leader:当前partition leader的broker ID。
  • leader_epoch:partition leader的纪元(代数),即当前partition重新选举leader的次数。
  • isr:该partition对应的ISR中各个broker ID的列表。

controller注册信息

当前controller信息的路径就是/controller,其中存储的数据示例如下。

{
  "version": 1,
  "brokerid": 104,
  "timestamp": "1554349916898"
}
  • brokerid:现在集群中controller的节点ID。
  • timestamp:最近一次controller变化的时间戳。

如果controller信息节点被删除的话,就会触发集群重新选举controller。ZK对选主操作可以说是有天然的支持。

另外,在/controller_epoch路径下还保存有controller的纪元值,与partition状态信息中的值相同。每重新选举一次,该值就会加1。

consumer订阅信息

consumer本身的信息路径为/consumers/[group_id]/ids/[consumer_id],其中存储的数据示例如下。

{
  "version": 1,
  "subscription": {
    "bl_mall_orders": 1
  },
  "pattern": "white_list",
  "timestamp": "1558617131642"
}
  • subscription:订阅的topic名称,及该topic对应消息流个数的映射。
  • pattern:订阅方式,可取值为静态(static)、白名单(white_list)、黑名单(black_list)。
  • timestamp:consumer创建时的时间戳。

通过ZK维护的consumer及consumer group信息,可以实现消费者负载均衡。

另外,在/consumers/[group_id]/offsets/[topic_name]/[partition_id]下存储有consumer group对应各个topic及partition的消费偏移量,在/consumers/[group_id]/owners/[topic_name]/[partition_id]下存储有consumer group对应各个topic及partition的消费者线程。

最优replica选举信息

当由于节点宕机等原因使得partition leader变得不再均匀分布时,我们可以使用Kafka提供的kafka-preferred-replica-election工具重新将partition创建时的最优replica(前提是在ISR内)选举为leader,也可以开启leader自动平衡的功能(auto.leader.rebalance.enable)。当正在选举最优replica时,ZK中就会创建/admin/preferred_replica_election节点,其中存储着需要调整最优replica的partition信息,示例数据如下。

{
  "version": 1,
  "partitions": [
    {
      "topic": "bl_mall_orders",
      "partition": 1
    },
    {
      "topic": "bl_mall_products",
      "partition": 0
    }
  ]
}

partition重分配信息

与上面的kafka-preferred-replica-election工具类似,Kafka还提供了kafka-reassign-partitions工具,但它的功能更为强大。它可以重新分配partition的所有leader和follower的位置,甚至更改replica数量。当集群扩容或follower分布也不均匀时,就可以利用它。该工具会生成JSON格式的重分配计划,并存入ZK中/admin/reassign_partitions节点,示例数据如下。

{
  "version": 1,
  "partitions": [
    {
      "topic": "bl_mall_wish",
      "partition": 1,
      "replicas": [0, 1, 3]
    }
  ]
}

ISR变更通知信息

各个partition的ISR集合并不是一成不变的。当ISR发生变化(比如有replica超时)时,controller会将发生变化的那个partition存入/isr_change_notification/[isr_change_x]中。目前暂时不容易找到它的数据格式,因此留空。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容