异常检测是一种跨行业方法,用于发现事件流中的异常情况 - 它适用于物联网传感器、金融欺诈检测、安全、威胁检测、数字广告欺诈和许多其他应用。此类系统检查流数据以检查是否存在异常或违规行为,并在检测到时发送警报以处理这些异常并确定它们是否确实代表安全威胁或其他问题。
检测系统通过将事件与历史模式进行比较来查找流数据中的异常,识别先前分类的异常和与预期显着不同的新事件。执行此检测需要一个技术堆栈,该技术堆栈利用机器学习、统计分析、算法优化技术和数据层技术来摄取、处理、分析、传播和存储流数据。
实际上,为每天可以生成数百万甚至数十亿个事件的应用程序创建异常检测系统会带来重大的开发挑战,从异常检测算法必须克服的计算障碍到系统数据层技术必须满足的性能和可扩展性需求。在 Instaclustr,我们最近创建了一个纯粹的实验性异常检测应用程序(我们不销售异常检测),利用开源 Apache Kafka 和 Apache Cassandra 作为其数据层技术,然后从可扩展性、性能和性能方面分析了该架构的有效性。成本效益的角度。
构建异常检测管道
断点或变化点分析提供了一种执行简单类型的无监督异常检测的方法。我们的系统使用CUSUM(CUmulative SUM)算法来分析事件流,以检查最近的事件是否与之前的事件不同。
图片标题
异常检测管道流程如下:
图片标题
事件以流的形式到达
从流中获取下一个事件
将事件写入数据库
(数据存储在历史事件数据库中)
从数据库中查询历史数据
如果有足够的观察结果,则运行异常检测器
如果检测到潜在的异常情况,请采取适当的措施
架构和技术决策
Apache Kafka 和Apache Cassandra是支持异常检测系统的强大技术选择,原因有很多:它们价格实惠、高性能、可扩展,并且无缝协作。
Kafka 能够快速、线性扩展地摄取流数据,支持多个异构数据源、数据持久化和复制,即使在某些节点发生故障时也能消除数据丢失。Kafka的存储和转发设计还使其能够充当将易失性外部数据源与Cassandra数据库分开的缓冲区,从而使Cassandra在发生大数据激增时不会不堪重负,并进一步保护数据免遭丢失。将 Kafka 中的数据发送到其他地方(例如 Cassandra 数据库)并实时连续处理流数据很简单。以下是 Kafka 处理负载峰值的示例,允许 Cassandra 继续以稳定的速率处理事件:
图片标题
同时,Cassandra 是快速存储高速流数据,特别是时间序列数据的有力选择,因为它是写入优化的。Cassandra 在重新读取数据的任务中也表现出色,因为它通过使用复杂的主键来支持随机访问查询,该主键由简单或复合分区键以及零个或多个确定数据返回顺序的集群键组成。与 Kafka 一样,Cassandra 也提供线性可扩展性,即使在故障期间也能维护数据。
对于我们的异常检测实验,我们将 Kafka、Cassandra 和我们的应用程序组合在Lambda 架构中,其中 Kafka 和流管道充当“速度层”,Cassandra 充当“批处理”和“服务”层。
我们还尝试了使用更简单的 Kappa 架构的想法,利用 Kafka 具有不可变的数据副本来仅将异常检测管道作为 Kafka 流应用程序运行。然而,我们发现 Kafka 仅在连续且按顺序重放先前数据时才有效,因为它缺乏索引或对随机访问查询的支持。这意味着对于大量的 ID,消费者在找到匹配的 ID 之前需要读取大量不相关的记录。不可扩展的替代想法包括为每个 ID 分配一个分区,或者使用流状态存储来缓存数据——考虑到所讨论的大数据无法完整保存在 RAM 中,这是不切实际的。因此,我们证明了 Lambda 架构是必要的,也是最好的方法。