【问题标题】:How to scale custom made analytics engine?如何扩展定制的分析引擎?
【发布时间】:2017-05-23 03:01:49
【问题描述】:

我们在 Elastic Search 集群之上构建了一个中型分析引擎。

我们以 json 的形式将发送数据存储到我们的服务器,这与 Google Analytics 可能正在做的非常相似。我们将整个数据推送到 ES 集群中。截至目前,每天约为 60GB(每月约 2TB)。

我们有几个月的数据保留政策,比如说 6 个月(根据定价计划)。

我们提供动态报告,例如 ....

  1. 所有来自美国并使用 chrome 浏览器并在 iPhone 上使用该浏览器的用户。
  2. 来自与正则表达式“http://www.google.com”匹配的引荐来源网址的所有用户在特定按钮上的点击总和,这些用户来自印度并使用桌面。

问题

到目前为止,它对我们的工作非常好,但我们面临着规模化的问题。因为我们已经部署了 100 台服务器来处理这些数据量并显示近乎实时的分析。

我在这里寻找的是如何优化数据存储并仍然显示近乎实时的数据切片和切块。想象一下谷歌分析或混合面板如何实时存储和显示数据。

我对任何技术转变持开放态度。请提出建议。 (在功能方面,我们拥有类似于 GA 或 Mix Panel 的东西)

你们是否认为将如此大量的数据存储在诸如 mongodb 之类的 NO-SQL 中可以正常工作并在该数据上运行 MAP-Reduce?但这可能不是实时的(我们预计显示数据会延迟 5-10 分钟)

使用的技术栈(截至目前)

  1. Apache/Nginx 作为网络服务器 + 应用程序代码
  2. 编程语言(Ruby/PHP 等)
  3. 通过 logstash 收集/解析日志
  4. 用于存储和查询数据的 Elasticsearch 集群
  5. 用 Javascript 编写的 SDK,将事件推送到我们的服务器(如 GA)

我们存储看起来像这样的事件负载。

{
    "query_params":[

    ],
    "device_type":"Desktop",
    "browser_string":"Chrome 47.0.2526",
    "ip":"62.82.34.0",
    "screen_colors":"24",
    "os":"Mac OS X",
    "browser_version":"47.0.2526",
    "session":1,
    "country_code":"ES",
    "document_encoding":"UTF-8",
    "city":"Palma De Mallorca",
    "tz":"Europe/Madrid",
    "uuid":"A37F2D3A4B99FF003132D662EFEEAFCA",
    "combination_goals_facet_term":"c2_g1",
    "ts":1452015428,
    "hour_of_day":17,
    "os_version":"10.11.2",
    "experiment":465,
    "user_time":"2016-01-05T17:37:10.675000",
    "direct_traffic":false,
    "combination":"2",
    "search_traffic":false,
    "returning_visitor":false,
    "hit_time":"2016-01-05T17:37:08",
    "user_language":"es",
    "device":"Other",
    "active_goals":[
        1
    ],
    "account":196,
    "url":"http://someurl.com",
    "action":"click",
    "country":"Spain",
    "region":"Islas Baleares",
    "day_of_week":"Tuesday",
    "converted_goals":[

    ],
    "social_traffic":false,
    "converted_goals_info":[

    ],
    "referrer":"http://www.google.com",
    "browser":"Chrome",
    "ua":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36",
    "email_traffic":false
}

编辑

“优化数据存储”意味着对于每个事件,我们在 json 有效负载中收到 70% 的相同数据。但是,我们继续在 ES 中为事件创建新文档。我希望如果我们以某种方式停止存储 json 的重复键并仅存储后续事件有效负载中更改的内容。从而优化存储空间。

我们在所有服务器上都使用 SSD。我担心的是,我们谈论 GA 的规模和类似的数据量会发生什么。我怀疑上面提到的架构或技术会继续存在。寻找关于那种规模的建议。

【问题讨论】:

  • 您的问题陈述非常模糊。 “优化数据存储”意义不大。如果您可以提供一些具体的实际指标以及您所期望的,那将是一个好的开始。此外,我们不知道您的硬件规格。帮助我们帮助您!
  • @Val 编辑了帖子。但是在这里我一般不太担心硬件。我不确定 ES 集群能否在可能变得像 Google Analytics 一样庞大的数据中存活下来(我知道这要求太多了)并且仍然显示近乎实时的分析。
  • Yandex(Yandex Metrics 的制造商,俄罗斯的谷歌分析)使用他们自己的数据库 Clickhouse。他们最近released it to public。它就是这样做的(事件的近实时切片和切块),并且做得很好。并且它使用常规 SQL 进行查询,而不是一些复杂的基于 json 的对象查询协议。试试看。

标签: mongodb hadoop elasticsearch logstash bigdata


【解决方案1】:

我认为您已经在使用最适合此类用例的堆栈。如果还没有完成,我建议对弹性搜索优化进行微调。

一些建议可能是

  1. 考虑使用 SSD 而不是 HDD 用于弹性搜索集群。
  2. 考虑使用“refresh_intervals”等微调参数
  3. 通过云一些负载平衡器使用自动缩放来处理正确的请求。

希望这会有所帮助。

【讨论】:

  • 感谢您的建议。我会再次检查 refresh_intervals。但是,我担心 ES 集群是否可以处理与 GA 一样庞大的数据,以便进行近乎实时的分析。
猜你喜欢
  • 2013-04-21
  • 2011-10-13
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多