• MongoDB的timezone问题


    MongoDB是以UTC格式来存储所有时间的,查询的时候也是返回UTC时间,不提供在数据库连接级别的timezone支持,这就带来一个问题:无法使用groupby对日期进行聚合,因为你所在的timezone的日期跟UTC的日期不完全是同一天。

    虽然这个功能在社区里面呼声还是比较高的,但是10gen公司至今都没有给出timezone支持的时间表。 https://jira.mongodb.org/browse/SERVER-6310

    这样对于想要存储正确时间到mongodb中,有两种套路。

    1:存入数据库之前,把datetime转成UTC时间;从数据库读取时(读取的结果并不带timezone信息,因为它肯定是UTC时间),再把UTC时间转成local timezone。  具体参照这里

    2:使用驱动本身提供的tz_aware=True来进行半自动转,为什么说是半自动,因为插入的时候datetime必须带有tzinfo信息,它才能帮助你自动转换成UTC,不然就直接存入mongoDB了。查询的时候datetime带了UTC的tzinfo,需要使用astimezone把它转成local timezone。 具体参照这里

    对于groupby的问题,到目前还没有好的解决方案,要么把数据全部拉到客户端,然后进行统一转换,再统计。这样代价会比较大,对于大一点数据来说就不太现实。

    如果不需要同一数据支持多timezone的话,可以把本地时间直接存入到mongodb中 ;)

    纪录一次自己碰到的一个跟groupby相关的具体问题及解决方案。

    《背景》

    通过各个app server上的td-agent来收集apache的access log,并存入mongoDB中

     td-agent用于收集access log的配置

    <source>
      type tail
      path /var/log/httpd/access_log
      pos_file /var/log/td-agent/access_log.pos
      tag apache.access
      format /^(?<host>[^ ]*) [(?<time>[^]]*)] (?<user>[^ ]*) (?<url>[^ ]*) (?<code>[^ ]*) (?<size>[^ ]*) (?<taken>[^ ]*)$/
      time_format %d/%b/%Y:%H:%M:%S %z
    </source>
    
    <match apache.access>
      # plugin type
      type mongo_timezone
    
      # timezone
      utcoffset 8
    
      # mongodb db + collection
      database apache
      collection access
    
      # mongodb host + port
      host 127.0.0.1
      port 27017
    
      # interval
      flush_interval 10s
    </match>

    为了使得groupby可以对日期聚合,必须把本地时间直接存入mongoDB,所有的hack就在mongo_timezone这个mongo_timezone  自己定制plugin里面了。(把该定制文件放入/etc/td-agent/plugin/就可以在配置文件里面直接使用)

    每一个fluent的event log包含三部分,tag,time,message。这是一个sample

    2013-08-09T00:00:30+09:00       apache.access      {"host":"117.136.88.98","user":"1","request":"POST /index/ HTTP/1.1","code":"200","size":"822","taken":"40790"}

    根据fluent-plugin-mongo的源代码,这个timestamp形式的time值默认会写入mongoDB,可以在这里定制我需要的值。

    --EOF--

  • 相关阅读:
    [NOI2015]程序自动分析
    D-query(莫队)
    小B的询问
    组合的输出 (dfs+记忆化)
    组合的输出 (dfs+记忆化)
    5719: 集合的划分(dfs)
    Search for a range, 在一个可能有重复元素的有序序列里找到指定元素的起始和结束位置
    Find Min In Rotated Sorted Array2,包含重复数字的反转序列找最小值。
    Find Min In Rotated Sorted Array,寻找反转序列中最小的元素。
    Search In Rotated SortedArray2, 有重复数据的反转序列。例如13111.
  • 原文地址:https://www.cnblogs.com/foxracle/p/3258034.html
Copyright © 2020-2023  润新知