在这篇文章里,我将和大家分享一下我用Scala、Akka、Play、Kafka和ElasticSearch等构建大型分布式、容错、可扩展的分析引擎的经验。
我的分析引擎主要是用于文本分析的。输入有结构化的、非结构化的和半结构化的数据,我们会用分析引擎对数据进行大量处理。如下图所示为第一代架构,分析引擎可以用REST客户端或Web客户端(引擎内置)访问。
简单描述一下用到的技术:
Play框架做REST服务器和WEB应用。Play是个基于轻量级、无状态和WEB友好的MVC框架。
Akka集群作处理引擎。Akka是个工具集,用于在JVM上简化编写高并发、分布式、和有弹性的消息驱动应用。
ClusterClient用于与Akka集群通信。它运行在REST服务器上,将任务发给Akka集群。使用ClusterClient是一个非常错误的决定,因为它并不会维持与Akka集群的长连接,因而会经常报连接错误,而且重新建立连接时还要把那个Client所在的JVM也一起重启。
ElasticSearch用作查询引擎和数据存储,包括原始数据和分析结果。
Kibana用作可视化平台。Kibana是有弹性的分析和可视化平台。
Akka Actor用作ElasticSearch的数据导入导出服务。它的表现非常好,服务从来没出过故障。
S3用作集中化文件存储。
Elastic Load Balance用作节点之间的负载均衡。
MySQL用于元数据存储。
我们从Akka 2.2.x版开始用起,也碰到了一些严重问题,主要表现为:
<