工作日记-storm集群业务崩溃和解决方案

摘要:
背景昨天公司业务部门报告业务崩溃,查看各个业务节点后,定位问题到storm集群。本着先恢复业务的原则,我直接通过命令行停止任务后,又重新提交了任务,这个时候访问stormui发现业务系统已经恢复正常。storm任务,会启动两个worker,一共12个线程,分布在这台物理机上,查看stormui可以看到,启动了两个worker,端口分别为6700和6701,每一个worker负责六个线程。

背景

昨天公司业务部门报告业务崩溃,查看各个业务节点后,定位问题到storm集群。

打开storm ui查看下任务状态,发现可以加载页面元素,但是无法加载数据,分析是nimbus挂掉了,重启nimbus。本着先恢复业务的原则,我直接通过命令行停止任务后,又重新提交了任务,这个时候访问storm ui发现业务系统已经恢复正常。业务系统虽然恢复了,但是需要找到问题的根本原因,才能确保不再发生。


storm部署情况

公司的生产环境部署的storm集群,其中,zookeeper和nimbus都是单点,supervisor也只部署了一个,每个supervisor开启四个slot,这几个关键组件都部署在了一台物理服务器上。

storm任务,会启动两个worker,一共12个线程,分布在这台物理机上,查看storm ui可以看到,启动了两个worker,端口分别为6700和6701,每一个worker负责六个线程。

1597714020707


问题分析

业务层

查看业务系统日志,发现8月3日9点51开始就不正常了,表现为不生产正确的业务事件。

看8月3号以后的业务日志,没有异常的error,说明问题不是出在业务层,继续看storm层。

storm层

nimbus日志

因为前面已知nimbus因为某种原因挂掉了,所以先看nimbus日志,$STORM_HOME/logs/nimbus.log日志如下:

2020-07-31 10:14:57.523 o.a.s.z.Zookeeper main-EventThread [INFO] active-topology-blobs [startstorm-10-1592659649] local-topology-blobs [startstorm-10-1592659649-stormconf.ser,startstorm-10-1592659649-stormjar.jar,startstorm-10-1592659649-stormcode.ser] diff-topology-blobs []
2020-07-31 10:14:57.620 o.a.s.util timer [ERROR] Halting process: ("Error when processing an event")
java.lang.RuntimeException: ("Error when processing an event")
	at org.apache.storm.util$exit_process_BANG_.doInvoke(util.clj:341) ~[storm-core-1.2.3.jar:1.2.3]
	at clojure.lang.RestFn.invoke(RestFn.java:423) ~[clojure-1.7.0.jar:?]
	at org.apache.storm.daemon.nimbus$nimbus_data$fn__8298.invoke(nimbus.clj:221) ~[storm-core-1.2.3.jar:1.2.3]
	at org.apache.storm.timer$mk_timer$fn__6387$fn__6388.invoke(timer.clj:71) ~[storm-core-1.2.3.jar:1.2.3]
	at org.apache.storm.timer$mk_timer$fn__6387.invoke(timer.clj:42) ~[storm-core-1.2.3.jar:1.2.3]
	at clojure.lang.AFn.run(AFn.java:22) ~[clojure-1.7.0.jar:?]
	at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121]
2020-07-31 10:14:57.697 o.a.s.z.Zookeeper main-EventThread [INFO] active-topology-dependencies [] local-blobs [startstorm-10-1592659649-stormconf.ser,startstorm-10-1592659649-stormjar.jar,startstorm-10-1592659649-stormcode.ser] diff-topology-dependencies []
2020-07-31 10:14:57.697 o.a.s.z.Zookeeper main-EventThread [INFO] Accepting leadership, all active topologies and corresponding dependencies found locally.
2020-07-31 10:14:58.106 o.a.s.d.nimbus Thread-7 [INFO] Shutting down master

最后一行,Shutting down master,代表nimbus挂了。

supervisor日志

看supervisor的日志,$STORM_HOME/logs/supervisor.log

查看对应时段的日志信息,可以看到,首先是因为clientsession有87007ms没有接收到server的信息,所以触发了timeout处理机制。

2020-07-31 10:14:20.885 o.a.s.s.o.a.z.ClientCnxn main-SendThread(10.43.4.153:2181) [WARN] Client session timed out, have not heard from server in 87077ms for sessionid 0x105876332810086

第二步kill了worker

2020-07-31 10:14:53.914 o.a.s.d.s.Container SLOT_6702 [INFO] Killing 923112bb-4901-4d63-a93e-900e8fb7110e:0c453b60-2eaf-48ab-8c2a-0f7c267dbad5

第三步修改业务thread的状态

2020-07-31 10:14:54.363 o.a.s.s.o.a.c.f.s.ConnectionStateManager main-EventThread [INFO] State change: SUSPENDED

第四步,重连,发现失败,线程状态修改为LOST

2020-07-31 10:14:56.820 o.a.s.s.o.a.z.ClientCnxn main-SendThread(10.43.4.153:2181) [INFO] Opening socket connection to server 10.43.4.153/10.43.4.153:2181. Will not attempt to authenticate using SASL (unknown error)
2020-07-31 10:14:56.980 o.a.s.s.o.a.z.ClientCnxn main-SendThread(10.43.4.153:2181) [INFO] Socket connection established to 10.43.4.153/10.43.4.153:2181, initiating session
2020-07-31 10:14:57.015 o.a.s.s.o.a.z.ClientCnxn main-SendThread(10.43.4.153:2181) [WARN] Unable to reconnect to ZooKeeper service, session 0x105876332810086 has expired
2020-07-31 10:14:57.021 o.a.s.s.o.a.c.ConnectionState main-EventThread [WARN] Session expired event received
2020-07-31 10:14:57.187 o.a.s.s.o.a.c.f.s.ConnectionStateManager main-EventThread [INFO] State change: LOST
2020-07-31 10:14:57.194 o.a.s.s.o.a.z.ClientCnxn main-EventThread [INFO] EventThread shut down for session: 0x105876332810086

第五步,重连成功后,修改线程状态为RECONNECTED,清理原来worker的信息,并建立新的worker

2020-07-31 10:14:57.241 o.a.s.s.o.a.z.ClientCnxn main-SendThread(10.43.4.153:2181) [INFO] Opening socket connection to server 10.43.4.153/10.43.4.153:2181. Will not attempt to authenticate using SASL (unknown error)
2020-07-31 10:14:57.242 o.a.s.s.o.a.z.ClientCnxn main-SendThread(10.43.4.153:2181) [INFO] Socket connection established to 10.43.4.153/10.43.4.153:2181, initiating session
2020-07-31 10:14:57.245 o.a.s.s.o.a.z.ClientCnxn main-SendThread(10.43.4.153:2181) [INFO] Session establishment complete on server 10.43.4.153/10.43.4.153:2181, sessionid = 0x105876332810095, negotiated timeout = 20000
2020-07-31 10:14:57.277 o.a.s.s.o.a.c.f.s.ConnectionStateManager main-EventThread [INFO] State change: RECONNECTED
2020-07-31 10:15:01.983 o.a.s.d.s.Container SLOT_6700 [INFO] Cleaning up 923112bb-4901-4d63-a93e-900e8fb7110e:f1ede737-d405-44a5-a19e-eb4979cfd338
2020-07-31 10:15:03.183 o.a.s.d.s.Container SLOT_6702 [INFO] REMOVE worker-user 0c453b60-2eaf-48ab-8c2a-0f7c267dbad5
2020-07-31 10:15:03.437 o.a.s.d.s.BasicContainer SLOT_6702 [INFO] Created Worker ID 22b3823d-c03c-4593-aaac-f9ae6f5e4e1d

分析到现在还是没有头绪。


暂时的解决方案

我们只能假设是nimbus异常宕机导致后续的问题。

解决方案是:

  1. 引入daemontools监控工具,来监控nimbus和supervisor,在挂掉后自动恢复。

  2. 引入新的机器,增加supervisor物理节点,看下是否可以解决问题。

增加物理节点

除了按照常规步骤安装部署以外,启动nimbus和supervisor的时候,需要指定一下hostname的参数,防止出现其他supervisor的机器找不到nimbus主机的问题。

以在10.43.4.153和10.43.4.151上启动两个supervisor,在10.43.4.153上启动nimbus为例

nohup /usr/local/apache-storm-1.2.3/bin/storm nimbus -c storm.local.hostname="10.43.4.153" &

nohup /usr/local/apache-storm-1.2.3/bin/storm supervisor -c storm.local.hostname="10.43.4.153" &

nohup /usr/local/apache-storm-1.2.3/bin/storm supervisor -c storm.local.hostname="10.43.4.151" &

成功部署后,如图所示

工作日记-storm集群业务崩溃和解决方案第1张

部署常见问题:https://www.iteye.com/blog/wangmengbk-2215140

damentools工具部署使用

安装部署

  1. 创建 /package

    mkdir -p /package
    chmod 1755 /package
    cd /package
    
  2. 下载 daemontools-0.76.tar.gz/package

      gunzip daemontools-0.76.tar
      tar -xpf daemontools-0.76.tar
      rm -f daemontools-0.76.tar
      cd admin/daemontools-0.76
    
  3. 编辑 src/conf-cc 在最后加入

    -include /usr/include/errno.h
    
  4. 编译

    package/install
    
  5. 启动

    首先在"/etc/init"目录下创建一个svscan.conf文件 ,然后在文件中添加如下内容保存:

    start on runlevel [345]
    respawn
    exec /command/svscanboot
    

    其次分别执行如下两个命令重新加载"/etc/init"目录下的配置文件,执行ps命令查看是否启动成功

    [root@rfidweb init]# initctl reload-configuration
    [root@rfidweb init]# initctl start svscan
    svscan start/running, process 32735
    [root@rfidweb init]# ps -ef | grep svs
    root     32735     1  0 13:56 ?        00:00:00 /bin/sh /command/svscanboot
    root     32737 32735  0 13:56 ?        00:00:00 svscan /service
    root     32758  8815  0 13:56 pts/0    00:00:00 grep svs
    
    
  6. 编写脚本

    #! /bin/bash
    mkdir -p /service/storm/nimbus
    touch /service/storm/nimbus/run
    chmod +x /service/storm/nimbus/run
    
    mkdir -p /service/storm/ui
    touch /service/storm/ui/run
    chmod +x /service/storm/ui/run
    
    
    mkdir -p /service/storm/supervisor
    touch /service/storm/supervisor/run
    chmod +x /service/storm/supervisor/run
    

    添加内容:

    #! /bin/bash
    
    exec 2>&1
    exec /usr/local/apache-storm-1.2.3/bin/storm ui
    
    #! /bin/bash
    
    exec 2>&1
    exec /usr/local/apache-storm-1.2.3/bin/storm nimbus -c storm.local.hostname="10.43.4.153"
    
    
  7. 验证是否生效

    ps -ef | grep "nimbus"

    然后kill -9

    再次ps命令查看pid已经改变

免责声明:文章转载自《工作日记-storm集群业务崩溃和解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇3Dslicer_MarkupsModuleJquery 飘窗下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【转载】Apache Storm 官方文档 —— 基础概念

【转载自https://yq.aliyun.com/articles/87510?t=t1】 Storm 系统中包含以下几个基本概念: 拓扑(Topologies) 流(Streams) 数据源(Spouts) 数据流处理组件(Bolts) 数据流分组(Stream groupings) 可靠性(Reliability) 任务(Tasks) 工作进程(W...

k8s zookeeper安装(集群版与非集群版)

集群版zookeeper安装 第一步:添加helm镜像源 helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator 第二步:下载Zookeeper helm fetch incubator/zookeeper 第三步:修改 ... persiste...

【原】storm源码之storm代码结构【译】

说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于Storm进行源码级学习和研究的朋友有所帮助。 Storm的源码共分为三个不同的层次。 首先,Storm在设计之初就考虑到了兼容多语言开发。Nimbus是一个thrift服务,topologies被定义...

Storm实战:在云上搭建大规模实时数据流处理系统(Storm+Kafka)

在大数据时代,数据规模变得越来越大。由于数据的增长速度和非结构化的特性,常用的软硬件工具已无法在用户可容忍的时间内对数据进行采集、管理和处理。本文主要介绍如何在阿里云上使用Kafka和Storm搭建大规模消息分发和实时数据流处理系统,以及这个过程中主要遭遇的一些挑战。实践主要立足建立一套汽车状态实时监控系统,可以在阿里云上立即进行部署。   实时大数据处理...

阿里的STORM——JSTORM

看介绍文档貌似挺好:https://github.com/alibaba/jstorm 阿里拥有自己的实时计算引擎 类似于hadoop 中的MR 开源storm响应太慢 开源社区的速度完全跟不上Ali的需求 降低未来运维成本 提供更多技术支持,加快内部业务响应速度 现有Storm无法满足一些需求 现有...

实时计算,流数据处理系统简介与简单分析

转自:http://www.csdn.net/article/2014-06-12/2820196-Storm 摘要:实时计算一般都是针对海量数据进行的,一般要求为秒级。实时计算主要分为两块:数据的实时入库、数据的实时计算。今天这篇文章详细介绍了实时计算,流数据处理系统简介与简单分析。 编者按:互联网领域的实时计算一般都是针对海量数据进行的,除了像非实时...