基于Elasticsearch的日志分析解决方案
l 日志收集:Filebeat收集本地日志文件并将其写入Kafka消息队列。
l 日志传输:Kafka消息队列收集和缓存日志。
l 日志转换:Logstash过滤和转换Kafka中的日志数据。
l 日志存储:Logstash以JSON格式将日志写入Elasticsearch进行存储。
l 日志查询:用户通过Kibana可视化搜索日志或通过Elasticsearch DSL API发送查询请求。
存在哪些问题?
缺乏无模式支持
1. Elasticsearch中的索引映射定义了表的结构,包括字段名称、数据类型以及是否启用索引创建。
2. Elasticsearch还拥有自动根据输入的JSON数据添加字段到映射的动态映射机制。这提供了某种程度的无模式支持,但这还不够,因为动态映射在处理脏数据时经常会创建过多的字段,从而中断整个系统的运行。
3. 字段的数据类型是不可变的。为了确保兼容性,用户通常将数据类型配置为"文本",但这会导致比二进制数据类型(如整数)慢得多的查询性能。
4. 字段的索引也是不可变的。用户无法为特定字段添加或删除索引,因此经常为所有字段创建索引,以便在查询中方便地进行数据过滤。但是太多的索引需要额外的存储空间,并减慢数据导入速度。
分析能力不足
Elasticsearch拥有独特的领域特定语言(DSL),与大多数数据工程师和分析师熟悉的技术栈非常不同,所以存在陡峭的学习曲线。此外,Elasticsearch相对封闭的生态系统,在与BI工具集成方面会遇到一些阻力。最重要的是,Elasticsearch仅支持单表分析,滞后于现代OLAP对多表连接、子查询和视图的需求。
高成本和低稳定性
1. 计算成本:在数据写入过程中,Elasticsearch还执行计算密集型操作,包括倒排索引的创建、分词和倒排索引的排序。在这些情况下,数据以每个核心约2MB/s的速度写入Elasticsearch。当CPU资源紧张时,数据写入需求往往会在高峰时段被拒绝,进一步导致更高的延迟。
2. 存储成本:为了加快检索速度,Elasticsearch存储原始数据的正排索引、倒排索引和文档值,消耗了更多的存储空间。单个数据副本的压缩比仅为1.5:1,而大多数日志解决方案的压缩比为5:1。
3. 在查询期间:由于所有查询都在内存中处理,大型查询很容易导致JVMOOM(内存溢出)。
4. 恢复缓慢:对于集群故障,Elasticsearch需要重新加载索引,这对资源消耗很大,因此恢复过程可能需要几分钟。这对于服务可用性的保证是一个挑战。
基于doris的日志存储与分析的解决方案
l 数据导入:Apache Doris支持多种日志数据的摄入方式。可以通过使用Logstash的HTTP输出将日志推送到Doris,可以在将日志写入Doris之前使用Flink预处理日志,或者可以通过常规加载和S3加载从Flink或对象存储中加载日志到Doris中。
l 数据分析:可以把日志数据放入Doris,并在数据仓库中进行跨日志和其他数据的联接查询。
l 应用:Apache Doris兼容MySQL协议,因此可以把各种数据分析工具和客户端集成到Doris中,例如Grafana。还可以通过JDBC和ODBC API将应用程序连接到Doris。
有哪些优势?
增加写入吞吐量
Elasticsearch的性能受到数据解析和倒排索引创建的限制,因此改进了Apache Doris在这些方面的性能:通过SIMD指令和CPU向量指令加快了数据解析和索引创建的速度;然后移除了在日志分析场景中不必要的数据结构,例如正排索引,以简化索引创建过程。
减少存储成本
移除了正排索引,这部分数据占据了索引数据的30%。采用了列式存储和ZSTD压缩算法,从而实现了5:1到10:1的压缩比。考虑到大部分历史日志很少被访问,引入了分层存储来分离热数据和冷数据。超过指定时间段的日志将被移动到存储成本更低的对象存储中。这可以将存储成本降低约70%。
基于SQL的分析引擎
1. 基于SQL的分析引擎确保数据工程师和分析师能够在短时间内轻松掌握Apache Doris,并将其在SQL方面的经验应用到这个OLAP引擎中。借助SQL的丰富功能,用户可以执行数据检索、聚合、多表连接、子查询、UDF、逻辑视图和物化视图,以满足自身需求。
2. 具备MySQL兼容性,可以与大数据生态系统中的大多数GUI和BI工具集成,使用户能够实现更复杂和多样化的数据分析。
VARIANT数据类型
存储半结构化 JSON 数据。它允许存储包含不同数据类型(如整数、字符串、布尔值等)的复杂数据结构,而无需在表结构中提前定义具体的列。VARIANT类型特别适用于处理复杂的嵌套结构,而这些结构可能随时会发生变化。在写入过程中,该类型可以自动根据列的结构、类型推断列信息,动态合并写入的 schema,并通过将 JSON 键及其对应的值存储为列和动态子列。
Es vs doris
Doris2.1版本(3fe+3be)
Es(3master+3node)
基于clickbench(GitHub - ClickHouse/ClickBench: ClickBench: a Benchmark For Analytical Databases)数据集测试,测试结论导入速度提升8倍,存储降低6倍,查询性能提升4倍。
导入速度对比
导入速度/s |
|
|
es |
doris |
|
616 |
76 |
8 |
存储对比
存储/GB |
|
|
es |
doris |
|
9.5 |
1.5 |
6 |
性能测试对比:
|
es |
doris |
||||||
|
第一次/s |
第二次/s |
第三次/s |
avg |
第一次/s |
第二次/s |
第三次/s |
avg |
query1 |
0.03 |
0.01 |
0.01 |
0.02 |
0.02 |
0.04 |
0.03 |
0.03 |
query2 |
0.23 |
0.17 |
0.01 |
0.14 |
0.03 |
0.02 |
0.03 |
0.03 |
query3 |
0.50 |
0.14 |
0.08 |
0.24 |
0.03 |
0.04 |
0.03 |
0.03 |
query4 |
0.27 |
0.05 |
0.11 |
0.14 |
0.03 |
0.03 |
0.03 |
0.03 |
query5 |
0.17 |
0.08 |
0.02 |
0.09 |
0.06 |
0.05 |
0.06 |
0.06 |
query6 |
0.54 |
0.13 |
0.10 |
0.26 |
0.19 |
0.16 |
0.16 |
0.17 |
query7 |
0.09 |
0.06 |
0.05 |
0.06 |
0.02 |
0.04 |
0.02 |
0.03 |
query8 |
0.16 |
0.03 |
0.02 |
0.07 |
0.04 |
0.03 |
0.04 |
0.04 |
query9 |
1.43 |
0.83 |
0.84 |
1.03 |
0.09 |
0.08 |
0.08 |
0.08 |
query10 |
1.07 |
0.98 |
0.90 |
0.99 |
0.09 |
0.09 |
0.08 |
0.09 |
query11 |
0.20 |
0.09 |
0.05 |
0.11 |
0.05 |
0.03 |
0.04 |
0.04 |
query12 |
0.14 |
0.09 |
0.03 |
0.09 |
0.05 |
0.04 |
0.04 |
0.04 |
query13 |
0.58 |
0.21 |
0.13 |
0.31 |
0.17 |
0.17 |
0.17 |
0.17 |
query14 |
0.14 |
0.10 |
0.12 |
0.12 |
0.19 |
0.19 |
0.19 |
0.19 |
query15 |
0.06 |
0.05 |
0.05 |
0.05 |
0.18 |
0.18 |
0.18 |
0.18 |
query16 |
0.06 |
0.06 |
0.08 |
0.07 |
0.06 |
0.05 |
0.06 |
0.06 |
query17 |
0.10 |
0.09 |
0.10 |
0.10 |
0.14 |
0.14 |
0.14 |
0.14 |
query18 |
0.09 |
0.08 |
0.00 |
0.06 |
0.06 |
0.08 |
0.07 |
0.07 |
query19 |
0.95 |
0.31 |
0.02 |
0.42 |
0.21 |
0.20 |
0.23 |
0.21 |
query20 |
0.03 |
0.05 |
0.01 |
0.03 |
0.02 |
0.01 |
0.01 |
0.01 |
query21 |
0.68 |
0.19 |
0.19 |
0.35 |
0.07 |
0.04 |
0.05 |
0.05 |
query22 |
0.30 |
0.35 |
0.29 |
0.31 |
0.06 |
0.07 |
0.07 |
0.07 |
query23 |
0.83 |
1.45 |
0.76 |
1.01 |
0.10 |
0.10 |
0.09 |
0.10 |
query24 |
0.27 |
0.09 |
0.23 |
0.20 |
0.16 |
0.08 |
0.16 |
0.13 |
query25 |
0.52 |
0.05 |
0.04 |
0.20 |
0.03 |
0.03 |
0.03 |
0.03 |
query26 |
0.14 |
0.08 |
0.02 |
0.08 |
0.09 |
0.04 |
0.05 |
0.06 |
query27 |
0.02 |
0.02 |
0.01 |
0.02 |
0.03 |
0.03 |
0.02 |
0.03 |
query28 |
1.02 |
0.71 |
0.76 |
0.83 |
0.13 |
0.08 |
0.08 |
0.10 |
query30 |
11.42 |
11.13 |
10.87 |
11.14 |
0.19 |
0.09 |
0.08 |
0.12 |
query31 |
0.12 |
0.05 |
0.05 |
0.07 |
0.14 |
0.12 |
0.13 |
0.13 |
query32 |
0.11 |
0.06 |
0.10 |
0.09 |
0.19 |
0.19 |
0.18 |
0.19 |
query33 |
0.15 |
0.15 |
0.11 |
0.14 |
1.06 |
1.02 |
1.01 |
1.03 |
query34 |
0.25 |
0.54 |
0.19 |
0.32 |
0.68 |
0.67 |
0.68 |
0.68 |
query35 |
0.17 |
0.17 |
0.02 |
0.12 |
0.67 |
0.66 |
0.66 |
0.66 |
query36 |
0.76 |
0.51 |
0.50 |
0.59 |
0.12 |
0.07 |
0.07 |
0.09 |
query37 |
0.10 |
0.04 |
0.02 |
0.05 |
0.14 |
0.08 |
0.09 |
0.10 |
query38 |
0.12 |
0.37 |
0.10 |
0.20 |
0.05 |
0.04 |
0.04 |
0.04 |
query39 |
0.04 |
0.03 |
0.03 |
0.03 |
0.04 |
0.03 |
0.04 |
0.04 |
query40 |
0.37 |
0.12 |
0.12 |
0.20 |
0.22 |
0.16 |
0.17 |
0.18 |
query41 |
0.10 |
0.03 |
0.02 |
0.05 |
0.08 |
0.03 |
0.03 |
0.05 |
query42 |
0.06 |
0.03 |
0.02 |
0.03 |
0.03 |
0.04 |
0.04 |
0.04 |
query43 |
0.16 |
0.07 |
0.04 |
0.09 |
0.03 |
0.04 |
0.03 |
0.03 |
|
24.50 |
19.81 |
17.21 |
20.51 |
6.04 |
5.38 |
5.49 |
5.64 |
query29 |
超时 |
超时 |
超时 |
|
0.59 |
0.57 |
0.56 |
0.573 |