作者:Jack47

转载请保留作者和原文出处

欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源

本文是Storm系列之一,主要介绍Storm的架构设计,推荐读者在阅读Storm介绍(一)的基础之上,阅读这一篇。本文只是作者的读书笔记,偏重于浅层次的架构介绍,如果想真正理解内部设计时候的权衡,还需要更多的去阅读Storm源码。

理解Storm的架构,有助于帮助我们理解大型分布式系统设计中需要解决的问题,以及解决问题的思路,帮助我们更好的进行Storm性能调优化。

架构#

先上一张Storm的架构图,如果熟悉 GFS和Hadoop的架构,会发现这些系统的架构图都很类似。

Storm架构图

各节点的作用##

如果你熟悉Hadoop的话,可以这样做一下类比:

Hadoop | Storm | 在Storm中发挥的作用|

----------|-------

JobTracker|Nimbus(只有一个)|

  • 在集群中分发代码
  • 给Slave机器/supervisor分配任务
  • 失败检测(failure monitoring)
  • 快速失败(fail fast),无状态的(可以kill -9)

TaskTracker|Supervisor(有很多个)|

  • 监听分配到自己所在机器的工作
  • 根据Nimbus的指示来起停worker进程
  • 快速失败,无状态的(可以kill -9)

MapReduce任务 | Topology |

  • 一直处理消息(直到你kill它)
  • 一个运行中的拓扑包含分散在很多机器上运行的多个worker进程

可以看到Nimbus是调度器,WorkerTask的容器,Task是任务的真正执行者。

启动拓扑

为了在集群上启动一个拓扑,需要首先把代码打包成一个“胖jar包”--必须包含所有的依赖代码,除了Storm它自身,因为Storm集群会提供。然后在一台安装了storm命令行的机器上通过storm jar命令来提交拓扑:

storm jar my-topology-version-with-dependency.jar com.corp.MyTopology arg1 arg2

这个命令会连到Nimbus,上传jar包。接下来Nimbus会把拓扑的代码运送到多台不同的机器或者JVM上。只有当拓扑在机器上部署成功了并且在JVM中初始化了之后,才能真正开始处理消息。

Master结点(Master node)

在分布式系统中,调度服务非常重要,它的设计,会直接关系到系统的运行效率,错误恢复(fail over),故障检测(error detection)和水平扩展(scale)的能力。

集群上任务(task)的调度由一个Master节点来负责。这台机器上运行的Nimbus进程负责任务的调度。另外一个进程是Storm UI,可以界面上查看集群和所有的拓扑的运行状态。

从节点(Slave node)

Storm集群上有多个从节点,他们从Nimbus上下载拓扑的代码,然后去真正执行。Slave上的Supervisor进程是用来监督和管理实际运行业务代码的进程。在Storm 0.9之后,又多了一个进程Logviewer,可以用Storm UI来查看Slave节点上的log文件。

在配置文件storm.yaml中,决定了一台机器上运行几个worker:

supervisor.slots.ports:
- 6700
- 6701
- 6702

ZooKeeper的作用

ZooKeeper在Storm上不是用来做消息传输用的,而是用来提供协调服务(coordination service),同时存储拓扑的状态和统计数据。

  • ZooKeeper相当于一块黑板,SupervisorNimbus和worker都在上面留下约定好的信息。例如Supervisor启动时,会在ZooKeeper上注册,Nimbus就可以发现SupervisorSupervisor在ZooKeeper上留下心跳信息,Nimbus通过这些心跳信息来对Supervisor进行健康检测,检测出坏节点
  • 由于Storm组件(component)的状态信息存储在ZooKeeper上,所以Storm组件就可以无状态,可以 kill -9来杀死
    • 例如:Supervisors/Nimbus的重启不影响正在运行中的拓扑,因为状态都在ZooKeeper上,从ZooKeeper上重新加载一下就好了
  • 用来做心跳
    • Worker通过ZooKeeper把孩子executor的情况以心跳的形式汇报给Nimbus
    • Supervisor进程通过ZK把自己的状态也以心跳的形式汇报给Nimbua
  • 存储最近任务的错误情况(拓扑停止时会删除)

Storm的容错(Fault Tolerance)机制#

正如“搭建一个Storm集群”一文介绍的一样,必须用工具如daemontools或者monit来监控Nimbus和Supervisor的后台进程。这样如果Nimbus或者Supervisor进程挂掉,会被daemontools检测到,并进行重启。

NimbusSupervisor进程被设计成快速失败(fail fast)的(当遇到异常的情况,进程就会挂掉)并且是无状态的(状态都保存在Zookeeper或者在磁盘上)。

最重要的是,worker进程不会因为Nimbus或者Supervisor挂掉而受影响。这跟Hadoop是不一样的,当JobTracker挂掉,所有的任务都会没了。

  1. 当Nimbus挂掉会怎样?

    如果Nimbus是以推荐的方式处于进程监管(例如通过supervisord)之下,那它会被重启,不会有任何影响

    否则当Nimbus挂掉后:

    • 已经存在的拓扑可以继续正常运行,但是不能提交新拓扑
    • 正在运行的worker进程仍然可以继续工作。而且当worker挂掉,supervisor会一直重启worker。
    • 失败的任务不会被分配到其他机器(是Nimbus的职责)上了
  2. 当一个Supervisor(slave节点)挂掉会怎样?

    如果Supervisor是以推荐的方式处于进程监管(例如通过(supervisord)[supervisord.org/])之下,那它会被重启,不会有任何影响

    否则当Supervisor挂掉: 分配到这台机器的所有任务(task)会超时,Nimbus会把这些任务(task)重新分配给其他机器。

  3. 当一个worker挂掉会怎么样?

    当一个worker挂掉,supervisor会重启它。如果启动一直失败那么此时worker也就不能和Nimbus保持心跳了,Nimbus会重新分配worker到其他机器

  4. Nimbus算是一个单点故障吗?

    如果Nimbus节点挂掉,worker进程仍然可以继续工作。而且当worker挂掉,supervisor会一直重启worker。但是,没有了Nimbus,当需要的时候(如果worker机器挂掉了)worker就不能被重新分配到其他机器了。

    所以答案是,Nimbus在“某种程度”上属于单点故障的。在实际中,这种情况没什么大不了的,因为当Nimbus进程挂掉,不会有灾难性的事情发生

硬件要求##

ZooKeeper###

  1. 推荐精心设计过的机器,因为ZooKeeper是Storm的瓶颈

    • 每个机器使用一个ZK的实例
    • 注意因为同一台机器上的其他进程或者虚拟机他们是共享这台机器的,所以可能会影响ZK的性能(来源)
  2. I/O是ZooKeeper的瓶颈
  • 把ZooKeeper的存储放到自己的磁盘上
  • 使用SSD会显著提升性能
  • 正常情况下,Zookeeper的每次写操作都会同步到磁盘,这就导致了两次磁盘寻址操作(一次是数据,一次是数据的日志)。当所有的worker都发心跳给ZooKeeper时,可能会显著影响性能(来源)。
    • 需要监控ZooKeeper节点的I/O负载
  1. 推荐在生产环境上运行的ZooKooper集群有至少3个节点,这样即使有一个ZooKeeper服务器挂掉了(例如进行维护),也是可以的。

Storm安全性

原始设计Storm时,完全没有把安全性考虑在内

现在安全性能相关的功能在一步步加进来

Storm 0.9.x版本上的安全问题:

  1. 没有验证机制(authentication),没有授权机制(authorization)
  2. 传输的数据(例如worker之间)没有加密
  3. ZooKeeper上存储的数据没有访问限制
  4. 如果Nimbus的Thrift端口没有锁住,任意的用户代码都可以在节点上执行

更多Storm安全性方面的建议见这里

题外话:

在接触Storm之后,有个问题在我的脑海里升起,国内的大公司,比如Baidu,Ali,腾讯,都是有诞生Storm这类实时计算框架的土壤的,可是为什么没有做出来呢?

Apache Storm Basic Training

Fault tolerance

Storm in pictures

Storm 0.9 Basic Training


如果您看了本篇博客,觉得对您有所收获,请点击右下角的“推荐”,让更多人看到!

资助Jack47写作,打赏一个鸡蛋灌饼钱吧
微信打赏
支付宝打赏

Storm介绍(二)的更多相关文章

  1. storm介绍,核心组件,编程模型

    一.流式计算概念 利用分布式的思想和方法,对海量“流”式数据进行实时处理,源自业务对海量数据,在“时效”的价值上的挖掘诉求,随着大数据场景应用场景的增长,对流式计算的需求愈发增多,流式计算的一般架构图 ...

  2. Storm系列二: Storm拓扑设计

    Storm系列二: Storm拓扑设计 在本篇中,我们就来根据一个案例,看看如何去设计一个拓扑, 如何分解问题以适应Storm架构,同时对Storm拓扑内部的并行机制会有一个基本的了解. 本章代码都在 ...

  3. Storm介绍及与Spark Streaming对比

    Storm介绍 Storm是由Twitter开源的分布式.高容错的实时处理系统,它的出现令持续不断的流计算变得容易,弥补了Hadoop批处理所不能满足的实时要求.Storm常用于在实时分析.在线机器学 ...

  4. Lucene.Net 2.3.1开发介绍 —— 二、分词(六)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(六) Lucene.Net的上一个版本是2.1,而在2.3.1版本中才引入了Next(Token)方法重载,而ReusableStrin ...

  5. Lucene.Net 2.3.1开发介绍 —— 二、分词(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(五) 2.1.3 二元分词 上一节通过变换查询表达式满足了需求,但是在实际应用中,如果那样查询,会出现另外一个问题,因为,那样搜索,是只 ...

  6. Lucene.Net 2.3.1开发介绍 —— 二、分词(三)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(三) 1.3 分词器结构 1.3.1 分词器整体结构 从1.2节的分析,终于做到了管中窥豹,现在在Lucene.Net项目中添加一个类关 ...

  7. Lucene.Net 2.3.1开发介绍 —— 二、分词(四)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(四) 2.1.2 可以使用的内置分词 简单的分词方式并不能满足需求.前文说过Lucene.Net内置分词中StandardAnalyze ...

  8. Lucene.Net 2.3.1开发介绍 —— 二、分词(二)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(二) 1.2.分词的过程 1.2.1.分词器工作的过程 内置的分词器效果都不好,那怎么办?只能自己写了!在写之前当然是要先看看内置的分词 ...

  9. Lucene.Net 2.3.1开发介绍 —— 二、分词(一)

    原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(一) Lucene.Net中,分词是核心库之一,当然,也可以将它独立出来.目前Lucene.Net的分词库很不完善,实际应用价值不高.唯 ...

随机推荐

  1. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  2. 细说前端自动化打包工具--webpack

    背景 记得2004年的时候,互联网开发就是做网页,那时也没有前端和后端的区分,有时一个网站就是一些纯静态的html,通过链接组织在一起.用过Dreamweaver的都知道,做网页就像用word编辑文档 ...

  3. Socket聊天程序——服务端

    写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...

  4. .Net Core MVC 网站开发(Ninesky) 2.2、栏目管理功能-System区域添加

    在asp或asp.net中为了方便网站的结构清晰,通常把具有类似功能的页面放到一个文件夹中,用户管理功能都放在Admin文件夹下,用户功能都放在Member文件夹下,在MVC中,通常使用区域(Area ...

  5. 从零开始编写自己的C#框架(24)——测试

    导航 1.前言 2.不堪回首的开发往事 3.测试推动开发的成长——将Bug消灭在自测中 4.关于软件测试 5.制定测试计划 6.编写测试用例 7.执行测试用例 8.发现并提交Bug 9.开发人员修复B ...

  6. C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程

    前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这 ...

  7. Visual Studio Code——Angular2 Hello World 之 2.0

    最近看到一篇用Visual Studio Code开发Angular2的文章,也是一篇入门教程,地址为:使用Visual Studio Code開發Angular 2專案.这里按部就班的做了一遍,感觉 ...

  8. Linux LVM逻辑卷配置过程详解

    许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份.删除相关数据,甚至被迫重新规划分区并重装操作系统,以 ...

  9. Centos6.5 配置Nginx开机自启动

    1.在/etc/init.d/目录下创建 nginx 文件,内容如下: #!/bin/sh # # nginx - this script starts and stops the nginx dae ...

  10. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...