zookeeper 日志查看_每天使用的注册中心zookeeper,流量暴涨怎么办?

通过本文能学习什么?

  • 初步了解zookeeper监控
  • 如何运用tcpdump + Wireshark抓包分析
  • Dubbo在zookeeper上节点设计
  • 如何查看zookeeper节点快照

背景

zookeeper作为dubbo的注册中心,承载着服务的基础信息(方法名,分组,版本等),服务关系等信息。随着业务增多,服务数增加,注册中心的网络IO已逐步成为瓶颈。

介绍zookeeper监控

zookeeper3.4.6后提供四字命令可以查看zookeeper集群状态信息。

例如:

  • echo conf | nc localhost 2181,查看集群配置信息,端口,最大连接数等
  • echo cons | nc localhost 2181,查看客户端链接的详情,接受/发送包数,session id等
  • echo crst | nc localhost 2181,重置所有客户端的统计信息
  • echo dump | nc localhost 2181,列出未经处理的会话和临时节点
  • echo envi | nc localhost 2181,查看服务器的环境信息,java.home,os.name等
  • echo ruok | nc localhost 2181,测试集群是否正常运行
  • echo srst | nc localhost 2181,重置服务器的统计信息
  • echo srvr | nc localhost 2181,查看服务器的详细信息。zk版本、接收/发送的包数量、连接数、运行模式、节点总数等
  • echo stat | nc localhost 2181,查看客户端列表,接收/发送包数量、连接数、运行模式、节点总数、延迟等
  • echo wchs | nc localhost 2181,查看watches相关信息
  • echo mntr | nc localhost 2181,列出集群的健康状态。接受/发送的包数量、操作延迟、运行模式、节点总数、watch总数、临时节点总数等

我们使用Grafana和Prometheus去收集zookeeper集群信息和展示,底层也是通过四字命令获取信息。

330248a05534b837c156e5b7757a1813.png

线上案例

50990c2e383f7a888fadd065c33796de.png

我们线上zookeeper监控偶尔会收到堆积请求数告警,经查看发现是网络IO过大造成了请求堆积,不过很快又恢复了,可能某个应用那一刻爬去了大量zookeeper节点。

排查过程

如何找到调用方?

由于突发流量是不定时的,没法通过实时流量分析,只能通过侧面突破。

zookeeper上存储的都是服务的基本信息。服务的摘挂流量,重启等操作都会导致zookeeper节点变动,并通知上游。这样就可以通过发布系统,找下那一段时间谁在发布,看看是否有突破口。

cd7a4832c0f7fe811a54d897cd830a50.png

通过查看发布系统,找到了A服务的网络IO与zookeeper的网络IO图形契合,并且出入口流量也能对上,至此,我们找到了谁在大量拉取zookeeper.

zookeeper哪些节点被频繁拉取?

初步怀疑是A服务使用dubbo方式不对,最后查看A服务源码,并未找到问题。

由于A服务每次重启都会导致zookeeper流量增高,说明是可复现的,可以进行抓包分析,抓包工具主流的就是tcpdump + Wireshark。

tcpdump是linux下的网络截取工具,是服务端抓包的首选。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来过滤信息。通过以下命令获取我们需要的数据包。

tcpdump host (10.10.xx.xx or 10.10.xx.xx or 10.10.xx.xx) and tcp port 4181 -s 0 -w zk.pcap

host:指定多个IP

port:指定端口

-s 0:抓取完整包,而不是默认的68字节

-w:保存文件

还有很多其他参数,大家可以通过man tcpdump查看。

我们用Wireshark打开zk.pcap抓包文件。Wireshark十分强大,可以分析TCP等各种协议,并且提供丰富的语法来过滤信息,分析TCP三次握手就能通过Wireshark查看,大家有兴趣可以下来研究。

d11cd74fa9d45237dc097905745e11d3.png

我们可以根据length排序后再跟踪一个TCP流,查看包内容

f2bb08b8a9e2851998ef97c336c394fa.png

红色为请求,蓝色为返回

我们发现请求了非常多的/dubbo/com.missfresh.algo.common.api.service.IRecoRecallService/configurators节点。

节点作用是什么?

简单介绍下dubbo在zookeeper注册节点作用。

eee5c910efd747e5155339159c9cf7c7.png

routes节点:路由规则相关,永久节点。

configurators节点:dubbo配置相关,永久节点。

providers节点:服务提供者信息,临时节点,生产者注册到该节点,消费者会监听该节点。

consumers节点:消费者信息,临时节点,消费者注册到该节点。

configurators节点记录了服务的IP,分组和版本信息。如果有N个IP,M个分组,K个版本,那个该节点个数为N * M * K个。

如何查看zookeeper上该节点个数?

可以通过zkClient连上集群查看。今天我们通过另一种方式,分析zookeeper快照日志查看。

zookeeper有事务日志(log.*)和快照日志(snapshot.*),可以通过zookeeper自带工具把snapshot日志转成文本。

java -classpath :./slf4j-api-1.7.25.jar:../zookeeper-3.4.12.jar org.apache.zookeeper.server.SnapshotFormatter ~/Documents/snapshot.b3c8cb285 > ~/Documents/zk-snapshot-20200325.log

通过本地文件分析,发现该节点接近4000个。

总结

总结原因

1、由于dubbo服务的上下线,调节权重等操作都会生成configurators永久节点,导致该节点一直积累,每次服务启动都会去拉取该服务的所有配置,导致zookeeper出口流量增加。

2、为什么会有这么多节点?业务方在使用时存在问题,每次迭代都升级服务版本号,正确做法是尽量兼容低版本的服务,只有在完全无法兼容情况再考虑升级服务版本号。并且给每个上游一个service group,但并没有通过service group隔离环境/机器,导致节点数是服务版本号与service group的乘积。

解决方案

1、拿到废弃节点后,通过zkClient删除废弃节点。

2、业务调整服务调用方式,把service group去掉,改用多个方法对外暴露。

未来规划

随着业务逐渐往docker迁移,我们基础组件也迎来新的挑战,频繁的扩容缩容,IP变换也会导致注册中心越来越臃肿,需要一个注册中心治理服务给他瘦身。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaone_JavaOne 2016 Essentials:您不应该错过的7个事件和会话

javaone参加JavaOne吗? 确保您不会错过这些活动 又到了每年的这个时候。 旧金山一年一度的Java假期即将来临,全市各地举行了超过400场会议和活动。 随着所有这些丰富的内容和新体验同时发生,很容易就无法跟踪正在发生的事情。 在这篇文章中…

Oracle的package(包)

包 Package 包是一种比较特殊的 PL/SQL 程序 , 它并不是一个 PL/SQL 存储程序块 , 而是用于将相关的存储过程和函数组织起来 , 组成 PL/SQL 存储程序组。 包由两个独立部分组成:包头和包体。

python中可用于布尔测试的,如何在Python中使用布尔值?

Python中的布尔值是整数的子类。布尔构造函数-bool。bool类继承自int类。issubclass(bool,int) // will return Trueisinstance(True,bool) , isinstance(False,bool) //they both TrueTrue和False是单例对象。它们将在应用程序的整个生命周期内保持相同的内存地址。当您键入Tr…

python比较两张图片是否一样_opencv_判断两张图片是否相同

python金融风控评分卡模型和数据分析微专业课(博主亲自录制视频):http://dwz.date/b9vv本文为原创,转载请注明,作者 231469242qq.com OpenCV介绍 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库&a…

kata_小规模流处理kata。 第1部分:线程池

kata我再次为我的公司在GeeCON 2016上举办了编程竞赛。 这次分配需要设计并根据以下要求选择实施系统: 一个系统每秒发送大约一千个事件。 每个Event至少具有两个属性: clientId –我们期望一个客户端每秒最多可以处理几个事件 UUID –全球唯一 消耗…

Oracle数据库的trigger(触发器)

触发器 Trigger PL/SQL 程序中的触发器的结构类似于函数和过程 , 与函数和过程不同 , 触发器是在事件发生时隐式地运行的。相当于Java语言中的事件监听器

hpux oracle9,oracle 9.2.0.8在HP-UX 11.31 下的安装步骤和注意事项

在hp_unix ia64位操作系统安装oracle 数据库步骤1. 操作系统安装好后打补丁和调参数:(1) 打上patch(PHKL_38038),安装oracle9i必须打此补丁(2) 配置好网卡IP,可用xmanager调用系统图形化界面(3) 按方案调整内核参数2. 数据库安装(1) 命令行创…

bat 存储过程返回值_为什么不推荐使用存储过程?

之所以有这个题目,我既不是故意吸引眼球,也不想在本文对存储过程进行教科书般论述。最近项目中遇到的存储过程问题,让我想起了去年在武汉出差时一位同事的发问:我觉得存储过程挺好用的,为什么你不建议用?当…

aws lambda使用_使用Lambda,Api Gateway和CloudFormation在AWS云上使用Java

aws lambda使用在上一篇文章中,我们实现了基于Java的aws lambda函数,并使用CloudFront进行了部署。 由于我们已经设置了lambda函数,因此我们将使用AWS API Gateway将其与http端点集成。 Amazon API Gateway是一项完全托管的服务,…

数据库的序列

序列的特性:产生连续的不同的数字值用来作为数据表的主键。 序列是数据库中的独立对象表可以用序列产生的值作为主键 , 也可以不用序列可以为一个或多个表产生主键 , 也可以不用 建议:一个序列为一个表产生主键序列这种对象在 Oracle、db2 等数据库中有 , 在 mysql、sql serve…

java mic波形识别_会议季Mic Drop:您不应该错过的13场Java演讲

java mic波形识别您的老板没有派您参加真正的会议吗? 我们为您准备了最好的讲座 九月份的一些重大事件闻名于世:秋季的第一天,甚至全国熏肉日。 这也是召开会议最忙的月份之一,一些大型Java事件涵盖了平台的新的重要更新。 在以…

oracle utl inaddr,oracle11g之ACL拙见

错误样例(使用UTL_HTTP发送http请求时,报出如下错误): 原因: 1、Oracle允许使用几个PL/SQL API(UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP和 UTL_INADDR)访问外部网络服务,这些API都使用TCP协议。…

Mac下载JDK/安装JDK/卸载JDK

文章目录下载JDK安装JDK配置环境变量卸载JDK下载JDK 访问这个地址:https://www.oracle.com/java/technologies/downloads/#java18 进入下载JDK的界面后,下拉界面到下图所示的位置: 或者访问这个地址:https://www.oracle.com/cn/…

希腊字母常用指代意义及其中文读音

希腊字母常用指代意义及其中文读音序号大写小写英语音标注音英文汉语名称常用指代意义1Αα/lfə/alpha阿尔法角度、系数、角加速度、第一个、电离度、转化率 2Ββ/bi:tə/ 或 /beɪtə/beta贝塔角度、系数、磁通系数3Γγ/gmə/gamma伽玛电导系数、角度、比热容比 4Δδ/delt…

java redis 命令_命令界面:使用Java中的动态API处理Redis

java redis 命令Redis是一个数据存储,支持190多个文档化命令和450多个命令排列。 社区积极支持Redis开发; 每个主要的Redis版本都附带新命令。 今年,Redis向第三方供应商开放,以开发可扩展Redis功能的模块。 对于客户端开发人员和…

kettle 只有一个输入记录期待设置变量并且至少已经收到2个变量._OPNET学习笔记2...

双击主机网络打开对应的节点模型,从图中可以看到网络的分层:应用层,传输层,网络层,链路层;其中在传输层中我们用到的主要是UDP(对实时性要求比较高),网络层又包括IP封装层…

oracle10g启动顺序,oracle 10g rac维护:开机 关机顺序,流程

维护oracle rac的时候,可能需要关闭数据库,甚至关闭服务器。具体的开机关机顺序如下:(oracle 用户下)1.关机顺序(1)关闭集群oememctl stop dbconsole -cluster(2)关闭数据库实例srvctl stop instance -d EDWPRD -i EDWPRD1srvctl stop instan…

python tkinter控件_Python3 tkinter基础 Label pack 设置控件在窗体中的位置

? python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 conda : 4.5.11 type setting : Markdown ? 普通布局 code """ Author : 行初心 Date : 18-10-1 Blog : www.cnblogs.com/xingchuxin GitHub : github.com/GratefulHeartCoder ""…

oracle的mins,分钟的英文缩写,10min还是10mins!

请问,分钟的英文缩写是min,小时的英文缩写是h,还是hr?秒的..._知乎[图文]时间分钟的英文缩写是什么minutes 10 minutes意思是十分钟的,比如说路程 10minutes就是十分钟 没有10minutes这种表达[图文]分钟 min【minute】 超过多少分钟就用介词past表示超过 还差几分钟…

lucene使用3.0.3_Jirasearch 2.0狗粮:使用Lucene查找我们的Jira问题

lucene使用3.0.3几年前,我首先构建并发布了Jirasearch ,它是用于薄型包装Lucene服务器的有趣的狗粮测试用例,以针对我们的Jira问题公开强大的搜索UI。 这很好地展示了Lucene的许多重要功能: 使用块联接查询来建模父文档&#xf…