• Kafka——在zookeeper中存储结构和查看方式


    Zookeeper 主要用来跟踪Kafka 集群中的节点状态, 以及Kafka Topic, message 等等其他信息. 同时, Kafka 依赖于Zookeeper, 没有Zookeeper 是不能运行起来Kafka 的. 

    • Controller 选举:
      • Controller 是一个特殊的Broker, 其负责所有Partition 的leader/follower 关系.
      • Zookeeper 负责从Broker 中选举出一个作为Controller, 并确保其唯一性. 同时, 当Controller 宕机时, 选举一个新的.
    • 集群 membership:
      • 记录集群中都有哪些活跃着的Broker.
    • Topic 配置:
      • 有哪些Topic, Topic 都有哪些Partition, Replica 存放在哪里, Leader 是谁.
    • 配额(0.9.0+):
      • 记录每个客户能够读写的数据量.
    • ACLs(0.9.0+):
      • 记录对Topic 的读写控制.

    1、kafka的ZooKeeper存储结构

      该图片盗自大牛的博客:http://blog.csdn.net/lizhitao/article/details/23744675

      在ZK 的监视端, 运行ls / , 可以列出所有的顶级节点, 主要包含以下的节点:

    • cluster.
    • brokers.
    • controller.
    • consumer.
    • config.
    • isr_change_notification.

      通过字面意思能够理解其记录的内容. 需要说明的是isr_change_notification 节点. 在Kafka 中, Leader 和Follower 的数据同步遵循的是"最终一致"原则, 也就是数据同步会有延迟, 但保证最终数据的一致性.

      isr 是'in-sync' replicas 的缩写, 代表的是与Leader 数据已经通过过的replica, 它会作为重选Leader 时作为判断依据.

    2、连接ZooKeeper

      2.1 kafka自带zookeeper

      进入kafka的bin目录,执行以下命令:

    [root@localhost bin]# ./zookeeper-shell.sh 172.16.10.91:2181,172.16.10.92:2181,172.16.10.93:2181

      2.2 独立安装zookeeper

      服务端开启的情况下,进入客户端的命令:

    {zookeeper目录}/bin/zkCli.sh

    3、常用命令

    (1)查看数据:ls, ls2

      【ls】会显示该节点下的子节点信息

      例如:【ls /】:显示zookeeper根目录下的子节点

      例如:【ls /brokers/ids】:显示集群中的Broker列表

      

      【ls2】命令会显示该节点的子节点信息和属性信息

      例如:【ls2 /brokers/topics/cwx】:显示cwx主题的子节点信息和属性信息

       

    (2)获取数据:get

      get 命令会显示该节点的节点数据内容和属性信息

      例如:【get /brokers/topics/topic-01】:可以获取topic-01 主题的值

      可以看出, 该Topic 只有一个Partition

      例如:【get /brokers/topics/topic-01/partitions/0/state】:获取Topic Partition 的信息

      可以看出, 该Topic 有3个replica, 而且当前状态都是isr(也就是已处于最新状态). 同时, 当前的Leader 是Broker 0.

    (3)获取数据:rmr 

      rmr 命令删除指定路径的节点

      例如:【rmr /brokers/topics/test】:删除test主题

    4、主要节点信息描述

      4.1 topic注册信息

      命令:/brokers/topics/[topic]

      存储某个topic的partitions所有分配信息

    复制代码
    Schema:
    {
        "version": "版本编号目前固定为数字1",
        "partitions": {
            "partitionId编号": [
                同步副本组brokerId列表
            ],
            "partitionId编号": [
                同步副本组brokerId列表
            ],
            .......
        }
    }
    Example:
    {
    "version": 1,
    "partitions": {
    "0": [1, 2],
    "1": [2, 1],
    "2": [1, 2],
    }
    }
    复制代码

      4.2 partition状态信息

      命令:/brokers/topics/[topic]/partitions/[partitionId]/state

    复制代码
    Schema:
    {
    "controller_epoch": 表示kafka集群中的中央控制器选举次数,
    "leader": 表示该partition选举leader的brokerId,
    "version": 版本编号默认为1,
    "leader_epoch": 该partition leader选举次数,
    "isr": [同步副本组brokerId列表]
    }
     
    Example:
    {
    "controller_epoch": 1,
    "leader": 2,
    "version": 1,
    "leader_epoch": 0,
    "isr": [2, 1]
    }
    复制代码

     

      4.3 Broker注册信息

      命令:/brokers/ids/[0...N] 

      每个broker的配置文件中都需要指定一个数字类型的id(全局不可重复),此节点为临时znode(EPHEMERAL)

    复制代码
    Schema:
    {
    "jmx_port": jmx端口号,
    "timestamp": kafka broker初始启动时的时间戳,
    "host": 主机名或ip地址,
    "version": 版本编号默认为1,
    "port": kafka broker的服务端端口号,由server.properties中参数port确定
    }
     
    Example:
    {
    "jmx_port": 6061,
    "timestamp":"1403061899859"
    "version": 1,
    "host": "192.168.1.148",
    "port": 9092
    }
    复制代码

     

      4.4 Controller epoch

      命令:/controller_epoch -> int (epoch)

      此值为一个数字,kafka集群中第一个broker第一次启动时为1,以后只要集群中center controller中央控制器所在broker变更或挂掉,就会重新选举新的center controller,每次center controller变更controller_epoch值就会 + 1; 

      4.5 Controller注册信息

      命令:/controller -> int (broker id of the controller)

      存储center controller中央控制器所在kafka broker的信息

    复制代码
    Schema:
    {
    "version": 版本编号默认为1,
    "brokerid": kafka集群中broker唯一编号,
    "timestamp": kafka broker中央控制器变更时的时间戳
    }
     
    Example:
    {
    "version": 1,
    "brokerid": 3,
    "timestamp": "1403061802981"
    }
    复制代码

      4.6 Consumer offset

      命令:/consumers/[groupId]/offsets/[topic]/[partitionId] -> long (offset)

      用来跟踪每个consumer目前所消费的partition中最大的offset,此znode为持久节点,可以看出offset跟group_id有关,以表明当消费者组(consumer group)中一个消费者失效,重新触发balance,其他consumer可以继续消费。

     

      4.7 删除topics

      命令:/admin/delete_topics

    复制代码
    Schema:
    { "fields":
        [ {"name": "version", "type": "int", "doc": "version id"},
          {"name": "topics",
           "type": { "type": "array", "items": "string", "doc": "an array of topics to be deleted"}
          } ]
    }
     
    例子:
    {
      "version": 1,
      "topics": ["foo", "bar"]
    }
    复制代码

      4.8 Topic配置

      命令:/config/topics/[topic_name]

    复制代码
    {
      "version": 1,
      "config": {
        "config.a": "x",
        "config.b": "y",
        ...
      }
    }
    复制代码

      

    5、关闭Leader

        

    6、关闭Zookeeper 

       

    7、特别注意事项

      离开了Zookeeper, Kafka 不能对Topic 进行新增操作, 但是仍然可以produce 和consume 消息.

      PS: 在运行过程中, 如果先关闭掉了Zookeeper, 然后再去关闭Kafka, 会发现Kafka 后台一直结束不掉, 这是因为Kafka 会被block 在与Zookeeper 的重连过程中. 解决方法是重启Zookeeper , 然后先关闭Kafka 再关闭Zookeeper.

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    补充参考:

    1、命令行工具的一些简单操作如下:

    1. 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
    2. 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
    3. 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串
    4. 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串
    5. 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置
    6. 删除文件: delete /zk 将刚才创建的 znode 删除
    7. 退出客户端: quit
    8. 帮助命令: help
     

    2、ZooKeeper 常用四字命令:

          ZooKeeper 支持某些特定的四字命令字母与其的交互。它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息。用户在客户端可以通过 telnet 或 nc 向 ZooKeeper 提交相应的命令

    1. 可以通过命令:echo stat|nc 127.0.0.1 2181 来查看哪个节点被选择作为follower或者leader
    2. 使用echo ruok|nc 127.0.0.1 2181 测试是否启动了该Server,若回复imok表示已经启动。
    3. echo dump| nc 127.0.0.1 2181 ,列出未经处理的会话和临时节点。
    4. echo kill | nc 127.0.0.1 2181 ,关掉server
    5. echo conf | nc 127.0.0.1 2181 ,输出相关服务配置的详细信息。
    6. echo cons | nc 127.0.0.1 2181 ,列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。
    7. echo envi |nc 127.0.0.1 2181 ,输出关于服务环境的详细信息(区别于 conf 命令)。
    8. echo reqs | nc 127.0.0.1 2181 ,列出未经处理的请求。
    9. echo wchs | nc 127.0.0.1 2181 ,列出服务器 watch 的详细信息。
    10. echo wchc | nc 127.0.0.1 2181 ,通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。
    11. echo wchp | nc 127.0.0.1 2181 ,通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。

  • 相关阅读:
    2、词法分析--4、字面值--2、字符串拼接
    2、词法分析--3、标识符和关键字
    2、词法分析-- 1、行结构
    git本机服务器配置(四):git+TortoiseGit+gitblit配置本机服务器
    git本机服务器配置(三):Gitblit的安装
    git本机服务器配置(二):TortoiseGit的安装
    git本机服务器配置(一):git的安装
    python 中 dlib库的安装
    正向代理和方向代理的区别和使用
    php应用路径变量问题总结
  • 原文地址:https://www.cnblogs.com/weifeng1463/p/14207837.html
Copyright © 2020-2023  润新知