Loading [MathJax]/jax/output/CommonHTML/config.js
部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Zookeeper-监控(Monitor)

Zookeeper-监控(Monitor)

作者头像
运维小路
发布于 2025-05-18 01:43:51
发布于 2025-05-18 01:43:51
7200
代码可运行
举报
文章被收录于专栏:运维小路运维小路
运行总次数:0
代码可运行

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

前面我们介绍介绍了几个常用的代理服务器,本章节我们讲来讲解Zookeeper这个中间件

我们虽然前面讲过4字命令和自带的Shell脚本可以读取ZooKeeper的运行状态,但是它并不成体系。还有就是目前云原生的情况下,我们的的监控也需要接入Prometheus和Grafana,所以我们下面就来讲解下我们的监控。目前官方可以直接下载的ZooKeeper版本是3.7.2 和 3.8.4 和3.9.3从配置文件来看都是支持通过metrics方式暴露监控指标。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#取消所有注释,重启服务则可以看到
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpHost=0.0.0.0
metricsProvider.httpPort=7000
metricsProvider.exportJvmInfo=true
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#访问地址
http://ip地址:7000/metrics

这里的监控默认包含两个方面的内容:一个就是ZooKeeper的指标(类似前面的四字命令输出)。另外一个它作为使用JAVA语言的应用,内部都有一个JAVA虚拟机,如果我们要分析性能问题就必须分析JAVA虚拟机的堆栈信息(所有的JAVA应用都有)。针对JAVA虚拟机都有一个jvm监控,如果要关闭必须明确关闭设置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#必须显示设置关闭,注释都不行 
metricsProvider.exportJvmInfo=false
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#如果开启了可以从日志里面看出来 
2025-04-28 00:36:23,701 [myid:] - INFO  [main:PrometheusMetricsProvider@74] - Initializing metrics, configuration: {httpPort=7000}
2025-04-28 00:36:23,701 [myid:] - INFO  [main:PrometheusMetricsProvider@82] - Starting /metrics HTTP endpoint at port 7000 exportJvmInfo: true

下面这个图就是我从Grafana官方网站找出来的通过metrics的指标在grafana上的图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#下载地址
https://grafana.com/grafana/dashboards/12338-zookeeper/

当然如果只是简单监控,未接入云原生则可以采用下面的脚本,这里不仅仅需要监控集群状态,还需要监控znode和zxid,因为我是遇到过集群状态正常,但是zxid不一致的情况。

当然下面的代码是我让DeepSeek生成的,格式还有功能可以根据自己需要调整。并且还可以进行调整作为检查本机的ZooKeeper是否正常的的脚本,然后如果不正常还可以对它进行重启。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import socket
from concurrent.futures import ThreadPoolExecutor
import concurrent.futures

def parse_zoo_cfg(file_path):
    """解析zoo.cfg文件,获取服务器列表和客户端端口"""
    client_port = 2181  # 默认端口
    servers = []
    with open(file_path, 'r') as f:
        for line in f:
            line = line.strip()
            if line.startswith('#') or not line:
                continue
            if '=' in line:
                key, value = line.split('=', 1)
                key = key.strip()
                value = value.strip()
                if key == 'clientPort':
                    try:
                        client_port = int(value)
                    except ValueError:
                        pass  # 保持默认端口
                elif key.startswith('server.'):
                    parts = value.split(':')
                    if parts:
                        host = parts[0]
                        servers.append(host)
    return servers, client_port

def get_node_stat(host, port, timeout=5):
    """通过四字命令获取节点状态"""
    try:
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.settimeout(timeout)
            s.connect((host, port))
            s.sendall(b'stat\n')
            response = b''
            while True:
                data = s.recv(1024)
                if not data:
                    break
                response += data
            return response.decode('utf-8')
    except Exception as e:
        return f"Error: {str(e)}"

def parse_stat_response(response):
    """解析stat命令的响应"""
    stats = {}
    lines = response.split('\n')
    for line in lines:
        if line.startswith('Mode:'):
            stats['mode'] = line.split(':', 1)[1].strip()
        elif line.startswith('Zxid:'):
            stats['zxid'] = line.split(':', 1)[1].strip()
        elif line.startswith('Node count:'):
            stats['node_count'] = line.split(':', 1)[1].strip()
    return stats

def main():
    import sys
    cfg_file = sys.argv[1] if len(sys.argv) > 1 else 'zoo.cfg'
    servers, client_port = parse_zoo_cfg(cfg_file)

    if not servers:
        print("未找到服务器配置。")
        return

    print(f"检查 {len(servers)} 个节点...\n")

    results = []
    with ThreadPoolExecutor(max_workers=3) as executor:
        future_to_host = {executor.submit(get_node_stat, host, client_port): host for host in servers}
        for future in concurrent.futures.as_completed(future_to_host):
            host = future_to_host[future]
            try:
                response = future.result()
                if response.startswith("Error"):
                    stats = {'error': response}
                else:
                    stats = parse_stat_response(response)
                results.append((host, stats))
            except Exception as e:
                stats = {'error': str(e)}
                results.append((host, stats))

    # 打印结果
    for host, stats in results:
        print(f"节点: {host}:{client_port}")
        if 'error' in stats:
            print(f"  错误: {stats['error']}")
        else:
            print(f"  状态: {stats.get('mode', 'N/A')}")
            print(f"  Znode数量: {stats.get('node_count', 'N/A')}")
            print(f"  ZXID: {stats.get('zxid', 'N/A')}")
        print()

if __name__ == "__main__":
    main()

当前集群检查就是不符合预期的。监控的目的是让我们及时发现异常,然后根据异常情况及时做除修复操作,避免更大的故障。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
检查 3 个节点...

节点: 192.168.31.140:2181
  状态: follower
  Znode数量: 9
  ZXID: 0x2000000d1

节点: 192.168.31.141:2181
  状态: leader
  Znode数量: 9
  ZXID: 0x500000000

节点: 192.168.31.142:2181
  状态: follower
  Znode数量: 9
  ZXID: 0x500000000
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Zookeeper系列(1):安装与介绍
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
布禾
2021/04/27
5680
Zookeeper系列(1):安装与介绍
探索:从入门到放弃之Zookeeper3.6.0
目前zookeeper的版本是3.6.0,同时增加了几个新特性,同时拥抱了Prometheus.
公众号: 云原生生态圈
2021/11/15
1.3K0
安装zookeeper集群
[root@localhost local]#rz -E #上传jdk
用户10662715
2025/04/08
860
你可能不知道的 ZooKeeper 知识点
Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源、有趣、入门级的 ZooKeeper 教程,面向有编程基础的新手。
HelloGitHub
2021/05/08
5460
你可能不知道的 ZooKeeper 知识点
【ZooKeeper】给 ZK 搞个监控
现在 Promethues 这么方便了,基本上开源项目不接 Prometheus 已经很少见了,尤其是这种应用级别的开源项目,通过开源项目的 Exporter,配置一下 Prometheus 的服务发现配置,抓到指标放 Prometheus 然后通过 Grafana,整个过程已经是非常丝滑了。
runzhliu
2021/05/27
2.3K0
只需五分钟,了解kafka的环境搭建
在Kafka系列的上一篇文章中,我们介绍了Kafka的体系结构,那么本篇文章呢,我们就着手来把Kafka的运行环境搭建起来。
爪哇缪斯
2023/08/24
9490
只需五分钟,了解kafka的环境搭建
(二)Kafka系列:“光说不干假把式!”,环境咱先搭上
在Kafka系列的上一篇文章中,我们介绍了Kafka的体系结构,那么本篇文章呢,我们就着手来把Kafka的运行环境搭建起来。
爪哇缪斯
2023/09/05
1640
(二)Kafka系列:“光说不干假把式!”,环境咱先搭上
大数据技术之_06_Zookeeper学习_Zookeeper入门+Zookeeper安装+Zookeeper内部原理+Zookeeper实战(开发重点)+企业面试真题
  Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。
黑泽君
2019/03/06
9140
分布式学习十一:搭建zookeeper集群
之前发过一个单机部署教程,集群部署类似,这次我们通过docker-compse进行编排部署
仙士可
2022/03/13
3860
分布式学习十一:搭建zookeeper集群
Alex 的 Hadoop 菜鸟教程: 第9课 zookeeper 介绍和使用
原文地址: http://blog.csdn.net/nsrainbow/article/details/42836479 最新课程请关注原作者博客,获得更好的显示体验
全栈程序员站长
2022/09/02
3330
zookeeper
将conf/目录下的zoo_sample.cfg修改为zoo.cfg,修改dataDir路径为zkData。在zkData目录下创建myid文件,输入唯一的int型集群编号。
matt
2022/10/25
6290
zookeeper
Zookeeper是什么&怎么用
Zookeeper 是一个开源的分布式协调服务框架 ,主要用来解决分布式集群中应用系统的一致性问题和数据管理问题
说故事的五公子
2020/07/14
1.7K0
浅谈kafka 一
Kafka官方给出的定义是:Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications. (Apache Kafka 是一个开源分布式事件流平台,被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用程序。)
云原生
2022/05/16
3030
Zabbix添加对Zookeeper集群的监控
在目前公司的业务中,有部分ESB架构用ZooKeeper作为协同服务的场景,做好ZooKeeper的监控很重要。
菲宇
2021/12/06
8030
Zabbix添加对Zookeeper集群的监控
使用Docker搭建Zookeeper集群
上述命令在后台运行一个名为 zookeeper-standalone 的容器。由于 Zookeeper 是’快速失败’,因此最好通过 --retart参数设置容器在意外停止时自动重启。默认是 no,表示不重启。-p 参数将宿主机端口 8080 与容器端口 8080 映射。通过如下命令查看运行中的 Zookeeper 容器:
smartsi
2020/08/17
7.3K2
少年:ZooKeeper学一下
很多中间件,比如Kafka、Hadoop、HBase,都用到了 Zookeeper,于是很多人就会去了解这个 Zookeeper 到底是什么,为什么它在分布式系统里有着如此无可替代的地位。
sowhat1412
2020/11/05
5690
少年:ZooKeeper学一下
微服务(四)——zookeeper入门&api实践
Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的 Apache 项目。
不愿意做鱼的小鲸鱼
2022/09/26
4410
微服务(四)——zookeeper入门&api实践
Centos7 离线安装 zookeeper 并设置服务开机自启 实践笔记 自用
我使用centos7X64最小化安装 CentOS-7-x86_64-Minimal-1708 启动后状态
cookily
2021/12/07
1.6K0
Centos7 离线安装 zookeeper  并设置服务开机自启 实践笔记 自用
zookeeper最基础教程
Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。
ha_lydms
2023/09/15
2330
zookeeper最基础教程
安装配置ZooKeeper及基本用法
要想学习分布式应用,ZooKeeper是一个绕不过去的基础系统。它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。
程序猿讲故事
2019/09/26
1.3K0
安装配置ZooKeeper及基本用法
推荐阅读
相关推荐
Zookeeper系列(1):安装与介绍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验