查看原文
其他

对比Elasticsearch,使用Doris进行高效日志分析(下)

学研妹 Java学研大本营 2024-01-02

介绍对比使用Elasticsearch和Apache Doris进行日志分析。

长按关注《Java学研大本营》

3 使用案例中的性能表现

一家游戏公司已经从ELK技术栈转向了Apache Doris解决方案。他们基于Doris的日志系统所需的存储空间只有之前的1/6。

一家网络安全公司利用Apache Doris中的倒排索引构建了他们的日志分析系统,支持每秒写入30万行数据,仅使用以前所需的1/5服务器资源。

4 实践指南

现在按照以下三个步骤来构建一个基于Apache Doris的日志分析系统。

在开始之前,从官方网站下载Apache Doris 2.0或更新版本,并部署集群。

4.1 步骤1:创建表格

这是一个表格创建的示例。

对配置的解释:

  • 将DATETIMEV2时间字段指定为键,以加快对最新N条日志记录的查询速度。

  • 为频繁访问的字段创建索引,并使用解析器参数指定需要进行全文搜索的字段。

  • "PARTITION BY RANGE"意味着根据时间字段将数据按范围进行分区,启用动态分区以进行自动管理。

  • "DISTRIBUTED BY RANDOM BUCKETS AUTO"意味着将数据随机分布到桶中,系统会根据集群大小和数据量自动决定桶的数量。

  • "log_policy_1day"和"log_s3"意味着将超过1天的日志移动到S3存储。

CREATE DATABASE log_db;
USE log_db;

CREATE RESOURCE "log_s3"
PROPERTIES
(
   "type" = "s3",
   "s3.endpoint" = "your_endpoint_url",
   "s3.region" = "your_region",
   "s3.bucket" = "your_bucket",
   "s3.root.path" = "your_path",
   "s3.access_key" = "your_ak",
   "s3.secret_key" = "your_sk"
);

CREATE STORAGE POLICY log_policy_1day
PROPERTIES(
   "storage_resource" = "log_s3",
   "cooldown_ttl" = "86400"
)
;

CREATE TABLE log_table
(
 ``ts` DATETIMEV2,
 ``clientip` VARCHAR(20),
 ``request` TEXT,
 ``status` INT,
 ``size` INT,
 INDEX idx_size (`size`) USING INVERTED,
 INDEX idx_status (`status`) USING INVERTED,
 INDEX idx_clientip (`clientip`) USING INVERTED,
 INDEX idx_request (`request`) USING INVERTED PROPERTIES("parser" = "english")
)
ENGINE 
OLAP
DUPLICATE KEY(`ts`)
PARTITION BY RANGE(`ts`) ()
DISTRIBUTED BY RANDOM BUCKETS AUTO
PROPERTIES (
"replication_num" = "1",
"storage_policy" = "log_policy_1day",
"deprecated_dynamic_schema" = "true",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-3",
"dynamic_partition.end" = "7",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "AUTO",
"dynamic_partition.replication_num" = "1"
)
;

4.2 步骤2:导入日志

Apache Doris支持多种数据导入方法。对于实时日志,推荐以下三种方法:

  • 从Kafka消息队列中拉取日志:Routine Load

  • Logstash:通过HTTP API将日志写入Doris

  • 自定义编写程序:通过HTTP API将日志写入Doris

使用Kafka进行数据摄取

对于写入Kafka消息队列的JSON日志,创建常规加载(Routine Load),以便Doris从Kafka中拉取数据。以下是示例。property.* 配置为可选配置:

-- 准备Kafka集群和主题("log_topic"

-- 创建常规加载,从Kafka的 log_topic 加载数据到 "log_table"
CREATE ROUTINE LOAD load_log_kafka ON log_db.log_table
COLUMNS(ts, clientip, request, status, size)
PROPERTIES (
   "max_batch_interval" = "10",
   "max_batch_rows" = "1000000",
   "max_batch_size" = "109715200",
   "strict_mode" = "false",
   "format" = "json"
)
FROM KAFKA (
   "kafka_broker_list" = "host:port",
   "kafka_topic" = "log_topic",
   "property.group.id" = "your_group_id",
   "property.security.protocol"="SASL_PLAINTEXT",     
   "property.sasl.mechanism"="GSSAPI",     
   "property.sasl.kerberos.service.name"="kafka",     
   "property.sasl.kerberos.keytab"="/path/to/xxx.keytab",     
   "property.sasl.kerberos.principal"="xxx@yyy.com"
)
;

可以通过SHOW ROUTINE LOAD命令查看常规加载的运行情况。

通过Logstash进行数据导入

配置Logstash的HTTP输出,然后通过HTTP Stream Load将数据发送到Doris。

1) 在logstash.yml中指定批量大小和批量延迟,以提高数据写入性能。

pipeline.batch.size: 100000
pipeline.batch.delay: 10000

2) 在日志收集配置文件testlog.conf中添加HTTP输出,URL为Doris中的Stream Load地址。

  • 由于Logstash不支持HTTP重定向,应该使用后端地址而不是FE地址。

  • 头部中的授权是http basic auth,使用echo -n 'username:password' | base64进行计算。

  • 头部中的load_to_single_tablet可以减少数据摄取中的小文件数量。

output {
  http {
      follow_redirects => true
      keepalive => false
      http_method => "put"
      url => "http://172.21.0.5:8640/api/logdb/logtable/_stream_load"
      headers => [
          "format""json",
          "strip_outer_array""true",
          "load_to_single_tablet""true",
          "Authorization""Basic cm9vdDo=",
          "Expect""100-continue"
      ]
      format => "json_batch"
  }
}

通过自定义程序进行数据摄取

以下是通过HTTP Stream Load将数据摄取到Doris的示例。

注意:

  • 使用basic auth进行HTTP授权,使用 echo -n 'username:password' | base64 进行计算。

  • http header "format:json":指定数据类型为JSON。

  • http header "read_json_by_line:true":每行都是一个JSON记录。

  • http header "load_to_single_tablet:true":每次写入一个分片(tablet)。

  • 对于数据写入客户端,建议批量大小为100MB~1GB。未来的版本将在服务器端启用Group Commit,并减小客户端的批量大小。

curl \
--location-trusted \
-u username:password \
-H "format:json" \
-H "read_json_by_line:true" \
-H "load_to_single_tablet:true" \
-T logfile.json \
http://fe_host:fe_http_port/api/log_db/log_table/_stream_load

4.3 步骤3:执行查询

Apache Doris支持标准SQL,因此可以通过MySQL客户端或JDBC连接到Doris,然后执行SQL查询。

mysql -h fe_host -P fe_mysql_port -u root -Dlog_db

一些常见的日志分析查询:

  • 检查最新的10条记录。
SELECT * FROM log_table ORDER BY ts DESC LIMIT 10;
  • 检查Client IP为"8.8.8.8"的最新的10条记录。
SELECT * FROM log_table WHERE clientip = '8.8.8.8' ORDER BY ts DESC LIMIT 10;
  • 检索在"request"字段中包含"error"或"404"的最新的10条记录。MATCH_ANY是Doris中的通过全文搜索来查找包含指定关键词中任意一个的记录。
SELECT * FROM log_table WHERE request MATCH_ANY 'error 404' ORDER BY ts DESC LIMIT 10;
  • 检索在"request"字段中同时包含"image"和"faq"的最新的10条记录。MATCH_ALL也是Doris中的全文搜索语法关键词,表示查找同时包含所有指定关键词的记录。
SELECT * FROM log_table WHERE request MATCH_ALL 'image faq' ORDER BY ts DESC LIMIT 10;

5 总结

如果需要一种高效的日志分析解决方案,Apache Doris是非常友好的选择,尤其适合那些具备SQL知识的读者。相比ELK堆栈,使用Apache Doris可以获得更好的无模式支持,实现更快的数据写入和查询,并且减少存储负担。

推荐书单

《名师讲坛:Java微服务架构实战(SpringBoot+SpringCloud+Docker+RabbitMQ)》

Java微服务架构是当下流行的软件架构设计方案,可以快速地进行代码编写与开发,维护起来也非常方便。利用微架构技术,可以轻松地实现高可用、分布式、高性能的项目结构开发,同时也更加安全。   《名师讲坛:Java微服务架构实战(SpringBoot+SpringCloud+Docker+RabbitMQ)》一共15章,核心内容为SpringBoot、SpringCloud、Docker、RabbitMQ消息组件。其中,SpringBoot 是SpringMVC技术的延伸,使用它进行程序开发会更简单,服务整合也会更容易。SpringCloud是当前微架构的核心技术方案,属于SpringBoot的技术延伸,它可以整合云服务,基于RabbitMQ和GITHUB进行微服务管理。除此以外,该书还重点分析了OAuth统一认证服务的应用。   《名师讲坛:Java微服务架构实战(SpringBoot+SpringCloud+Docker+RabbitMQ)》适用于从事Java开发且有架构与项目重构需求的读者,也适用于相关技术爱好者,同时也可作为应用型高等院校及培训机构的学习教材。

购买链接:https://item.jd.com/12793864.html

精彩回顾

对比Elasticsearch,使用Doris进行高效日志分析(上)

从Clickhouse迁移到Doris,数据仓库性能大提升

更简洁更高效,Doris对比ClickHouse、MySQL、Presto、HBase

优化SQL语句,10条建议让SQL速度飞起来

如何在Linux中正确“杀死”程序

长按关注《Java学研大本营》
长按访问【IT今日热榜】,发现每日技术热点
继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存