Elasticsearch 入门到精通-Elasticsearch 滞后8个小时等时区问题

一、实战问题

如下都是实战环节遇到的问题:

  • logstash谁解决过时区问题,mysql是东八区shanghai 但是这玩意读完存到es就少了8小时?

  • 目前索引会比真正时间晚8小时,导致8点前的日志写到昨天索引里,大佬们有招吗?

  • 问一下 logstash输出日志到本地文件中,按照小时生成索引,但是他这边的时区是utc,生成的时间和北京时间少8小时,这一块大佬们是咋操作的?

  • ......从浏览器kibana那里看timestamp时间戳变成了utc的时区?

上面的问题都涉及到时区问题,涉及到数据的同步(logstash)、写入、检索(elasticsearch)、可视化(kibana)的几个环节。

二、时区问题拆解

我们通过如下几个问题展开拆解。

1 Elasticserch 默认时区是?能改吗?

官方文档强调:在 Elasticsearch 内部,日期被转换为 UTC时区并存储为一个表示自1970-01-01 00:00:00  以来经过的毫秒数的值。

Internally, dates are converted to UTC (if the time-zone is specified) and stored as a long number representing milliseconds-since-the-epoch.

https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html

Elasticsearch date 类型默认时区:UTC。

正如官方工程师强调(如下截图所示):Elasticsearch 默认时区不可以修改。

https://discuss.elastic.co/t/index-creates-in-different-timezone-other-than-utc/148941但,我们可以“曲线救国”,通过:

  • ingest pipeline 预处理方式写入的时候修改时区;
  • logstash filter 环节做时区转换;
  • 查询时指定时区;
  • 聚合时指定时区。

三、时区问题解决方案

基于上面的分析,如何解决时区问题呢?由于 kibana 支持手动修改时区,不在下文讨论 的范围之内。实战项目中,自己根据业务需求修改即可。那么问题就转嫁为:写入的时候转换成给定时区(如:东8区)就可以了。

方案一:ingest 预处理为东8区时区

  • 步骤 1:定义预处理管道:chage_utc_to_asiash(名称自己定义即可)。

在该管道中实现了时区转换。

  • 步骤 2:创建索引同时指定缺省管道:chage_utc_to_asiash。
  • 步骤 3:写入数据(单条或 bulk 批量均可)
PUT _ingest/pipeline/chage_utc_to_asiash
{
  "processors": [
    {
      "date" : {
        "field" : "my_time",
        "target_field": "my_time", 
        "formats" : ["yyyy-MM-dd HH:mm:ss"],
        "timezone" : "Asia/Shanghai"
      }
    }
  ]
}
PUT my-index-000001
{
  "settings": {
    "default_pipeline": "chage_utc_to_asiash"
  },
  "mappings": {
    "properties": {
      "my_time": {
        "type": "date"
      }
    }
  }
}
PUT my-index-000001/_doc/1
{
  "my_time": "2021-08-09 08:07:16"
} 

当写入数据后,执行检索时,kibana dev tool 返回结果如下:

 "hits" : [
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "my_time" : "2021-08-09T08:07:16.000+08:00"
        }
      }
    ]

最明显的特征是:多了+08:00 时区(东8区)标志。然后,我们用:kibana discover可视化展示一下:

上图中,kibana 采用默认浏览器时区。如果不做上面的 ingest 预处理实现,会怎么样呢?大家如果实现过,肯定会感触很深。需要我们在kibana中切换时间范围,才能找到之前写入的数据。ingest 预处理时区的好处:方便、灵活的实现了写入数据的时区转换。

方案二:logstash 中间 filter 环节处理

拿真实同步案例讲解一下时区处理:

  • 数据源端:Mysql;
  • 数据目的端:Elasticsearch;
  • 同步方式:logstash,本质借助:logstash_input_jdbc 插件同步;
  • 时区处理:logstash filter 环节 ruby 脚本处理。 

如下只给出了中间 filter 环节的脚本:

filter {
 ruby { 
   code => "event.set('timestamp', event.get('publish_time').time.localtime + 8*60*60)" 
 }
 ruby {
   code => "event.set('publish_time',event.get('timestamp'))"
 }
 mutate {
   remove_field => ["timestamp"]
 }
}

三行脚本含义,解释如下:

  • 第一行:将 publish_time 时间加 8 小时处理,赋值给 timestamp。

publish_time  到了 logstash 已转成了 UTC 时区了。timestamp 类似似 C 语言中的交换两个数函数中的 temp 临时变量。

  • 第二行:将 timestamp 时间赋值给 publish_time。
  • 第三行:删除中转字段:timestamp。

源数据Mysql 效果:

同步后 效果:

 如上两个截图,对比一下区别:

  • publish_time 做了时区处理,两者时间已一致,都是东 8 区。
  • update_time 未做时间处理,写入Elasticsearch 后由东8区时间 10:57:31 转为UTC时区时间 02:57:31,少了8小时。

四、检索和聚合的时候指定时区

假定我们写入ES前未做时区处理(实战环节常有的场景),但是检索或者聚合的时候想做时区处理可以吗?

可以的,具体实现方式如下:

POST testindex/_search?pretty
{
  "query": {
    "range": {
      "date": {
        "gte": "2020-01-01 00:00:00",
        "lte": "2020-01-03 23:59:59",
        "format": "yyyy-MM-dd HH:mm:ss",
        "time_zone": "+08:00"
      }
    }
},
  "size": 0,
  "aggs": {
    "per_day": {
      "date_histogram": {
        "calendar_interval": "day",
        "field": "date",
        "time_zone": "+08:00"
      }
    }
  }
}

如上示例中,整合了检索和聚合,有两个要点:

  • 要点1:range query 中指定时区检索。
  • 要点2:data_histogram 聚合中指定时区聚合。

五、小结

数据写入时间不一致、数据滞后8小时等时区问题的本质是:各个处理端时区不一致,写入源的时区、Kibana默认是本地时区(如中国为:东8区时区),而 logstash、Elasticsearch 是UTC时区。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
elasticsearch是一个基于Lucene搜索引擎构建的开源分布式搜索和分析引擎。它被广泛用于构建实时搜索、日志分析、文档存储和大数据分析等应用。 要从入门精通elasticsearch,你可以按照以下步骤进行学习: 1. 安装与配置:首先,你需要下载并安装elasticsearch。然后,你可以根据你的需求进行配置,如设置集群和节点、调整内存和磁盘限制等。 2. 索引与搜索:学习如何创建索引,将数据添加到elasticsearch中。你可以使用REST API或一些客户端库来进行索引和搜索操作。了解如何构建查询语句、使用过滤器、排序和分页等功能。 3. 映射与分析:深入了解elasticsearch的映射和分析功能。映射定义了索引中的字段类型和属性,而分析则负责对文本进行分词、处理和转换。学习如何创建自定义映射和分析器,以满足你的特定需求。 4. 聚合与分析:掌握elasticsearch的聚合功能,用于对索引中的数据进行统计、分组和计算。了解各种聚合类型,如词项聚合、范围聚合、日期直方图等,并学会使用聚合管道进行复杂的数据分析。 5. 高级特性:深入研究elasticsearch的一些高级特性,如倒排索引、分片和副本、分布式搜索、近实时搜索等。了解如何处理大规模数据集和高并发请求,以及如何优化性能和可靠性。 6. 监控与管理:学习如何监控elasticsearch集群的状态和性能,并进行适当的管理和维护工作。了解如何配置和使用监控工具,如Elasticsearch集群监控插件、Kibana等。 7. 故障排除与优化:掌握常见的elasticsearch故障排除技巧,如日志分析、错误处理和调优。学习如何识别和解决性能问题,如慢查询、内存溢出、磁盘使用过高等。 8. 生态系统与扩展:了解elasticsearch的生态系统,并探索一些常用的扩展工具和库,如Logstash、Kibana、Beats等。学习如何与其他技术栈集成,如使用elasticsearch作为后端存储的应用程序等。 以上是elasticsearch入门精通的大致路径,你可以根据自己的兴趣和需求进行深入学习和实践。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值