支持万台服务器分布式监控系统原始手稿

             作者:付炜超

如果你本来打算做一个特别牛的东西,最终不管什么原因没做到,但是你实现的也够cool了!

需求分析: 随着现在的企业不断的发展壮大,大多数的企业都出现了分公司、办事处这类的分支机构,由于总公司还要求对下面子公司的网络设备、主机等资源的状态有着相关的了解,所以就要求IT运维部门对不在同一地域的网络、主机等资源都要进行监控。

功能分析:

1、一个监控系统往往需要集成资产管理,可以从逻辑上展示业务和功能的信息,通过对其进行数据分析,做到对投资与回报的一个反馈展示,为资产的合理规划与使用提供了依据。

2、这个监控项目感觉很详细了,尽量都去去实现!

支持万台服务器分布式监控系统原始手稿_监控软件


 

3、我们可以用socket套接字实现在web端可以对不同地方的主机实现ssh操作。类似实现xshell的功能,对于一些出故障的主机我们可以登录去执行相关的操作

4、可视化:RRDtool,这个插件可以实现,很多牛掰的开源监控软件都是用它实现的

5、可以根据不同公司的业务需要,自定义监控模板,当然要有web接口可以对其修改,因为我们想要的是大型监控,假设有广州、上海、深圳、北京四个机房,每个机房一千台主机,你肯定不希望用户是一个个去修改吧,我们可以做成模板,批量修改,对于有特殊要求的server我们再专门修改。

6、我们需要有报警:短信、邮件、IM 和其他接口。具备可定制化功能,对第三方告警介质提供可编程接口。

 

下面是实现的架构:

支持万台服务器分布式监控系统原始手稿_服务器_02

 

 

这样我讲一下具体思路:假设我们的总部在深圳,广州、上海、北京有我们的分公司各有1000台服务器。首先在总部会有一台主监控server,我们可以提供web界面,在各地各有一个监控server,在各地的被监控的服务器看来各地的监控server就是主server,我们想,我们一共有4000台服务器,每个服务器都有不同的监控内容,我们总不能每一个都去配置吧,这样不疯了!!!,在深圳总部我们有一个主数据库,我们的web接口直接跟数据库相连,我们对服务器做了批量修改以后,在每次被监控的主机开机时自己去数据库读取配置信息,当然为了增加高可用和负载均衡,我们需要对主监控server和各地监控server,主数据库、各地数据库进行主从备份。

从图上可以看出

MySQL数据库只负责存储监控配置信息,

Redis负责存储大量的监控数据,当然还有日志信息。

Tirhandle

1、是监控数据处理程序,我们在各地对获取到的监控数据处理以后,那些需要报警的我们append到redis数据库的报警字典中。

2、每10s通知Trunk server 将监控数据写入redis,如果是主监控server写入主redis,如果是各地的监控server则写入各地的trunk redis中

3、读取 redis数据库中的刚写入的并做监控处理

Actioncenter:读取需要报警的数据从主redis中,然后按照一定的规则报警

 

下面我写一下我觉得实现的方式

首先说

一、client向服务器端发送监控数据

   我们是每秒都发送?还是每十秒?每分钟?也就是频率!我们可以做成模板,在MySQL数据库的配置信息中设置,client开机的时候就会读取,然后按照一定的规则发送监控数据。

我们是在client进行处理以后,只把需要报警的数据发送给服务器端呢?还是不处理直接发送呢?这个我们可以再MySQL数据库的配置信息中实现。

 

二、接收服务器的指令

   可以用套接字的方式实现类似ssh,当然linux系统默认就有ssh软件,所以socket实现ssh也就是我们提供web页面的时候需要用

三、Tirhandle监控数据处理程序,每十秒通知监控server写入redis数据库中

这个我们可以总成定时任务在监控server上执行

四、监控server发送旗下所以client监控数据到redis中

 按照一定频率在监控server执行脚本,也可以做成定时任务,redis和监控server如果在一台服务器上会不会快点?如果监控的数据量大了,肯定需要在不同的服务器上部署。

五、Tirhandle监控数据处理程序,读取redis里的监控数据,并做监控处理。

 读取redis的话可以设置网络共享文件夹,在写入数据库的同同时写入网络共享文件夹中,我们的Tirhandle监控数据处理程序可以直接对这些数据进行操作。

当然也可以实时复制到Tirhandle监控数据处理程序所在的服务器

在Tirhandle定义一些规则,也就是报警的阀值

If 达到阀值了do(存储到某个文件里面,按照一定的频率发送过去,也可能是多久发送一次,也可能几条发送一次)

六、监控server读取MySQL服务器的监控配置信息

给定一些权限,直接就可以从数据库中拿了

七、trunk server每分钟同步监控数据到master server上

我们可以在trunk server上设置定时任务

八、按照上面的内容看来,主redis上至少有两个文件,一个放所有的监控数据,一个放Tirhandle监控数据处理程序处理后需要报警的数据,也就是说我们可以看过去所有的监控数据,当然这样文件会很大,我们可以定义一定的规则只保存三个月的。

九、Action center从主redis上读取需要报警的数据按照一定的股则报警,if(达到报警条件了)do(按照一定的协议报警),比如邮件报警,可以在邮箱设置开启SMTP。

 

我们要解决一些依赖问题,如果网络不同的话,那么报警信息会很多,解决方案有很多,我们可以在Tirhandle监控数据处理程序上定义一些规则,例如

If(网不通)do(不报警)

If(主机坏了)do(I/O 服务呀,温度呀,内存呀都没有,所以不报警)

基本想法如上!

               打个时间戳:2015/7/28 10:37