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场会议和活动。 随着所有这些丰富的内容和新体验同时发生,很容易就无法跟踪正在发生的事情。 在这篇文章中…

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

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

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

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

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

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

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

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

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表示超过 还差几分钟…

postman测试工具,如何对参数使用md5加密

先创建环境变量password,并定义了变量值(例如:123456)访问登录接口通常是post提交登录用户名称和登录密码,且以json格式提交,所以在body-raw-json,填写json串如下图所示: 接着在pre-…

开源java性能分析工具_Java性能监控:您应该知道的5个开源工具

开源java性能分析工具鲜为人知但有用:开源应用程序性能监视的状态 对于任何应用程序来说,最重要的事情之一就是性能。 我们要确保用户获得他们能获得的最佳体验,并想知道我们的应用已启动并正在运行。 这就是为什么我们大多数人至少使用一种…

cmd编译可以通过执行没有结果_Go语言是如何完成编译的

Go语言是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件才能在目标机器上运行,如果我们想要了解Go语言的实现原理,理解它的编译过程就是一个没有办法绕过的事情。预备知识想…

如何通过postman测试需要登录授权的接口

思路 请求需要登录授权的接口,就意味着你要传token给接口,所以请求接口(要测试的接口)之前就要先获取token,因为登录成功后服务端才会返回token,而token又设置了时效,所以每次请求接口&#xf…

wordpress linux 目录,快速搭建WordPress(Linux)

作者:彭济环境要求一、配置LAMP(LinuxApacheMysqlPHP)1、安装apachesudo apt-get install apache2 //安装apache2apache2 -v //查看版本网页访问本机ip地址,查看是否安装成功2、安装phpsudo apt-get install php //安装phpphp -v //查看版本sudo apt-get…

atheros蓝牙设备驱动 小米_小米Air 13笔记本黑苹果WiFi蓝牙硬件改装方案二

该方案适合小米笔记本Air 13初代,适合小米笔记本PRO等型号,适合通用的预留有M.2 PCIE通道SSD卡槽的电脑。也是作者极力推荐的终极改造方案。总体方案: 使用笔记本主板上的M.2 nvme通道 SSD硬盘接口进行拓展。使用BCM943602CS专用的M.2[NGFF]转接卡进行改…

python实现局域网攻击_通过python实现DNS欺骗

假设在一个的局域网内有两个人:Bob和Eve。Eve想让Bob访问他创建的恶意网页,这样她就可以通过隐藏性的下载给Bob的计算机上安装恶意软件,或者可能展示一个欺骗性的站点来试图窃取Bob的认证信息。(图片来自以上提供的链接&#xff0…

背景区域为负样本什么意思_词向量-skipgram与负采样

大纲:1. onehot vs 分布式表示2. 分布式表示的全局泛化能力3. how to learn word2vec - intuition4. SkipGram5. SkipGram Negative Sampling6. 评估词向量7. CBOW与SkipGram对比1. onehot vs 分布式表示Onehot表示:V (apple, going, I, home, machine ,learing)ap…

嵌入式linux应用程序实例,嵌入式Linux应用程序访问物理地址的实例

前言  按照Linux分层驱动思想,外设驱动与主机控制器的驱动不相关,主机控制器的驱动不关心外设,而外设驱动也不关心主机,外设访问核心层的通用应用程序接口进行数据传输,主机和外设之间可以进行任意的组合。这样思想要…

线程同步 线程安全_同步装饰器来替换线程安全类

线程同步 线程安全您知道什么是线程安全吗? 如果没有,下面是一个简单的示例。 所有类都必须是线程安全的,对吗? 并不是的。 其中一些必须是线程安全的? 又错了。 我认为它们都不必是线程安全的,而它们都必须…

forge开发_使用Forge,WildFly Swarm和Arquillian开发微服务

forge开发在这篇文章中,我们将看到如何使用WildFly Swarm和Forge开发微服务,以及如何使用Arquillian和Rest Assured对其进行测试。 WildFly Swarm提供了一种创新的方法来打包和运行Java EE应用程序,方法是将它们与足够的服务器运行时一起打包…

zynq+linux固化程序,如何在 Zynq UltraScale+ MPSoC 上实现 Linux UIO 设计

原标题:如何在 Zynq UltraScale MPSoC 上实现 Linux UIO 设计简介作者: Alex He (何晔), 赛灵思高级嵌入式应用工程师这里的 UIO 即 Userspace I/O,本文中 UIO 泛指 UIO 设备和 UIO 驱动。它在 Linux kernel 的世界里比较小众&…

thinkpad笔记本散热风扇_极致的散热体验,ORICO 全铝DIY双风扇笔记本散热垫评测...

电脑的出现,极大的改变了人类的生活。娱乐、办公、游戏、电子竞技等等都需要用到电脑。而电脑也慢慢的在升级着。电脑的体积也由最开始的的占据几间屋子的庞大体积,到后来的台式机、台式一体机、电脑的体积慢慢的变的越来越小。而便携式笔记本电脑的出现…