node服务的监控预警系统架构

需求背景

目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作。不同于个人开发的简单服务器,企业级的node服务要求更为苛刻:

高稳定性、高可靠性、鲁棒性以及直观的监控和报警

想象下一个存在安全隐患且没有监控预警系统的node服务在生产环境下运行的场景,当某个node实例挂掉的情况下,运维人员或者对应开发维护人员无法立即知晓,直到客户或者测试人员报告bugs才开始解决问题。在这段无人处理的时间内,损失的订单数和用户的忠诚度和信任度将是以后无法弥补的,因此对于node程序的业务开发者而言,这就要求代码严谨、异常处理完备;对于node框架的维护者而言,则需要提供完善的监控预警系统

功能

当一个服务进程在后端运行时(daemon),作为开发者我们关注的信息主要有以下几点:

  • 服务进程是否正在运行,isalive
  • 服务进程的内存使用率,是否存在未回收(释放)的内存
  • 服务进程的cpu使用率,在计算量大的情况下是否需要分片处理、延时处理
  • 服务进程的实时响应时间和吞吐量

而作为一个运维人员,关注的不仅仅是node服务进程的相关信息,还包括物理主机的使用状况:

  • 物理硬盘所剩存储空间
  • 内存、cpu使用率
  • 网络接入是否正常

可以看出,不管是针对主机还是进程进行监控,我们的关注点大多数是资源使用率和业务量处理能力,因此我们的监控预警系统也着重实现这些功能。

系统简易架构

目前生产环境下的node服务大多采用多进程或者cluster模式,而且为了响应突发流量往往采用多机部署,因此监控和预警的目标实体就是多物理(虚拟)机下的多个子进程

比如,目前node服务在单机上往往采用1+n的进程模型:所谓1,即1个主进程;n,表示n个工作进程,而且这些工作进程是从主进程上fork出来,同时根据经验,n的值往往等同于主机的cpu核心数,充分利用其并行能力。那么,采用该种进程模型的node服务部署在线上4台物理机上,我们需要监控的则是4xn个进程,这涉及到了分布式数据同步的问题,需要寻找一种方法实现高效、准确和简易的数据存和读,并且尽可能的保证这些数据的可靠性。

在这里,笔者采用了分布式数据一致系统ZooKeeper(下文简写为ZK)实现数据的存和读。之所以没有采用传统的数据库是由于读写表的性能,如为了防止多个进程同时写表造成冲突必须进行锁表等操作,而且读写硬盘的性能相对内存读写较低;之所以没有采用IPC+事件机制实现多进程通信,主要是由于node提供的IPC通信机制仅限于父子进程,对于不同主机的进程无法进行通信或者实现复杂度较高,因此也并未采用该种方式。

采用ZK来实现多节点下的数据同步,可在保证集群可靠性的基础上达到数据的最终一致性,对于监控系统而言,不需要时刻都精确的数据,因此数据的最终一致性完全满足系统的需求。ZK服务集群通过paxos算法实现选举,并采用ZK独特的算法实现数据在各个集群节点的同步,最终抽象为一个数据层。这样ZK客户端就可以通过访问ZK集群的任意一个服务节点获取或读写相同的数据,用通俗的语言来形容,就是ZK客户端看到的所有ZK服务节点都有相同的数据。

另外,ZK提供了一种临时节点,即ephemeral。该节点与客户端的会话session相绑定,一旦会话超时或者连接断开,该节点就会消失,并触发对应事件,因此利用该种特性可以设置node服务的isalive(是否存活)功能。不过,目前node社区针对ZK的客户端还不是很完善(主要是文档),笔者采用node-zookeeper-client模块并且针对所有接口promise化,这样在进行多级znode开发时更可读。

建议架构图
上图是笔者设计的监控预警系统的架构图,这里需要着重关注一下几点:

  • ZooKeeper部署与znode节点使用
  • 单机内部node进程的进程模型:1+n+1
  • precaution进程的工作内容以及与master和worker的通信方式

下面着重详述以上几点。

ZooKeeper部署与编码细节

上节已提到,ZooKeeper抽象为一个数据一致层,它是由多个节点组成的存储集群,因此在具体的线上环境下,ZK集群是由多个线上主机搭建而成,所有的数据都是存储在内存中,每当对应工作进程的数据发生变化时则修改对应znode节点的数据,在具体实现中每个znode节点存储的是json数据,便于node端直接解析。

在具体的代码中,我们需要注意的是ZK客户端会话超时和网络断开重连的问题。默认,ZK客户端会帮助我们完成网络断开后重连过程的建立,而且在重新连接的过程中会携带上次断开连接的session id,这样在session未超时的前提下仍会绑定之前的数据;但是当session超时的情况下,对应session id的数据将会被清空,这就需要我们的自己处理这种情况,又称作现场恢复。其实,在监控系统中,由于需要实时查询对应节点数据,需要始终保持session,在设定session expire时间的情况下终究会出现ZK客户端会话超时的情况,因此需要我们实现现场恢复,需要注意。

进程模型

大多数开发者为了提高node程序的并行处理能力,往往采用一个主进程+多个工作进程的方式处理请求,这在不需要监控预警系统的前提下是可以满足要求的。但是,随着监控预警功能的加入,有很多人估计会把这些功能加入到主进程,这首先不说主进程工作职能的混乱,最主要的是额外增加了风险性(预警系统的职能之一就是打点堆快照,并提醒开发者。因此主进程内执行查询、打点系统资源、发送邮件等工作存在可能的风险)。因此为了主进程的功能单一性和可靠性,创建了一个precaution进程,该进程与主进程同级。

采用1+n+1模型并不会影响请求处理效率,工作进程的职能仍是处理请求,因此新的进程模型完全兼容之前的代码,需要做的就是在主进程和precaution进程执行的代码中添加业务部分代码。

通信方式

在监控预警系统中,需要实现precaution进程<-->master进程、master进程<-->worker进程、precaution进程<-->worker进程的双向通信,如打点内存,需要由precaution进程通知对应worker进程,worker进行打点完成后发送消息给precaution进程,precaution进行处理后发送邮件通知。

首先,worker与master的通信走的是node提供的IPC通道,需要注意的是IPC通道只能传输字符串和可结构化的对象。可结构化的对象可以用一个公式简易表述:

o = JSON.parse(JSON.stringify(o))

如RegExp的实例就不是可结构化对象。

其次,worker和precaution的通信是通过master作为桥梁实现的,因此其中的关节点就在于precaution与master的通信。

最后,precaution与master的通信采用domain socket机制实现,这两个进程是只是两个node实例而已,因此无法采用node提供的IPC机制,而进程间通信可以采用其他方法如:命名管道、共享内存、信号量和消息队列等,采用这些方法实现固然简单,但是缺点在于两个进程耦合度相对较高,如命名管道需要创建具体的管道文件并且对管道文件大小有限制。使用domain socket,最大的好处就是灵活制定通信协议,且易于扩展。

node的net模块提供了domain socket的通信方式,与网络服务器类似,采用domain通信的服务器侦听的不是端口而是sock文件,采用这种方式实现全双工通信。

业务量计算和数据打点

这里提到的业务量,指的是监控预警系统所关注的数据业务,如内存和cpu利用率、吞吐量(request per minute)和响应时间。其中,内存和cpu利用率可以通过linux下的相关命令如top来查询,响应时间和吞吐量则通过koa中间件实现粗略统计。不过为了方便开发者把精力集中到业务上去而非兼容底层操作系统,建议使用pidusage模块完成资源利用率的测量,而针对吞吐量笔者并未找到相关的工具进行测量,仅在中间件中粗略计算得出。

在precaution进程中,设置了两个阈值。一个是warning值,当使用内存大小超过了该值则进行日志打点,并开始周期性的node堆内存打点;另一个是danger值,超过该值则进行内存打点并发送邮件提醒,根据附件中的近三个快照分析内存。

总结

采用上述监控预警架构,可以有效的实现多节点下多进程的监控,在确保进程可靠性的基础上完成侵入性较小的、安全性较高的、可扩展性强的实现。以后不管是临时扩张主机节点还是更改子进程数量,都可以瞬时在UI界面上直观体现,如节点监控图

转载于:https://www.cnblogs.com/accordion/p/6247356.html

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

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

相关文章

oracle中or会使索引,为何查询条件中多了 OR 选项,索引就走全扫描?

ORACLE 11204, SOLARIS如下&#xff1a;原始写法&#xff0c;where 条件中&#xff0c;有 OR 条件&#xff0c;这时&#xff0c;索引 IDX_BD_LOTMASTER_NO 走全索引扫描&#xff0c;导致效率非常低&#xff0c;-bash-3.2$ sqlplusSQL*Plus: Release 11.2.0.4.0 Production on…

C# 热敏打印机 Socket 网络链接 打印 图片 (二)

1 IPAddress ip IPAddress.Parse("192.168.1.212"); 2 IPEndPoint iport new IPEndPoint(ip, 9100);//9100为小票打印机指定端口 3 Socket soc new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 4 …

oracle自动内存管理要不要开,Oracle 11g的自动内存管理

Oracle 的 9i/10g 中已经对内存管理逐步做了很大的简化&#xff0c;11g 则更进一步&#xff0c;引入了一个新的概念自动化内存管理(Automatic Memory Management,AMM) . 如果 DBA 真的想偷懒的话&#xff0c;只需要设定两个参数就可以把烦心的事情都交给 Oracle 折腾了(只要 DB…

jaxb util_JAXB自定义绑定– Java.util.Date / Spring 3序列化

jaxb utilJaxB可以处理Java.util.Date序列化&#xff0c;但是需要以下格式&#xff1a; “ yyyy-MM-ddTHH&#xff1a;mm&#xff1a;ss ”。 如果需要将日期对象格式化为另一种格式怎么办&#xff1f; 我有同样的问题时&#xff0c;我正在同春MVC 3和Jackson JSON处理器 &…

いちがつ(2017/1)

org.apache.ibatis.builder.IncompleteElementException: Could not find parameter map com.enjoyor.soa.traffic.core.tms.mapper.MarkingInfoMapper.Map mybatis的xml配置文件中没有配置parameter map。 要么配置parameter map 要么将select,add等属性中的parameter map 改…

oracle数据库没有选项,创建oracle数据库时,出现ORA-00922: 选项缺失或无效

sdd53HOME新建oracle数据库时遇到ORA-00922: 选项缺失或无效的问题&#xff0c;如图&#xff1a;原因&#xff1a;一般是语句的语法有问题。比如命名不对&#xff0c;关键字写错等等。对于非标准的命名&#xff0c;一般采用双引号来创建。具体原因&#xff1a;就是开始的用户密…

set和enum类型的用法和区别

mysql中的set和enum类型的用法和区别 mysql中的enum和set其实都是string类型的而且只能在指定的集合里取值, 不同的是set可以取多个值,enum只能取一个值。 12345678910111213[php] CREATE TABLE 20121101_t ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(20) N…

Java EE 8 MVC:使用查询参数

在上一篇有关新Java EE MVC框架的文章中&#xff0c;我们详细介绍了Controllers 。 在本篇和以下文章中&#xff0c;我们将看到如何在MVC控制器中访问各种类型的请求数据。 Java EE MVC大量使用了JAX-RS&#xff0c;我们将在本篇和下一篇文章中看到的大多数内容都是JAX-RS的功…

oracle 10g r2 for solaris x86,Oracle10g for Solaris9(x86)安装指南

Oracle10g for Solaris9(x86)安装指南一、安装环境检查&#xff1a;机器环境&#xff1a;cpu:P41.7G&#xff0c;内存:1G&#xff1b;OS&#xff1a;Windows 2000 Advaced Server(sp4)虚拟机系统平台&#xff1a;Vmware Workstation4.5.2Solaris9(x86)虚拟机资源分配&#xff1…

百度脑图

1.地址&#xff1a;http://naotu.baidu.com/ 2.简介&#xff1a;在线创作思维导图。 3.优势&#xff1a; 3.1在线使用&#xff0c;学习成本低。 3.2有多种导图展示方式。 4.缺点&#xff1a; 4.1只有思维导图一种形式比较单一转载于:https://www.cnblogs.com/hmdlys/p/6252071.…

oracle 导出 cuow,直通伍伦贡大学的升学保障— 伍伦贡大学学院(UOWC)

伍伦贡大学学院是直属大学的桥梁课程提供者&#xff0c;为没有达到直入本科的学生提供另一种进入大学的途径&#xff0c;也为大学提供语言类课程。自1989年成立以来&#xff0c;为大学输送了数以千计的优秀学生。目前学院有来自世界30多个国家超过2000名在校生。在伍伦贡大学学…

async 和 await 的进阶

异常的捕获&#xff1a; static void Main(string[] args){//继续我们的异步编程的使用嘀呀&#xff1b;//关于主线程是无法捕获我们子线程中的异常滴滴啊&#xff1b;var t DoExceptionAsync();t.Wait();Console.WriteLine($"{nameof(t.Status)}: {t.Status}"); …

spring依赖注入_Spring3:类型安全依赖项注入

spring依赖注入在从Spring跳到类型安全依赖注入之前&#xff0c;我想讨论一下我们之前所做的方式。 我们一直在借助Spring的Autowired注释按类型使用依赖项注入。 像这样的东西会注入Spring Bean。 Autowired private StudentDao studentDao; // Autowires by type. Injects th…

linux系统查看当前安装字库,linux下怎样安装中文字体?

1、首先禁用xfs服务器。 运行Setup命令&#xff0c;在服务项中中止xfs随系统运行的特性。之所以禁用xfs服务器主要是因为xfs会自动更新字体目录下的fonts.dir文件&#xff0c;从而影响我们所做的修改。2、将选中的字体字库拷贝到相关的目录。 一般选用simsun.ttf为基本的字体(据…

Spark Shell的简单使用

简介 Spark shell是一个特别适合快速开发Spark原型程序的工具&#xff0c;可以帮助我们熟悉Scala语言。即使你对Scala不熟悉&#xff0c;仍然可以使用这个工具。Spark shell使得用户可以和Spark集群交互&#xff0c;提交查询&#xff0c;这便于调试&#xff0c;也便于初学者使用…

linux vps 命令,CentOS最常用Linux vps操作命令整理大全

vps用的centos系统&#xff0c;为了方便查看整理了一些Linux常用命令&#xff1b;忘记的时候翻出来看看&#xff0c;不用二次浪费时间东找西找浪费时间&#xff1b;文件和目录:# cd /home 进入 ‘/home’ 目录# cd .. 返回上一级目录# cd ../.. 返回上两级目录# cd – 返回上次…

Java的20年:重大事件的时间表

翻译自: https://www.javacodegeeks.com/2015/12/2-decades-java-timeline-notable-events.html

w10系统自带linux系统,win10下,内置linux系统的安装和体验,你造吗?

原标题&#xff1a;win10下&#xff0c;内置linux系统的安装和体验&#xff0c;你造吗&#xff1f;众所周知&#xff0c;windows系统和linux系统一直是水火不容&#xff0c;而在最新的win10系统却完美兼容了linux系统&#xff0c;但是在默认情况下是关闭的&#xff0c;需要我们…

北风网09.接收普通消息2

该公众号暂时无法提供服务,请稍后再试 转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/6273960.html

中科软测试面试题2019_2019国考成绩今日是否会发布,笔试120能进面不?

2019国考成绩要出来了不&#xff1f;2019国考成绩何时出来&#xff1f;现在已是1月中旬&#xff0c;许多考生对于自己的国考笔试成绩都非常期待&#xff0c;而最近风声四起&#xff0c;搞得考生们人心慌慌&#xff0c;那么2019国考成绩要出来了不&#xff1f;现在我们一起来分析…