| Subcribe via RSS

[转载]大型网站运维探讨和心得

11月 6th, 2008 | 1 Comment | Posted in 系统监控, 网站架构, 读书笔记, 集中存储 < by Michael Field >

看到一篇不错的心得体会;相信我们做技术的都会有或多或少的担忧自己的未来职业发展:

今天看到一篇心得体会,转过来和大家一起探讨一下:

一、什么是大型网站运维?
首先明确一下,全文所讲的”运维“是指:大型网站运维,与其它运维的区别还是蛮大的;然后我们再对大型网站与小型网站进行范围定义,此定义主要从运维复杂性角度考虑,如网站规范、知名度、服务器量级、pv量等考虑,其它因素不是重点;因此,我们先定义服务器规模大于1000台,pv每天至少上亿(至少国内排名前10),如sina、baidu、QQ,51.com等等;其它小型网站可能没有真正意义上的运维工程师,这与网站规范不够和成本因素有关,更多的是集合网络、系统、开发工作于一身的“复合性人才”,就如有些公司把一些合同采购都纳入了运维职责范围,还有如IDC网络规划也纳入运维职责。所以,非常重要一定需要明白:运维对其它关联工种必须非常了解熟悉:网络、系统、系统开发、存储,安全,DB等;我在这里所讲的运维工程师就是指专职运维工程师。
我们再来说说一般产品的“出生”流程:
1、首先公司管理层给出指导思想,PM定位市场需求(或copy成熟应用)进行调研、分析、最终给出详细设计。
2、架构师根据产品设计的需求,如pv大小预估、服务器规模、应用架构等因素完成网络规划,架构设计等(基本上对网络变动不大,除非大项目)
3、开发工程师将设计code实现出来、测试工程师对应用进行测试。
4、好,到运维工程师出马了,首先明确一点不是说前三步就与运维工作无关了,恰恰相反,前三步与运维关系很大:应用的前期架构设计、软/硬件资源评估申请采购、应用设计性能隐患及评估、IDC、服务性能\安全调优、服务器系统级优化(与特定应用有关)等都需运维全程参与,并主导整个应用上线项目;运维工程师负责产品服务器上架准备工作,服务器系统安装、网络、IP、通用工具集安装。运维工程师还需要对上线的应用系统架构是否合理、是否具备可扩展性、及安全隐患等因素负责,并负责最后将产品(程序)、网络、系统三者进行拼接并最优化的组合在一起,最终完成产品上线提供用户使用,并周而复使:需求->开发(升级)->测试->上线(性能、安全问题等之前预估外的问题随之慢慢就全出来了)在这里提一点:网站开发模式与传统软件开发完全不一样,网站一天开发上线1~5个升级版本是家常便饭,用户体验为王嘛,如果某个线上问题像M$ 需要1年解决,用户早跑光了;应用上线后,运维工作才刚开始,具体工作可能包括:升级版本上线工作、服务监控、应用状态统计、日常服务状态巡检、突发故障处理、服务日常变更调整、集群管理、服务性能评估优化、数据库管理优化、随着应用PV增减进行应用架构的伸缩、安全、运维开发工作:
a 、尽量将日常机械性手工工作通过工具实现(如服务监控、应用状态统计、服务上线等等),提高效率。
b、解决现实中服务存在的问题,如高可靠性、可扩展性问题等。
c、大规模集群管理工具的开发,如1万台机器如何在1分钟内完成密码修改、或运行指定任务?2000台服务器如何快速安装操作系统?各分布式IDC、存储集群中数PT级的数据如何快速的存储、共享、分析?等一系列挑战都需运维工程师的努力。
在此说明一下其它配合工种情况,在整个项目中,前端应用对于网络/系统工程师来说是黑匣子,同时开发工程师职责只是负责完成应用的功能性开发,并对应用本身性能、安全性等应用本身负责,它不负责或关心网络/系统架构方面事宜,当然软/硬件采购人员等事业部其它同事也不会关心这些问题,各司其职,但项目的核心是运维工程师~!所有其它部门的桥梁。
上面说了很多,我想大家应该对运维有一些概念了,在此打个比方吧,如果我们是一辆高速行驶在高速公路上的汽车,那运维工程师就是司机兼维修工,这个司机不简单,有时需要在高速行驶过程中换轮胎、并根据道路情况换档位、当汽车速度越来越快,汽车本身不能满足高速度时对汽车性能调优或零件升级、高速行进中解决汽车故障及性能问题、时刻关注前方安全问题,并先知先觉的采取规避手段。这就是运维工作~!
最后说一下运维工程师的职责:”确保线上稳定“,看似简单,但实属不容易,运维工程师必须在诸多不利因素中进行权衡:新产品模式对现有架构及技术的冲击、产品高频度的升级带来的线上BUG隐患、运维自动化管理承度不高导致的人为失误、IT行业追求的高效率导致流程执行上的缺失、用户增涨带来的性能及架构上的压力、IT行业宽松的技术管理文化、创新风险、互联网安全性问题等因素,都会是网站稳定的大敌,运维工程师必须把控好这最后一关,需具体高度的责任感、原则性及协调能力,如果能做到各因素的最佳平衡,那就是一名优秀的运维工程师了。
另外在此聊点题外话,我在这里看到有很多人要sina、QQ、baidu,51.com等聊自已的运维方面的经验,其实这对于它们有点免为其难:
a、各公司自已网络架构、规模、或多或少还算是公司的核心秘密,要保密,另外,对于大家所熟知的通用软件、架构,由于很多公司会根据自已实际业务需要,同时因为原版性能、安全性、已知bug、功能等原因,进行过二次开发(如apache,php,mysql),操作系统内核也会根据不同业务类型进行定制的,如某些应用属于运算型、某些是高IO型、或大存储大内存型。根据这些特点进行内核优化定制,如sina就在memcache上进行过二次开发,搞出了一个MemcacheDB,具体做得如何我们不谈,但开源了,是值得称赞的,国内公司对于开源基本上是索取,没有贡献;另外,服务器也不是大家所熟知的型号,根据业务特点,大部份都是找DELL/HP/ibm进行过定制;另外,在分布式储存方面都有自已解决方案,要不就是使用现成开源hadoop等解决方案,或自已开发。但90%都是借鉴google GFS的思想:分布式存储、计算、大表。
b、各公司业务方向不一样,会导致运维模式或方法都不一样,如51.com和baidu运维肯定区别很大,因为他们业务模式决定了其架构、服务器量级、IDC分布、网络结构、通用技术都会不一样,主打新闻门户的sina与主打sns的51.com运维模式差异就非常大,甚至职责都不大一样;但有一点,通用技术及大致架构上都大同小异,大家不要太神化,更多的公司只是玩垒积木的游戏罢了,没什么技术含量。
c、如上面所讲,目前大型网站运维还处于幼年时期理念和经验都比较零散,没有成熟的知识体系,可能具体什么是运维,大家都要先思索一番,或压根没想过,真正讨论也只是运维工作的冰山一角,局限于具体技术细节,或某某著名网站大的框架,真正运维体系化东西没有,这也许是目前网上运维相关资料比较少的原故吧。或者也是国内运维人员比较难招,比较牛的运维工程师比较少见的原因之一吧。

二、运维工作师需要什么样的技能及素质
做为一名运维工程师需要什么样的技能及素质呢,首先说说技能吧,如大家上面所看到,运维是一个集多IT工种技能与一身的岗位,对系统->网络->存储->协议->需求->开发->测试->安全等各环节都需要了解一些,但对于某些环节需熟悉甚至精通,如系统(基本操作系统的熟悉使用,*nix,windows..)、协议、系统开发(日常很重要的工作是自动运维化相关开发、大规模集群工具开发、管理)、通用应用(如lvs、ha、web server、db、中间件、存储等)、网络,IDC拓朴架构;
技能方面总结以下几点:
1、开发能力,这点非常重要,因为运维工具都需要自已开发,开发语言:c/c++(必备其中之一)、perl、python、php(其中之一)、shell(awk,sed,expect….等),需要有过实际开发经验,否则工作会非常痛苦。
2、通用应用方面需要了解:操作系统(目前国内主要是linux、bsd)、webserver相关(nginx,apahe,php,lighttpd,java。。。)、数据库(mysql,oralce)、其它杂七八拉的东东。。。系统优化,高可靠性。。。这些只是加分项,不需必备,可以边工作边慢慢学,这些东西都不难。当然在运维中,有些是有分工偏重点不一样。
3、系统、网络、安全,存储,CDN,DB等需要相当了解,知道其相关原理。
个人素质方面:
1、 沟通能力、团队协作:运维工作跨部门、跨工种工作很多,需善于沟通、并且团队协作能力要强;这应该是现代企业的基本素质要求了,不多说。
2、工作中需胆大心细:胆大才能创新、不走寻常路,特别对于运维这种新的工种,更需创新才能促进发展;心细,运维工程师是网站admin,最高线上权限者,一不小心就会遗憾终生或打入十八层地狱。
3、主动性、执行力、精力旺盛、抗压能力强:由于IT行业的特性,变化快;往往计划赶不上变化,运维工作就更突出了,比如国内各大公司服务器往往是全国各地,哪里便宜性价比高,就那往搬,进行大规模服务迁移(牵扯的服务器成百上千台),这是一个非常头痛的问题;往往时间非常紧迫,如限1周内完成,这种情况下,运维工程师的主动性及执行力就有很高的要求了:计划、方案、服务无缝迁移、机器搬迁上架、环境准备、安全评估、性能评估、基建、各关联部门扯皮,7X24小紧急事故响应等。
4、其它就是一些基本素质了:头脑要灵光、逻辑思维能力强、为人谦虚稳重、亲和力、乐于助人、有大局观。
5、最后一点,做网站运维需要有探索创新精神,通过创新型思维解决现实中的问题,因为这是一个处于幼年的职业(国外也一样,但比国内起步早点),没有成熟体系或方法论可以借鉴,只能靠大家自已摸索努力。

三、怎样才算是一个合格的运维工程师
1、保证服务达到要求的线上标准,如99.9%;保证线上稳定,这是运维工程师的基本责职所在。
2、不断的提升应用的可靠性与健壮性、性能优化、安全提升;这方面非常考验主动性、和创新思维。
3、网站各层面监控、统计的覆盖度,软件、硬件、运行状态,能监控的都需要监控统计,避免监控死角、并能实时了解应用的运转情况。
4、通过创新思维解决运维效率问题;目前各公司大部份运维主要工作还是依赖人工操作干预,需要尽可能的解放双手。
5、运维知识的积累与沉淀、文档的完备性,运维是一个经验性非常强的岗位,好的经验与陷阱都需积累下来,避免重复性范错。
6、计划性和执行力;工作有计划,计划后想法设法达到目标,不找借口。
7、自动化运维;能对日常机械化工作进行提炼、设计并开发成工具、系统,能让系统自动完成的尽量依靠系统;让大家更多的时间用于思考、创新思维、做自已喜欢的事情。
以上只是技术上的一些层面,当然个人意识也是很重要的。

四、运维职业的迷惘、现状与发展前景
运维岗位不像其它岗位,如研发工程师、测试工程师等,有非常明确的职责定位及职业规划,比较有职业认同感与成就感;而运维工作可能给人的感觉是哪方面都了解一些,但又都比上专职工程师更精通、感觉平时被关注度比较低(除非线上出现故障),慢慢的大家就会迷惘,对职业发展产生困惑,为什么会有这种现象呢? 除了职业本身特点外,主要还是因为对运维了解不深入、做得不深入导致;其实这个问题其它岗位也会出现,但我发现运维更典型,更容易出现这个问题;

针对这个问题我谈一下网站运维的现状及发展前景(也在思考中,可能不太深入全面,也请大家斧正补充)

运维现状:
1、处于刚起步的初级阶段,各大公司有此专职,但重视或重要承度不高,可替代性强;小公司更多是由其它岗位来兼顾做这一块工作,没有专职,也不可能做得深入
2、技术层次比较低;主要处于技术探索、积累阶段,没有型成体系化的理念、技术。
3、体力劳动偏大;这个问题主要与第二点有关系,很多事情还是依靠人力进行,没有完成好的提练,对于大规模集群没有成熟的自动化管理方法,在此说明一下,大规模集群与运维工作是息息相关的如果只是百十来台机器,那就没有运维太大的生存空间了。
4、优秀运维人才的极度缺乏;目前各大公司基本上都靠自已培养,这个现状导致行业内运维人才的流动性非常低,非常多好的技术都局限在各大公司内部,如google 50万台机器科学的管理,或者国内互联公司top 10 的一些运维经验,这些经验是非常有价值的东西并决定了一个公司的核心竞争力;这些问题进而导致业内先进运维技术的流通、贯通、与借签,并最终将限制了运维发展。
5、很多优秀的运维经验都掌握在大公司手中;这不在于公司的技术实力,而在于大公司的技术规模、海量PV、硬件规模足够大,如baidu可怕的流量、51.com海量数据~~~~这些因素决定了他们遇到的问题都是其它中/小公司还没有遇到的,或即将遇到。但大公司可能已有很好的解决方案或系统。
发展前景:
1、从行业角度来看,随着中国互联网的高速发展(目前中国网民已跃升为全球第一)、网站规模越来越来大、架构越来越复杂;对专职网站运维工程师、网站架构师的要求会越来越急迫,特别是对有经验的优秀运维人才需求量大,而且是越老越值钱;目前国内基本上都是选择毕业生培养(限于大公司),培养成本高,而且没有经验人才加入会导致公司技术更新缓慢、影响公司的技术发展;当然,毕业生也有好处:白纸一张,可塑性强,比较认同并容易融入企业文化。
2、从个人角度,运维工程师技术含量及要求会越来越高,同时也是对公司应用、架构最了解最熟悉的人、越来越得到重视。
3、网站运维将成为一个融合多学科(网络、系统、开发、安全、应用架构、存储等)的综合性技术岗位,给大家提供一个很好的个人能力与技术广度的发展空间。
4、运维工作的相关经验将会变得非常重要,而且也将成为个人的核心竞争力,具备很好的各层面问题的解决能力及方案提供、全局思考能力等。
5、特长发控和兴趣的培养;由于运维岗位所接触的知识面非常广阔,更容易培养或发挥出个人某些方面的特长或爱好,如内核、网络、开发、数据库等方面,可以做得非常深入精通、成为这方面的专家。
6、如果真要以后不想做运维了,转到其它岗位也比较容易,不会有太大的局限性。当然了,你得真正用心去做。
7、技术发展方向、网站/系统架构师。

五、运维关键技术点解剖
1、 大规模集群管理问题
首先我们先要明确集群的概念,集群不是泛指各功能服务器的总合,而是指为了达到某一目的或功能的服务器、硬盘资源的整合(机器数大于两台),对于应用来说它就是一个整体,目前常规集群可分为:高可用性集群(HA),负载均衡集群(如lvs),分布式储、计算存储集群(DFS,如google gfs ,yahoo hadoop),特定应用集群(某一特定功能服务器组合、如db、cache层等),目前互联网行业主要基于这四种类型;对于前两种类似,如果业务简单、应用上post操作比较少,可以简单的采用四层交换机解决(如f5),达到服务高可用/负责均衡的作用,对于资源紧张的公司也有一些开源解决办法如lvs+ha,非常灵活;对于后两种,那就考验公司技术实力及应用特点了,第三种DFS主要应用于海量数据应用上,如邮件、搜索等应用,特别是搜索要求就更高了,除了简单海量存储,还包括数据挖掘、用户行为分析;如google、yahoo就能保存分析近一年的用户记录数据,而baidu应该少于30天、soguo就更少了。。。这些对于搜索准备性、及用户体验是至关重要的。
接下来,我们再谈谈如何科学的管理集群,有以下关键几点:
I、监控
主要包括故障监控和性能、流量、负载等状态监控,这些监控关系到集群的健康运行,及潜在问题的及时发现与干预;
a、服务故障、状态监控:主要是对服务器自身、上层应用、关联服务数据交互监控;例如针对前端web server,我们就可以有很多种类型的监控,包括应用端口状态监控,便于及时发现服务器或应用本身是否crash、通过icmp包探测服务器健康状态,更上层可能还包括应用各频道业务的监控,常用方法是采用面业特征码进行判断,或对重点页面进行签名,以网站被黑篡改(报警、并自动恢复被篡改数据)等等,这些只是一部份,还有N多监控方式,依应用特点而定,还有一些问题需解决,如集群过大,如何高性能的进行监控也是一个现实问题。
b、其它就是集群状态类的监控或统计,为我们合理管理调优集群提供数据参考、包括服务瓶颈、性能问题、异常流量、攻击等问题。
II、故障管理
a、硬件故障问题;对于成百上千或上万机器的N多集群,服务器死机、硬件故障概率是非常大的,几乎每时每刻都有服务硬件问题,死机、硬盘损坏、电源、内存、交换机。针对这种情况,我们在设计网站架构时需要充分考虑到这些问题,并将其视为常态;更多的依靠应用的冗余机制来规避这种风险,但给系统工程师足够宽裕的处理时间。(如google不是号称同时死800台机器,服务不会受到任何影响吗);这就是考验运维工程师及网站架构师功能的地方了,好的设计能达到google所描述自恢复能力,如gfs,糟糕的设计那就是一台服务器的死机可能会造成大面积服务的连锁故障反映,直接对用户拒绝响应。
b、应用故障问题;可能是某一bug被触发、或某一性能阀值被超越、攻击等情况不一而定,但重要的一点,是要有对这些问题的预防性措施,不能想当然,它不会出问题,如真出问题了,如何应对? 这需要运维工程师平时做足功夫,包括应急响应速度、故障处理的科学性、备用方案的有效等。

III、自动化
自动化:简而言之,就是将我们日常手动进行的一些工作通过工具,系统自动来完成,解放我们的双手及枯燥的重复性劳动,例如:没有工具前,我们安装系统需要一台一台裸机安装,如2000台,可能需要10人/10天,搞烂N张光盘,人力成本更大。。。而现在通过自动化工具,只需几个简单命令就能搞定、还有如机器人类程序,自动完成以往每天人工干预的工作,使其自动完成、汇报结果,并具备一定的专家系统能力,能做一些简单的是/非判断、优化选择等。。。这些好处非常明显不再多说。。。应该说,自动化运维是运维工程师职业化的一个追求,利已利公,虽然这是一个异常艰巨的任务:不断变更的业务、不规范化的应用设计、开发模式、网络架构变更、IDC变更、规范变动等因素,都可能会对现有自动化系统产生影响,所以需要模块化、接口化、变因参数化等因此,自动化相关工作,是运维工程师的核心重点工作之一,也是价值的体现。
五、运维中关键技术点解剖(比较实际,现实中的案例,今天先想出这几条,如大家有其它感觉兴趣的,可以提出,一起交流~)

1 大量高并发网站的设计方案
2 高可靠、高可伸缩性网络架构设计
3 网站安全问题,如何避免被黑?
4 南北互联问题,动态CDN解决方案
5 海量数据存储架构

转自chinaunix

阅读内文

[转载]RRDTool 中文手册-简易入门(二)

8月 19th, 2008 | No Comments | Posted in Cacti, RRDTool, 系统监控, 读书笔记 < by Michael Field >

三、RRD数据库更新实例

    在简易入门(一)中已经介绍过update 命令:它使用1个或多个参数,其格式为: : . 如果你知道可以用一个 N 表示当前的时间,你一定会高兴的。或者你可以用Perl中的 time 函数来指定时间:
    perl: perl -e ‘print time, “\n” ‘
    shell: date +%s
    如何按照固定间隔运行某个程序各操作系统不同。不过可以用伪码来表示:
    - Get the value and put it in variable “$speed”
    - rrdtool update speed.rrd N:$speed

    就这些。每5分钟运行一次上面的脚本。在你想知道图像看起来是啥样时,运行上面的例子。你可以把他们放入一个脚本中。运行此脚本后,查看我们刚才创建的graph。

四、SNMP相关知识

    我可以想像到只有少数的人能够每5分钟从他们的汽车中读取一次真实的数据。其他人不得不清算其他类型的计数器。你可以测量打印机打印的页数,咖啡机做的咖啡杯数,计算使用的电流的设备,都可以。递增的计数器可以被监视,并且用你已经学会的方法被绘制成图像。稍后我们就能够监视像温度计这样的值了。
    大多数对RRDtool感兴趣的人会使用一个跟踪网络设备传输数据量的计数器。这样我们下一步就来作这个。我们会从解释如何收集数据开始。

    有些人会说有些工具可以帮助你收集数据。他们是对的!不过,我感觉理解这些工具不是必须的非常重要。在你能够确定为什么事情发生了错误,你要知道他们是如何工作的。

    本例中使用的工具在本文档前面非常简短地提到过,它就是所谓的SNMP。它是与联网设备交谈的方式。

下面用到的工具名为 snmpget ,以下是关于它是如何工作的说明:

snmpget device password OID

snmpget -v[version] -c[password] device OID
    对于device, 你要用设备的名称或者IP地址来替换。对于password, 你需要使用SNMP领域中称为 comunity read string 来替换。对于某些设备来说,缺省的 public 可以工作,但是该设置可能会被关闭,调整或者由于安全和机密的原因而被保护起来。请阅读你的设备或程序的文档。

    接下来有一个称为OID的参数,它用来表示 对象标识符 。

    刚开始学习SNMP时,它看起来有些令人困惑。在你看到MIB管理信息基时,就不会那么困难了。MIB是用来描述数据的倒状树,它有只有一个根结点,并且由根结点开始有多个分支。这些分支都以另一个结点终结,他们继续向下分支,如此继续。所以的分支都有一个名称,它们构成了一个我们能够沿着往下的路径。我们所沿着的这些分支都被命名了:iso, org, dod, internet, mgmt 和mib-2.这些名称也可以用数字方式记录,就像 1 3 6 1 2 1。
    iso.org.dod.internet.mgmt.mib-2 (1.3.6.1.2.1)

    有些程序会使用前导点 . , 令人感到许多困惑。在一个OID中并 没有前导点。为了显示OID缩记法和OID完整记法的区别,(通常约定)在使用OID的完整记法时使用前导点。通常这些程序在返回数据给你时,会省略却缺省的部分。这些程序有的有几个缺省前缀,这会让事情显得更加糟糕。
    Ok, lets continue to the start of our OID: we had 1.3.6.1.2.1 From there, we are especially interested in the branch interfaces which has number 2 (e.g., 1.3.6.1.2.1.2 or 1.3.6.1.2.1.interfaces).

    好了,我们继续OID的初步学习:我们有一个1.3.6.1.2.1的OID,我们对(其下面的) interface 分支特别感兴趣,其编号为2(例如:1.3.6.1.2.1.2 或 1.3.6.1.2.1.interface)。

    首先,我们得要有几个SNMP的程序。先看看你的OS平台上是否有已编译好的软件包。这是最便捷的方式。如果没有,你就得下载源代码、并编译。互联网上到处都是源代码、程序。你可以用你喜欢的任何方式、搜索引擎来找到相关的信息。

    假设你已经有了这些程序。先试着收集大多数系统都有的数据。记住:那些引起我们兴趣的树,它上面的部分都有一个简略名。

    在此我会给出一个在Fedora Core 3操作系统上可用的例子。如果对你的操作系统不可用,请查看snmp的手册,并作相应的调整让它能够运行。

snmpget -v2c -c public myrouter system.sysDescr.0
    该设备应当回应其自身的描述,该描述可能是一个空的。只有在你从某个设备获得响应后,你才能够继续。其中可能需要使用不同的口令、或者不同的设备。
snmpget -v2c -c public myrouter interfaces.ifNumber.0

    最好你得到的结果是一个数字。如果这样的话,你就可以继续往下,并试试另一个叫做 snmpwalk 的程序。

snmpwalk -v2c -c public myrouter interfaces.ifTable.ifEntry.ifDescr
    如果该命令返回一系列的接口,这就对了。以下是该命令运行的返回结果的例子:
[user@host /home/alex]$ snmpwalk -v2c -c public cisco 2.2.1.2
interfaces.ifTable.ifEntry.ifDescr.1 = "BRI0: B-Channel 1"
interfaces.ifTable.ifEntry.ifDescr.2 = "BRI0: B-Channel 2"
interfaces.ifTable.ifEntry.ifDescr.3 = "BRI0" Hex: 42 52 49 30
interfaces.ifTable.ifEntry.ifDescr.4 = "Ethernet0"
interfaces.ifTable.ifEntry.ifDescr.5 = "Loopback0"
    对于cisco设备,我想监视 ‘Ethernet0` 接口,从上面的输出结果能够看到该接口的编号是 4。 我试着运行如下命令:
[user@host /home/alex]$ snmpget -v2c -c public cisco 2.2.1.10.4 2.2.1.16.4

interfaces.ifTable.ifEntry.ifInOctets.4 = 2290729126
interfaces.ifTable.ifEntry.ifOutOctets.4 = 1256486519
    这样,我就有两个OID需要监视,他们是(这次使用完整记法):
    1.3.6.1.2.1.2.2.1.10

    1.3.6.1.2.1.2.2.1.16
    这两个OID都有接口编号4。
    别被糊弄了,我可不是试一次就搞定的。我花了一些数据来搞清这些数字都是什么意思。把这些编号转换成描述文字大有帮助… 至少在大家谈论MIB和OID时,你知道他们是什么东西。别忘了接口编号(如果它不是附属接口,就是0),如果用snmpget没有得到响应,试试 snmpwalk。

五、应用RRDtool的实例

    实际运用的例子
    开始有趣的东东吧。首先,创建一个新的数据库。它包含输入和输出2个计数器的数据。该数据被放入能够进行平均的归档中。他们一次使用1、6、24、或 288个样本。他们同时被存入保存最大数字的归档中。稍后会解释。样本间隔时间为300秒,也就是5分钟,这是一个好的开始。:

    1个样本 “平均” 保留5分钟的周期
    6个样本 每30分钟进行一次平均
    24个样本 每2小时进行一次平均
    288个样本 每1天进行一次平均

    我们试着与MRTG互相兼容,MRTG存储以下数据::

    600 5分钟样本数: 2天和2小时
    600 30分钟样本数: 12.5天
    600 2小时样本数: 50天
    732 1天样本数: 732天

    这些范围被补充进去,因此在数据库中保存的数据总数大约797天。RRDtool存储不同的数据,它不会在 每日 归档停止的地方开始 每周 归档。对于这两个归档,最新的数据会是在 now 附近,因此我们需要比MRTG保存更多的数据!
    我们需要::

    600个5分钟的样本 (2天和2小时)
    700个30分钟的样本 (2天和2小时,加12.5天)
    775个2小时的样本 (上述+50天)
    797个1天的样本 (上述+732天,环型回绕最大797)

rrdtool create myrouter.rrd \
DS:input:COUNTER:600:U:U \
DS:output:COUNTER:600:U:U \
RRA:AVERAGE:0.5:1:600 \
RRA:AVERAGE:0.5:6:700 \
RRA:AVERAGE:0.5:24:775 \
RRA:AVERAGE:0.5:288:797 \
RRA:MAX:0.5:1:600 \
RRA:MAX:0.5:6:700 \
RRA:MAX:0.5:24:775 \
RRA:MAX:0.5:288:797

接下来要做的就是收集数据并把它保存起来。以下是一个例子。它是用伪码写的,你得根据OS调整后让它能够运行。:

while not the end of the universe
do
get result of
snmpget router community 2.2.1.10.4
into variable $in
get result of
snmpget router community 2.2.1.16.4
into variable $out

rrdtool update myrouter.rrd N:$in:$out

wait for 5 minutes
done

在收集了1天的数据后,试着用下面的命令创建图像::

rrdtool graph myrouter-day.png --start -86400 \
DEF:inoctets=myrouter.rrd:input:AVERAGE \
DEF:outoctets=myrouter.rrd:output:AVERAGE \
AREA:inoctets#00FF00:"In traffic" \
LINE1:outoctets#0000FF:"Out traffic"

这会产生一个具有1天流量值的图像。1天有24(小时)x60(分钟)x60(秒)。我们从当前时间-86400秒开始。我们用DEF把输入和输出字节数定义成myrouter.rrd数据库中的的平均值,并且绘制输入流量区和输出流量线。

阅读内文 Tags: , , ,

[转载]RRDTool 中文手册-简易入门(一)

8月 18th, 2008 | No Comments | Posted in Cacti, RRDTool, 系统监控, 读书笔记 < by Michael Field >

一、简介

    RRDtool是由Tobias Oetiker 编写并由全球各地的许多人贡献的工具。本篇文档的作者是Alex van den Bogaerdt 主要是帮助你理解RRDtool是什么,它能够帮助你作些什么。 RRDtool的文档对于有些人来说过于技术化。本教程帮助你理解RRDtool的基本概念。它为你自学RRDtool的文档做好准备。本文档还重点介绍了网络统计方面的知识。


1、RRDtool是什么东西?

    RRDtool是指Round Robin Database 工具(环状数据库)。Round robin是一种处理定量数据、以及当前元素指针的技术。想象一个周边标有点的圆环--这些点就是时间存储的位置。从圆心画一条到圆周的某个点的箭头--这就是指针。就像我们在一个圆环上一样,没有起点和终点,你可以一直往下走下去。过来一段时间,所有可用的位置都会被用过,该循环过程会自动重用原来的位置。这样,数据集不会增大,并且不需要维护。RRDtool处理RRD数据库。它用向RRD数据库存储数据、从RRD数据库中提取数据。


2、RRD中可以存放什么样的数据?

    可以适合时间序列的数据。就是说你必须能够在时间的几个点上度量某些值,并提供这些信息给RRDtool。如果你能够做到这一点,RRDtool就能够存储它们。这些数值必须是数字,但是不一定要是整数,在与MRTG合用时。(下一节会给出更详细的介绍)。
    下面的例子是关于SNMP的,SNMP是简单网络过来协议的缩写。简单是指协议简单--并不表示管理或监视网络简单。读完本篇文档后,你应当能够对人们谈论的SNMP的东西有更多的理解。现在,只要知道SNMP可以用来查询设备中保持的计数器的值就可以了。我们要存放到RRD数据库中的正是这些计数器中的数值。


3、RRDtool可以用来干什么?

    RRDtool源自MRTG(多路由器流量绘图器)。MRTG是有一个大学连接到互联网链路的使用率的小脚本开始的。MRTG后来被当作绘制其他数据源的工具使用,包括温度、速度、电压、输出量等等。
    很可能你会从使用RRDtool来存储和处理通过SNMP收集到的数据开始。这些数据很可能是某个网络或计算机接收或发送的字节数(比特数)。它也可以用来显示潮水的波浪、阳光射线、电力消耗、展会的参观人员、机场附近的噪音等级、你喜欢的度假区的温度、电冰箱的温度、以及任何你可以想象的东西。
    你最需要一个度量数据,以及能够提供这些数据给RRDtool的感应器就可以了。RRDtool会让你创建数据库、存储数据、提取数据、创建用于在Web浏览器中显示的PNG格式的图像。这些PNG图像以来于你收集的数据,它可以是网络平均使用率、峰值。


4、问题探讨

    首先:再读一遍!你可能漏了某些地方。如果你无法编译源代码,而且你的操作系统相当普遍,很可能不是RRDtool的错误。互联网上有已经编译好的版本。如果来自可信赖的网站,就下载一个。
    另一种情况是程序能够工作,但是没有得到预期的结果,可能是配置方面的问题。检查你的配置,与后面例子的配置比较一下。
    RRDtool有一个邮件列表及其归档。读一下几周的列表并搜索归档。没有搜索过归档就提问是很粗鲁的做法:你遇到的问题可能已经由其他人解决了!尽管不是全部,大多数问题都会这样,邮件列表不是经济为了某个参与者服务的。看看RRDtool的文档了解邮件列表的位置和使用方法。
    我建议你马上就花点时间订阅邮件列表,只要发送一封主题为 subscribe 的邮件到 rrd-user-request@list.ee.ethz.ch 就可以了。如果要退定该邮件列表,只需要发送主题为 unsubscribe 到同样的地址即可。


二、学习实例
1、第一个RRD数据库

    在我看来,学习某个东西的最好办法就是实践。为什么现在不开始呢?我们会创建一个数据库,放一些数值到它里面,然后提取这些数据。你的输出应当与本文档中的输出是一样的。
    我们会从一些简单的入手,然后把汽车与路由器比较,或者将公里和比特、字节数比较。他们都是一样的:都是某些时段的某些数值。
    假设我们有一个向互联网发送数据和接收数据的设备。该设备保留一个计数器,该计数器在开启设备时设置为0,并在每传送一个字节就加1。该计数器可能会有一个最大值。如果该值达到最大时,在加一个字节的计数,该计数器就会再次从0开始。这与世界上的许多计数器都是一样的,比如车辆上的里程计数器。
    关于网络的讨论通常用每秒比特数来衡量,因此我们要习惯这种用法。把一个字节看成是8个比特,并且开始用比特而不是字节来思考问题。不过,计数器仍然用字节数为单位来计量!在SNMP世界里,大部分的计数器都是32比特的。这就意味着他们计数范围是0-4294967。我们在例子里会用到这些数值。该设备在被查询时,会返回计数器的当前值。我们知道从上次查询设备开始到现在的时间,因此我们现在就知道每秒 平均传输了多少字节数。这不难计算。首先用文字来描述,然后计算:

用当前查询到的计数器值,减去上一次查询的计数器值
把当前查询时间和上次查询时间作上述同样操作(秒)
将(1)的结果除以(2)的结果,得到的结果就是每秒的字节数。乘以8就得到每秒的比特数(bps)

  • 实例一
    • 你现在正在开车。12:05时你看了一下仪表盘上的里程计数器,它显示这俩车已经行驶了12345公里。12:10分时,你有看了一下里程计数器,它显示 12357公里。这表示你在5分钟内行驶了12公里。科技人员会把它转换成米/秒,这样可以更好的进行比较(每5分钟的字节数)和(每秒比特数)。
      我们行驶了12公里,也就是12000米。我们在5分钟内,或者说是300秒内完成。我们的速度是1200米/300秒,或者说是40米/秒。
      我们可以用公里/小时来计算速度:12乘以5分钟就是一个小时,因此我们必须把12公里乘以12得到144公里/小时。对于和我一样说英语的朋友来说,就是90英里/小时,因此不要在家里或我生活的地方尝试这个速度 :)
      记住:这些数值都仅仅是平均值。如果无法从数字中得到你是否以固定的速度在行驶。本教程后面有一个例子说明这个问题。我希望你理解在计算米/秒或者比特/秒。唯一的差别在于收集数据的方式。即使是K这个单位也是一样的,因为在网络术语中,K同样表示1000。
      我们现在要创建一个数据库,在此数据库中我们能够保存所有这些有趣的数字。启动这个程序的方法可能在各个操作系统上各不相同,但是我假设你可以搞清楚它是否与你的操作系统不同,键入下面的行作为一个长长的行(为了可读性,我得把他分成几行)并且用 \ 来分割。
    rrdtool create test.rrd \
    --start 920804400 \
    DS:speed:COUNTER:600:U:U \
    RRA:AVERAGE:0.5:1:24 \
    RRA:AVERAGE:0.5:6:10


    2、创建了什么东西?

      我们创建的rrd数据库名为test (test.rrd),它的起始时间是我写这篇文档的当天下午,也就是1999年3月7日(该日期转换成920804400秒)。我们的数据库存放一个名为 ’speed’ 的数据源(DS),它表示一个计数器。该计数器每5分钟(缺省)读取一次。在同一个数据库中,保存有2个环状归档(RRA),一个是每次读取时的平均数据(例如:没有东西进行平均)并保留24个样本(24乘以5分钟是2小时)。另一个RRA有6个平均值(半小时)并包含10个这样的平均值(例如5个小时)。

      RRDtool使用来源于UNIX世界的特殊时间戳。该时间戳是自1979年1月1日UTC时间开始到当前逝去的秒数。该时间戳的值被转换成本地时间,它在不同的时区会不一样。
      可能你不是和我在地球的同一个地方。这就是说时区不同。在所有的例子中,我所说的时间当中,小时可能对你来说是错误的。这对这些例子中的结果有一点影响,在阅读时,只需要修正时间中的小时即可。例如:我看到 12:05 的话,在英国的家伙看到的时间就是 11:05 。

    现在我们得向数据库中填入一些数字。我们希望读到以下数据:
    12:05 12345 KM
    12:10 12357 KM
    12:15 12363 KM
    12:20 12363 KM
    12:25 12363 KM
    12:30 12373 KM
    12:35 12383 KM
    12:40 12393 KM
    12:45 12399 KM
    12:50 12405 KM
    12:55 12411 KM
    13:00 12415 KM
    13:05 12420 KM
    13:10 12422 KM
    13:15 12423 KM

  • 我们用下面的命令把上述数据填入数据库:
  • rrdtool update test.rrd 920804700:12345 920805000:12357 920805300:12363
    rrdtool update test.rrd 920805600:12363 920805900:12363 920806200:12373
    rrdtool update test.rrd 920806500:12383 920806800:12393 920807100:12399
    rrdtool update test.rrd 920807400:12405 920807700:12411 920808000:12415
    rrdtool update test.rrd 920808300:12420 920808600:12422 920808900:12423

    正如你说看到的那样,可以在一个命令里向数据库中填入多个值。为了可读性,我得只用三个数据,实际一行里运行的最大数据与操作系统相关。
    我们可以使用 rrdtool fetch 命令从数据库中提取数据。

    rrdtool fetch test.rrd AVERAGE --start 920804400 --end 920809200
      该命令会返回如下输出结果:
      speed

      920804700: nan
      920805000: 4.0000000000e-02
      920805300: 2.0000000000e-02
      920805600: 0.0000000000e+00
      920805900: 0.0000000000e+00
      920806200: 3.3333333333e-02
      920806500: 3.3333333333e-02
      920806800: 3.3333333333e-02
      920807100: 2.0000000000e-02
      920807400: 2.0000000000e-02
      920807700: 2.0000000000e-02
      920808000: 1.3333333333e-02
      920808300: 1.6666666667e-02
      920808600: 6.6666666667e-03
      920808900: 3.3333333333e-03
      920809200: nan
      如果不是像上面的输出结果,可能哪里有错误。也许你的操作系统会打印出不同的格式 NaN 。 NaN 表示 非数字 。 如果你的操作系统输出 U 或 UNKN 或者其他类似东西都是正常的。如果其他地方错误,可能是因为你的过程中的那些步骤出错了(当然假设我的教程是完全正确的 :-))。这样的话,删除数据库文件然后再重新尝试。 有时事情就会变化。本例哟难道的数据像 0.04 而不是 4.0000e-02 。这些实际上是一样的数字,只是写法不同而已。如果rrdtool今后的版本显示略有不同是输出也不要大惊小怪。本文档中的例子对于RRDtool 1.2.0版本都是正确的。


    3、绘第一张图

    建几个图示的时候到了,试试下面的命令:

    rrdtool graph speed.png \
    --start 920804400 --end 920808000 \
    DEF:myspeed=test.rrd:speed:AVERAGE \
    LINE2:myspeed#FF0000

  • 如图一

    • 该命令会创建名为speed.png的图像文件,该图像从12:00开始,到13:00。有一个名为myspeed的变量定义,它使用来自 test.rrd数据库的 speed RRA中的数据。绘制的线条是2像素高,表示myspeed变量。颜色是红色的.
      你会注意到图像的起始不是12:00而是12:05。这是因为在此时间之前的数据不够计算出平均值。这只会在缺少某些样本的情况下发生,不会经常发生。
      颜色是由红、绿、蓝构成的。对每种颜色成分,你可以用16进制来表示使用多少,其中00表示不包含,FF表示完全包含。白色是由红、绿、蓝组成的:FFFFFF。黑色是全部不包含:000000。


    4、用几种数学方法来绘图

      查看图像时,你会注意到横轴下标为 12:10、12:20、12:30、12:40、12:59。有时某些下标不适合(可能是12:00和13:00)会被忽略掉。
      纵轴显示我们输入的范围。下面提供的公里数,以及除以300妙的结果,我们得到非常小的数值。为了更加精确,第一个值是12(12567-12456),除以300后得到0.04,RRDtool显示时为 40m 表示 40/1000 。 其中的 m 与米、公里、或者毫米都没有任何关系!RRDtool不知道我们的数据单位,它只处理没有单位的数据。
      如果我们用米来衡量我们的距离,就会是这样:(12′357′000-12′345′000)/300 = 12′000/300 = 40.
      因为许多人都对这样的数值范围感觉更好,我们就来修正一下。我们将重新创建数据库,并存储正确的数据。但是有更好的办法:在创建png文件时进行一些计算!
    rrdtool graph speed2.png \
    --start 920804400 --end 920808000 \
    --vertical-label m/s \
    DEF:myspeed=test.rrd:speed:AVERAGE \
    CDEF:realspeed=myspeed,1000,\* \
    LINE2:realspeed#FF0000

  • 如图二


  • 注意:不要忘记操作符 * 后面的 。这个反斜杆用来将*从操作系统可能解释的符号转义,而不是直接传递给rrdtool命令。
    在查看PNG文件后,你会注意到 m 不见了。正确的结果就是这样。同样,在图像中加入了一个标注。出了上面提到的几点外,PNG看起来应当是一样的。

      计算是在CDEF部分中指定的,使用逆波兰表达式( RPN )表示的。我们要求RRDtool所作的事情是:`取数据源myspeed, 以及数值1000;把他们相乘` 。在此不要被RPN表达式困扰了,后面会详细介绍。同时,你可能想读一读关于CDEF的教程。以及Steve Rader的RPN表达式的教程。不过哦首先看我这篇教程吧。
      如果我们用1000乘以这些数值,显示把同样的数据显示成公里/小时也是可以的。
      要修改米/秒为单位的值:
      计算米/小时: value * 3′600
      计算公里/小时: value / 1′000
      合起来: value * (3′600/1′000) 或者 value * 3.6

    下面我们来创建这个PNG文件,并加入更多的魔幻功能…

    rrdtool graph speed3.png \
    --start 920804400 --end 920808000 \
    --vertical-label km/h \
    DEF:myspeed=test.rrd:speed:AVERAGE \
    "CDEF:kmh=myspeed,3600,*" \
    CDEF:fast=kmh,100,GT,kmh,0,IF \
    CDEF:good=kmh,100,GT,0,kmh,IF \
    HRULE:100#0000FF:"Maximum allowed" \
    AREA:good#00FF00:"Good speed" \
    AREA:fast#FF0000:"Too fast"

  • 如图三


  • 这个图像看起来更好。速度用KM/H表示,有一个附加的线条表示最大允许的速度(在我行驶的道路上的最大限速)。我还修改了速度的显示颜色,把它从线条改为区块。


    5、一个更复杂的图例

      现在计算更加复杂一些。对于在限速内的速度衡量方法是:
      检查公里/小时是否大于100 ( kmh,100 ) GT
      如果是,返回0,否则返回公里/小时。 ((( kmh,100 ) GT ), 0, kmh) IF

      对于上述的限速值:
      检查公里/小时是否大于100 ( kmh,100 ) GT
      如果是,返回公里/小时,否则返回0。 ((( kmh,100) GT ), kmh, 0) IF

    我愿意相信RRDtool的绘图功能能够处理的数据没有任何虚拟的限制。我会解释他们是如何工作的,不过看看下面的PNG图像:

    rrdtool graph speed4.png \
    --start 920804400 --end 920808000 \
    --vertical-label km/h \
    DEF:myspeed=test.rrd:speed:AVERAGE \
    "CDEF:kmh=myspeed,3600,*" \
    CDEF:fast=kmh,100,GT,100,0,IF \
    CDEF:over=kmh,100,GT,kmh,100,-,0,IF \
    CDEF:good=kmh,100,GT,0,kmh,IF \
    HRULE:100#0000FF:"Maximum allowed" \
    AREA:good#00FF00:"Good speed" \
    AREA:fast#550000:"Too fast" \
    STACK:over#FF0000:"Over speed"

  • 如图四

  • 第一部分完
    本文从网上转载,本人重新整理和附图,出处未考证。

    阅读内文 Tags: , , ,

    Solarwinds实现MSN报警

    8月 13th, 2008 | No Comments | Posted in 系统监控 < by John.Lv >

    一,软件环境
    Solarwinds+msn机器人(msn机器人安装在支持apache+php的环境)
    二,msn机器人下载地址及安装方法见
    系统监控:msn在线机器人实时报警
    三,配置过程
    1. Solarwinds报警配置磁盘空间监控
    1
    在上图中的Configure Alerts中新建报警DiskStatus,按照你的需要配置监控的服务器,报警的条件,监控的周期等,然后按照下图配置满足报警要求后的Action
    2

    按照上图添加2个Alert Action
    Alert Action 1:log the alert to a file将报警保存为alter.log(可随意指定文件名和目录)
    Alert Action 2:Execute an external VBScript指定要执行的VbScript,请将VbScript放在fetion的安装目录下,因为下面的VbScript指定的路径是相对路径
    备注:请一定要先设置报警保存的log,然后在设置要执行的VbScript,因为只有先生成log,然后在执行VbScript读取log中的短信报警信息,设置好后如下图:
    3
    配置生效后应该先生成log然后执行VBScript发送短信

    2.Log样本如下:

    Alert: Percent Space Used of 100.121-D:\ is now 84 %
    Alert: Percent Space Used of 100.102-C:\ is now 82 %

    3. VBScript如下:

    '本脚本有john.lv编写
    logfile="G:\LibFetion\install\alert.log"   '定义报警log请输入Solarwinds中的log设置
    sendmsn="lvming104@hotmail.com" '定义msn接收人信息,需在你MSN好友列表中
    Set objFS = CreateObject ("Scripting.FileSystemObject")
    Dim arrFileLines()
    i = 0
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(logfile, 1)  '读取报警log全部信息
    Do Until objFile.AtEndOfStream
         Redim Preserve arrFileLines(i)
         arrFileLines(i) = objFile.ReadLine
         i = i + 1
    Loop
    objFile.Close
    l = Ubound(arrFileLines) '读取报警log最后一行,因为最近的报警信息永远是最后一行
    mess=arrFileLines(l) '定义要发送的信息

    Set objExplorer = CreateObject("InternetExplorer.Application")
    '通过sendMsg发送信息,本人的sendMsg是安装在另外一台server上sendMsg这个目录下,如果安装在本地把http://192.168.1.211/sendMsg/send.php?改为http://localhost/sendMsg/send.php?
    objExplorer.Navigate "http://192.168.1.211/sendMsg/send.php?msnaddr="&sendmsn&"&message="&chr(34)&mess&chr(34)

    4.编写http://192.168.1.211/sendMsg/send.php

    #!/usr/bin/php
    <?
    $msnaddr = $_GET['msnaddr'];
    $messages = $_GET['message'];
    include('sendMsg.php');
    $sendMsg = new sendMsg();
    #login sendMsg with user:test@live.cn and passwd:123456
    $sendMsg->login('test@live.cn', '123456');
    #who will receive message
    $sendMsg->createSession($msnaddr);
    #send message With a custom font and color
    $sendMsg->sendMessage($messages, 'Times New Roman', '008000');
    ?>

    保存为send.php
    备注:由于监控的机器不多,而且报警的条件也比较高,所有报警次数比较少,生成的log就比较小,如果每天生成的log很大,建议log每天生成,增加日期变量即可

    阅读内文 Tags:

    Solarwinds实现短信报警

    7月 30th, 2008 | 2 Comments | Posted in 系统监控 < by John.Lv >

    最近在Field的帮助下完成了fetion短信报警,下面以磁盘空间报警为例(采用的是Solarwinds报警后自动执行VbScript调用飞信机器人发送短信报警)

    • 一、 软件环境(Windows 2003为例)

    Solarwinds+飞信机器人

    • 二、 安装过程

    飞信机器人下载包地址:

    WINDOWS(2000/XP/VISTA):支持库??最新程序fetion20080618002-win32.rar??

    其中支持库和安装包如下:

    fetion20080618002-win32.rar解压缩你指定的目录,支持库?的内容解压缩后复制至和fetion.exe同一目录即可

    • 三、 配置过程
    • 1. Solarwinds报警配置磁盘空间监控

    在上图中的Configure Alerts中新建报警DiskStatus,按照你的需要配置监控的服务器,报警的条件,监控的周期等,然后按照下图配置满足报警要求后的Action

    ?

    按照上图添加2个Alert Action

    Alert Action 1:log the alert to a file将报警保存为alter.log(可随意指定文件名和目录)

    Alert Action 2:Execute an external VBScript指定要执行的VbScript,请将VbScript放在fetion的安装目录下,因为下面的VbScript指定的路径是相对路径

    备注:请一定要先设置报警保存的log,然后在设置要执行的VbScript,因为只有先生成log,然后在执行VbScript读取log中的短信报警信息,设置好后如下图:

    ?

    ?

    配置生效后应该先生成log然后执行VBScript发送短信

    • 2.Log样本如下:

    Alert: Percent Space Used of 100.121-D:\ is now 84 %

    Alert: Percent Space Used of 100.102-C:\ is now 82 %

    • 3.?VBScript如下:
    logfile="G:\LibFetion\install\alert.log"?? '定义报警log请输入Solarwinds中的log设置
    fetion_exec="G:\LibFetion\install\fetion" '定义fetion.exe所在位置
    fetion_user="135xxxxxxxx"? '定义飞信的登陆用户名或手机号
    fetion_passwd="123456"?? '定义飞信的登陆密码
    send_buddy="13512345678" '定义短信的接收人,需在你飞信好友列表中
    Set objFS = CreateObject ("Scripting.FileSystemObject")
    objFS.CreateTextFile("mess.txt")
    Set objNF = objFS.OpenTextFile("mess.txt",8) '所发送的报警信息存放在mess.txt

    Dim arrFileLines()
    i = 0
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile(logfile, 1)? '读取报警log全部信息

    Do Until objFile.AtEndOfStream
    ???? Redim Preserve arrFileLines(i)
    ???? arrFileLines(i) = objFile.ReadLine
    ???? i = i + 1
    Loop
    objFile.Close
    l = Ubound(arrFileLines) '读取报警log最后一行,因为最近的报警信息永远是最后一行
    objNF.writeline "sms? "&send_buddy&" "&arrFileLines(l) '把报警log最后一行信息写入mess.txt
    objNF.writeline "exit"? '退出飞信机器人
    objNF.close????????? 'close mess.txt
    Set objShell = CreateObject("Wscript.Shell")
    if objFS.fileExists("mess.txt")=True then? '判断mess.txt是否存在
    objShell.run "cmd /C "&fetion_exec&" -u "&fetion_user&" -p "&fetion_passwd&" -b mess.txt",4,True? '执行飞信机器人程序使用fetion_user&fetion_passwd登陆后发送mess.txt中的信息
    objFS.DeleteFile("mess.txt")? '删除mess.txt,可以不要
    end if

    以上内容保存为alter.vbs放在fetion.exe同一目录即可

    备注:由于监控的机器不多,而且报警的条件也比较高,所有报警次数比较少,生成的log就比较小,如果每天生成的log很大,建议log每天生成,增加日期变量即可

    阅读内文 Tags:

    监控系统报警的新选择

    7月 29th, 2008 | 2 Comments | Posted in 系统监控 < by Johnny Woo >

    上次Michael在MSN监控客户端的留言中提到了使用飞信来发送报警信息
    而今天在一篇新闻中.提到了飞信的第三方库

    LibFetion是一款支持多操作系统,使用C/C++语言,针对中国移动IM飞信通信协议开发的第三方应用程序库。(支持Windows、Linux、Mac三平台)
    LibFetion 封装了飞信通信协议并存储相关数据,给开发者提供简洁、丰富的API接口。使用LibFetion飞信客户端的开发者只需专注于 GUI(图形用户界面)的设计开发,因此大大提高飞信客户端的开发速度和降低开发难度。使得飞信在多个操作系统平台上运行,达到“fetion anywhere“。
    LibFetion是针对嵌入式设备系统设计的,它只使用了C库,提供平台线程库接口(缺省使用posix线程库)和网络接口(缺省使用socket)因此具有较强的可移植性。目前 LibFetion已在Linux,Mac OS X,Windows,ucLinux,Ecos操作系统上成功运行。
    当前最新版本为 v0.8.0。

    透过使用这个库
    可以轻松的给监控系统加上手机短信发送功能
    http://www.libfetion.cn/

    阅读内文

    系统监控:msn在线机器人实时报警

    7月 23rd, 2008 | 20 Comments | Posted in 系统监控 < by Michael Field >

    一、实际需求
    在应用各种监控软件(比如:cacti、nagios、sitescope等)的时候,我一般都会用到它的email阀值报警功能。如果这时候再加上一个msn在线监控机器人为你把关,第一时间给你发出msn报警信息,是不是能让你更快的处理问题呢。以下我为大家介绍一个msn command line 的小程序来实现这个功能。
    软件下载地址:sendMsg

    二、运行环境
    一个支持php的系统环境就可以啦,当然要能上网,不然怎么发消息呢。
    我的做法是和cacti监控服务器放一起,不需要额外的设备和资源投入。
    注册一个msn的帐号用于监控机器人。比如:test@test.com 密码:123456
    需要收到消息的msn帐号必须加监控帐号test@test.com为好友,不然收不到消息。

    三、sendMsg用法
    sendMsg.zip包中所有文件如下:

    # ls -l sendMsg/
    -
    rw-r--r-- 1 root root 1213 Jul 29  2007 index.php //测试页面,web中打开开始测试;很容易做。
    -
    rw-r--r-- 1 root root 3894 Jul 29  2007 msnpauth-1.1.3.php
    -
    rw-r--r-- 1 root root 3372 Jul 29  2007 msnpauth.php
    -
    rw-r--r-- 1 root root 4586 Jul 29  2007 sendMsg.php
    -
    rw-r--r-- 1 root root  223 Jul 29  2007 simple.php
    -
    rw-r--r-- 1 root root 1424 Jul 29  2007 template.tpl

    该程序也是通过登录msn服务器、建立IM会话,发送消息;
    基本PHP语法如下:

    $sendMsg = new sendMsg();
    $sendMsg->login('test@test.com', '123456');
    //刚才建立的用于举例的
    msn监控机器人帐号
    $sendMsg->createSession('recipient@hotmail.com');
    //接受信息人的
    msn帐号
    $sendMsg->sendMessage('message', 'Times New Roman', 'FF0000');
    //第一个是具体信息内容,后面可以设定字体和颜色;
    $sendMsg->sendMessage(iconv("GBK", "UTF-8", 测试), 'Times New Roman', '008000');
    //也利用
    iconv转换gbkutf8来发送中文信息;

    效果如下:

    四、实际应用
    这里是我自己写的一个应用发送msn信息的php脚本:仅供参考,如果大家有更好请和我交流。

    #!/usr/bin/php
    <?
    if ($argc != 3) {
    die("Usage: send_cndmonitor.php <msn-address> <messages>\n");
    }
    array_shift($argv);
    $msnaddr = $argv[0];
    $messages = $argv[1];
    include('sendMsg.php');
    $sendMsg = new sendMsg();
    $sendMsg->login('test@test.com', '123456');
    $sendMsg->createSession($msnaddr);
    $sendMsg->sendMessage($messages, 'Times New Roman', '008000');
    ?>

    主要是为了能被其他脚本调用,用于发送一个报警信息。缺点是不能判定错误,所以实际运用中存在故障,需要网络流畅的环境下使用。

    我们的生产环境已经存在大量的监控系统,所以针对错误信息已经整理到数据库中,因此我只需要从数据库导出目前存在error信息的文本文件,然后根据节点位置发送给相关维护负责人即可。

    为了能判定和确保发送正确,我利用sendMsg中的index.php的页面和shell脚本相结合来循环发送,实在抱歉本人PHP程度有限;
    脚本如下:(这是我实例中使用的一个工作脚本,仅供大家借鉴)

    #!/bin/sh
    wget --user=monitor --password=123456 http://127.0.0.1/monitor/msn.txt -O /var/www/html/sendMsg/msn.txt.1 >/dev/null 2>&1
    #下载msn要发送的信息,因为页面都是认证的所以用了wget的user和password;
    now=`date +%Y-%m-%d-%H:%M`
    [ -f /var/www/html/sendMsg/msn.txt ] && oldmd5=`md5sum var/www/html/sendMsg/msn.txt |awk '{print $1}' |tee /var/log/cdn_status_old.md5` || exit 0
    [ -f /var/www/html/sendMsg/msn.txt.1 ] && newmd5=`md5sum var/www/html/sendMsg/msn.txt.1 |awk '{print $1}' |tee /var/log/cdn_status_new.md5` || exit 0
    SA=(admin1 admin2 admin3 admin4)
    # 相关负责人列表和下载的msn信息的中的名字对应;
    msnaddr=(admin1@msn.com admin2@msn.com admin3@msn.com admin4@msn.com)
    # 相关负责人的msn帐号和SA变量中的的名字顺序一一对应;
    sendMsg()
    {
    num=0
    while [ $num -lt 1 ];
    do
    wget --post-data "sender=test@test.com&password=123456&recipient=${1}&message=${2}" http://127.0.0.1/sendMsg/index.php -O /var/www/html/sendMsg/index.php.1 >/dev/null 2>&1
    # 使用wget post-data发送post参数给index.php页面,用以发送msn信息。
    if [ -f /var/www/html/sendMsg/index.php.1 ]; then
    if cat /var/www/html/sendMsg/index.php.1 |grep -i successfully >/dev/null 2>&1;then
    num=1 #判断信息发送成功
    elif cat /var/www/html/sendMsg/index.php.1 |grep -i "The user appears to be offline" >/dev/null 2>&1;then
    num=1 #判断msn接受人为是否在线状态
    echo "The user is offline."
    exit 0
    elif cat /var/www/html/sendMsg/index.php.1 |grep -i "Something went wrong trying to connect to the server" >/dev/null 2>&1;then
    num=1 #判断msn 服务器存在连接问题
    echo "MSN server is wrong."
    exit 0
    else
    num=0 #除了以上三种情况退出循环外,其他情况重试。
    fi
    rm -f /var/www/html/sendMsg/index.php.1
    else
    num=0
    fi
    done
    }
     
    if [[ $oldmd5 == $newmd5 ]];then #校验msn的信息是否是已经发送过的,主要是为了不重复发送错误信息。
    rm -f /var/www/html/sendMsg/msn.txt.1
    exit 0
    else
    mv /var/www/html/sendMsg/msn.txt /var/www/html/sendMsg/bak/msn$now.txt -f
    mv /var/www/html/sendMsg/msn.txt.1 /var/www/html/sendMsg/msn.txt -f
    #备份已发送的msn错误信息
     
    fi
     
    for i in `seq 0 1 3` #根据维护人员的数量进行判断和循环
    do
    if cat /var/www/html/sendMsg/msn.txt |grep -i ${SA[$i]}; then
    messages=`cat /var/www/html/sendMsg/msn.txt |grep -i ${SA[$i]}`
    sendMsg "${msnaddr[$i]}" "$messages"
    else
    continue
    fi
    done

    加入到crontab每5分钟执行一次;考虑维护人员的上线时间(最好是24H值班msn,那就不存在这个问题)设定执行时间为每周1到5的9点到18点;

    */5 9-18 * * 1-5 /var/www/html/sendMsg/send_report.sh

    实际应用大家可以根据自己的情况进行调整,我这里只是告诉大家怎么使用sendmsg,举了一个简单的实例帮助大家理解和应用。

    如果懂php语言的可以把这个作为cacti的一个插件使用,那样效果就更棒啦~

    阅读内文 Tags: , , , , ,