OSSIM中分布式消息队列应用

1. 消息队列处理

企业日志数量正在以指数级形式高速增长,日志数据的具有海量、多样、异构等特点,基于传统的单一节点混合式安装的OSSIM平台(指OSSIM 4.4及以下系统),无法满足海量日志分析要求。在OSSIM 4.4以后的系统中增加了中间件RabbitMQ,可通过RabbitMQ将系统中各组件解除耦合,避免了系统中运行模块的影响(例如MySQL的写操作等),这样设计可实现分布式日志分析平台的要求。

OSSIM中使用RabbitMQ后,可以利用消息队列耦合了认证模块,也就是通过消息队列(message queuing)使用消息将OSSIM中各种复杂应用程序连接起来。好比电脑主板上的总线那样。OSSIM中的消息代理服务器采用Erlang语言编写代码,提供了开源消息队列方案,你完全不必自己学习Erlang语言,架构消息队列服务器,这些负责过程OSSIM都完美解决。

下面看个实例,在网络出现故障前或故障过程中,各种设备和服务器会发送大量日志到日志服务器,在原先的设计中,这样的日志会直接写入数据库或者/var/log的某个文件中,在故障状态下的高并发情形下,会对数据库服务器造成巨大的压力,这是在进行日志查询操作时,变得相应延迟加剧,很容易就超过了系统的最大负载。

如图1-42中所示为早期日志收集的方案,在图中PHP脚本从数据库中读取数据的典型流程,此图包括打开数据库连接、运行任意SQL和语句、读取SQL语句找到的结果、关闭数据库连接,最后在HTML页面上将所或内容显示给用户。

上述实例中,每个步骤都存在瓶颈,数据库可能未调整为最佳运行状态,SQL语句使用的数据表可能未被优化,其中还有很多需要管理员注意的地方。如果没有缓存,用户在每次请求PHP脚本时都会碰到问题,每次都会导致性能降低。如果使用缓存来存储SQL语句的结果,这种性能的损耗将不复存在。

如何解决这种问题呢,在OSSIM中采用异步操作的方式,其核心思想就是消息队列(在OSSIM系统中,消息(Message)是由通信的双方所需要传递的日志消息),通过消息队列,将短时间高并发产生的日志消息,存储在消息队列中,从而削平高峰期的并发事务,这样可以有效抵御大量涌入的日志,对单机数据库系统的冲击,也就相对改善数据库系统性能。

以OSSIM中的SIEM事件存储来说明问题,设备将日志发送到Sensor,经过归一化处理之后发往OSSIM Server,关联引擎在对其继续加工,会同时将数个任务收集事件写到数据库,因此数据库写入量很大,当同时查询时并发操作将严重占用有限的I/O通道。

由于关联引擎的业务逻辑的处理比较复杂,往往MySQL数据库的写操作量更大,所以在OSSIM4.0之前系统中没有采用消息队列时,大负荷时往往系统响应迟缓。

但OSSIM 4.4 之后采用消息队列的思想,重构了系统之后,加入了消息队列服务器,结构如图1-43所示。

消息队列服务器中有一个进程单独对消息队列进行处理,首先判断消息队列中是否有待处理的消息,如果有的话,那么将其取出,并进行相应地处理。消息队列处理流程如图1-44所示,就这样通过消息队列将高并发用户请求进行异步操作,然后逐一对消息队列中进行出队同步操作,也避免了并发控制的难题。

消息队列只是解决并发问题的其中一种方式,在OSSIM中往往需要结合多种不同的技术方式来共同解决,比如负载均衡、反向代理等方案。这里,虽然以异常日志为例,但是"麻雀虽小五脏俱全",日志写入文件的高并发操作也同样适用于数据库的高并发,所以研究该案例具有一定指导意义。

2  RabbitMQ

RabbitMQ是实现AMQP(高级消息队列协议)消息中间件的一种,它是消息中间件的开发标准,与平台无关,现用于OSSIM分布式系统中存储转发消息,其工作原理如图1-45所示。

为什么要使用RabbitMQ?在高并发情况下RabbitMQ在处理发送和接收请求时响应非常快速,而且对其性能调优后,系统响应速度还会有所提高。RabbitMQ使用Erlang编写的AMQP 服务器,而AMQP基于客户端/代理模式。

在大数据日志分析应用中,我们常将OSSIM做成集群模式,因为这样可以使用RabbitMQ的集群功能。另外,RabbitMQ中集群中有两种节点,内存节点与磁盘节。对于每个Rabbitmq 节点,根据日志种类建立相应的队列,并且根据日志种类的名称建立exchange的key值,后面再介绍。RabbitMQ通讯端口为5672。

OSSIM中我们通过以下命令查看。

#netstat -na |grep 55672  tcp 0  0  127.0.0.1:52667     127.0.0.1:5672   ESTABLISHED

RabbitMQ环境变量的配置文件位于/etc/rabbitmq/rabbitmq-env.conf,使用时需要查询Rabbitmq状态命令,方法如下:

#rabbitmq-server alienvault     \\这里的alienvault代表Ossim Server的主机名称

此时,能显示rabbitmq的端口、节点名称和主目录(/var/lib/rabbitmq)。

永远不要用kill命令直接停止RabbitMQ服务器,而应该采用rabbitmqctl命令(这样可以将数据同步保存到磁盘,然后关闭服务):

#rabbitmqctl stop

3 选择Key/Value存储

早期OSSIM版本中依然是采用Mysql+memcache的架构存储数据,由于存在性能和一致性问题,在OSSIM4.4后续版本中引入Redis作为队列处理服务器,有读者会问为什么选用Key/Value存储?从SIEM收集业务角度出发,无论日志还是安全事件都属于非结构化数据,在日志关联分析时,非结构化的数据量会大大超过结构化数据,这些数据之间存在关联,如果将这些数据直接存入数据库,那么对数据库访问频率将增加,由于单个表行数的猛增,对表的访问行数成比例增加,在多个表之间的数据调用将会产生大量的计算,足以将任何一个数据分析系统压垮。

在分析Ossim系统各集成开源工具中发现系统没有进行持久化,如果RabbitMQ服务器重启会导致消息丢失,所以采用Redis Server来解决这些问题,Redis是一个Key/Value的NoSQL数据库,Redis作为缓存服务器,数据存储在内存,所以速度比MySQL要快得多,尤其在OSSIM的Web UI中很多的排行榜应用、取出TOP 10的操作、包括各种仪表盘、计算器应用、SIEM控制台的Uniq操作、获取某段时间所有数据的列表、取最新的TOP N操作,包括在分布式日志收集系统中消息队列的处理,这些都要用到Redis服务。

更多有关OSSIM内容,请参考《开源安全运维平台-OSSIM最佳实践》一书。

注:以上为样章内容,最终效果以书中文字为准。

本文出自 “李晨光原创技术博客” 博客,请务必保留此出处http://chenguang.blog.51cto.com/350944/1750918

OSSIM中分布式消息队列应用相关推荐

  1. python队列来做什么_python分布式爬虫中的消息队列是什么?

    当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...

  2. 分布式服务(RPC)+分布式消息队列(MQ)面试题精选

    分布式系统(distributed system)是建立在网络之上的软件系统.正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性.因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作 ...

  3. 分布式消息队列 — RabbitMQ(3)

    目录 文章目录 目录 前文列表 前言 通道 Channel 一个基本的生产者/消费者实现 消费者 生产者 运行结果 应用预取计数 应用 ACK 机制 最后 前文列表 快速入门分布式消息队列之 Rabb ...

  4. [.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现...

    原文:[.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现 一.引言 在上一专题中,商家发货和用户确认收货功能引入了消息队列来实现的,引入消息队列的好处可以保证 ...

  5. 深入理解分布式消息队列

    一.消息队列的演进 分布式消息队列中间件是是大型分布式系统中常见的中间件.消息队列主要解决应用耦合.异步消息.流量削锋等问题,具有高性能.高可用.可伸缩和最终一致性等特点.消息队列已经逐渐成为企业应用 ...

  6. 分布式消息队列 Kafka

    分布式消息队列 Kafka 2016-02-25 杜亦舒 Kafka是一个高吞吐量的.分布式的消息系统,由Linkedin开发,开发语言为scala 具有高吞吐.可扩展.分布式等特点 适用场景 活动数 ...

  7. rockemq 发送延迟消息_58分布式消息队列WMB设计与实践

    背景 为了能够承载58业务的快速扩展及海量的用户访问,分布式系统已经成为公司一种主流架构设计.而消息队列是大型分布式系统中不可或缺的通信桥梁,在分布式系统解耦.异步通信.事件通知.流量削峰等业务场景中 ...

  8. 分布式消息队列 NSQ 和 Kafka 对比

    谈谈分布式消息队列的一些特性,比较两种比较常用的消息队列--NSQ和Kafka 1 消息队列的作用 解耦,将一个流程加入一层数据接口拆分成两个部分,上游专注通知,下游专注处理 缓冲,应对流量的突然上涨 ...

  9. java中的消息队列

    消息队列:可以看做是一个存储消息的容器,它是分布式系统中的重要组件之一. 目的是: 1.为了通过异步处理来提高系统的性能来减少系统响应的时间 一般的步骤是客户端发起请求给服务端,服务端在请求给数据库, ...

最新文章

  1. Python wordcloud库使用说明
  2. Loadrunner检查点使用总结
  3. js ==与===区别(两个等号与三个等号)
  4. 程序员应知——学习、思考与分享
  5. Scala基础教程(八):模式匹配、正则表达式
  6. Linux系统编程12:进程入门之进程的优先级及PR和NI如何修改进程优先级
  7. 统计车牌识别里面各个lable 的数量
  8. haproxy + keepalived + mycat 高可用与负载均衡集群配置 centos7
  9. 零基础转行如何准备一场软件测试面试
  10. 在中国云市场淘金?看国际云大佬如何“软着陆”
  11. 谷歌研发开源协议,助听器有望原生支安卓系统
  12. 【JAVA笔记——器】Spring MVC + HATEOAS RestFul快速搭建
  13. 你我贷CTO冯炯:互联网金融的P2P+O2O怎么做?
  14. LineageOS的代码下载、编译及真机运行
  15. 卧式单面多轴钻孔组合机床动力滑台液压系统的设计
  16. 使用Ghost还原系统为什么容易出问题?
  17. 自制hdmi线一头改vga图_最全VGA、DVI、PS/2、USB等接头详解焊接方法
  18. System Silencer – 离开时 让电脑自动开始任务
  19. web期末网站设计大作业(中华传统文化主题学生网页设计源码)
  20. 零基础wordpress安装详细教程(收藏)

热门文章

  1. 体感(Kinect)技术开发和应用简介
  2. 学习笔记101— word 如何给某一页后面所有页增加行号
  3. redis(nosql数据库)
  4. pandas的DataFrame用法
  5. 牛客网多校第4场 D Another Distinct Values 【构造】
  6. WIN10 常用bug解决办法
  7. 论云计算对传统软件工程的影响
  8. js操作HTML的select
  9. 计算器是如何计算sin、cos等科学函数的值呢?
  10. 加密解密时遇到的不正确的数据以及要解密的数据长度无效问题解决方案