elasticsearch ElasticSearch设置用于具有重聚合的大型群集 背景和现状,elasticsearch,cluster-computing,aggregate,scalability,elasticsearch,Cluster Computing,Aggregate,Scalability" /> elasticsearch ElasticSearch设置用于具有重聚合的大型群集 背景和现状,elasticsearch,cluster-computing,aggregate,scalability,elasticsearch,Cluster Computing,Aggregate,Scalability" />

elasticsearch ElasticSearch设置用于具有重聚合的大型群集 背景和现状

elasticsearch ElasticSearch设置用于具有重聚合的大型群集 背景和现状,elasticsearch,cluster-computing,aggregate,scalability,elasticsearch,Cluster Computing,Aggregate,Scalability,我们正在将集群从Cassandra迁移到一个完整的ElasticSearch集群。我们正在以每秒250-300个文档的速度索引文档。在ElasticSearch 1.2.0中,它表示每天约8次 { “通用”: { “id”:“twi471943355505459200”, “类型”:“推特”, “标题”:“RT@YukBerhijabb:生活就是选择-https://m.facebook.com/story.php?story_fbid=637864496306297&id=1000024825

我们正在将集群从Cassandra迁移到一个完整的ElasticSearch集群。我们正在以每秒250-300个文档的速度索引文档。在ElasticSearch 1.2.0中,它表示每天约8次

{
“通用”:
{
“id”:“twi471943355505459200”,
“类型”:“推特”,
“标题”:“RT@YukBerhijabb:生活就是选择-https://m.facebook.com/story.php?story_fbid=637864496306297&id=100002482564531&refid=17",
“内容”:“RT@YukBerhijabb:生活就是选择-https://m.facebook.com/story.php?story_fbid=637864496306297&id=100002482564531&refid=17",
“来源”:“,
“geo”:空,
“链接”:http://twitter.com/rosi_sifah/status/471943355505459200",
“郎”:“恩”,
“创建时间”:1401355038000,
“作者”:{
“用户名”:“rosi_sifah”,
“姓名”:“罗西法”,
“id”:537798506,
“阿凡达”:http://pbs.twimg.com/profile_images/458917673456238592/Im22zoIV_normal.jpeg",
“链接”:http://twitter.com/rosi_sifah"
}
},
“推特”:{
//推文
}
}
我们的用户将请求保存在我们的SQL数据库中,当他们请求仪表板时,我们希望使用他们的查询请求我们的ES群集(从数据库检索),并使用新的ES聚合框架在其上进行聚合

每个仪表板都显示一个明确的、用户选择的日期范围,因此我们始终使用

“范围”:{
“generic.created_at”:{
“从”:140100000000,
“至”:1401029019706
}
}
以及ES查询

我们通过以下方式指定了路由:

“_路由”:{
“必需”:正确,
“路径”:“generic.id”
},
\u id具有:

“\u id”:{
“索引”:“未分析”,
“存储”:“假”,
“路径”:“generic.id”
}
在大约5天的时间里,我们在一个索引中存储了6700万文档(大约40Go)。我们已经了解了按天分割索引的良好实践。所以现在我们的索引是按天分割的([index name]-[YYYY-MM-DD])

目前每个索引有5个碎片和1个副本,我们有一个由3台机器组成的集群,每台机器有8个内核,16Go的RAM和8To的HDD。我们计划使用另一台机器作为网关(8核,16Go内存,1To硬盘)

除了集群配置之外,我们默认离开了ES配置

问题
  • 对于要索引的每个文档,我们都明确地说要索引什么 使用。目前我们使用当天的日期。我们应该使用日期吗 该文件是为了防止热点?因为现在 指不同日期的文件(在其 创建时间)可以位于当天的同一索引中
  • 5个碎片是否足够(或太多)容纳每天2160万个文档
  • 如果我们希望在不到1秒的时间内处理所有聚合查询,我们应该设置多少个副本
  • 我们应该改变路线吗?因为我们不知道在聚合我们向集群发出的每个请求之前会处理哪些文档(因为查询是用户定义的)
  • 为了支持6个月的文档,我们应该在集群中放置什么样的硬件(多少台机器,什么配置)
  • [更新]

    以下是一些查询示例:

    词云

    GET idx-2014-05-01/stream/\u search?search\u type=count
    {
    “查询”:{
    “布尔”:{
    “必须”:[{
    “查询字符串”:{
    “查询”:”(generic.lang:fr或generic.lang:en)和(generic.content:javascript)
    }},{
    “范围”:{
    “generic.created_at”:{
    “从”:140100000000,
    “至”:1401029019706
    }
    }}
    ]
    }
    },
    “aggs”:{
    “文字”:{
    “条款”:{
    “字段”:“generic.content”,
    “尺寸”:40
    }
    }
    }
    }
    
    柱状图

    GET idx-2014-05-01/stream/\u search?search\u type=count
    {
    “查询”:{
    “布尔”:{
    “必须”:[{
    “查询字符串”:{
    “查询”:“通用。内容:苹果”
    }},{
    “范围”:{
    “generic.created_at”:{
    “从”:140100000000,
    “至”:1401029019706
    }
    }}
    ]
    }
    },
    “aggs”:{
    “卷”:{
    “日期直方图”:{
    “字段”:“generic.created_at”,
    “间隔”:“分钟”
    }
    }
    }
    }
    
    必须使用的语言

    GET idx-2014-05-01/stream/\u search?search\u type=count
    {
    “查询”:{
    “布尔”:{
    “必须”:[{
    “查询字符串”:{
    “查询”:”(generic.lang:fr或generic.lang:en)和(generic.content:javascript)
    }},{
    “范围”:{
    “generic.created_at”:{
    “从”:140100000000,
    “至”:1401029019706
    }
    }}
    ]
    }
    },
    “aggs”:{
    “顶级来源”:{
    “条款”:{
    “字段”:“generic.lang”
    }
    }
    }
    }
    

    让我在所有答案/评论之前先提出建议,尽可能自己测试这些场景。虽然Elasticsearch具有很强的可扩展性,但存在许多权衡,这些权衡严重受文档大小和类型、摄取量和查询量、硬件和操作系统的影响。虽然有很多错误的答案,但很少有一个正确的答案

    我的回答基于几个活动集群,其中(目前)有大约50万个活动文档,再加上我们最近进行的一些基准测试,测试量约为您的4倍(在基准测试期间,每天摄取约8000万个文档)

    1) 首先,当您甚至有一个包含5个分片和每个分片1个副本的索引时,您并没有创建多个包含3个节点的热点。Elasticsearch将每个副本从其主节点分离到不同的节点,通常会尝试平衡碎片的负载。默认情况下,Elasticsearch将对ID进行散列,以选择要索引到的碎片(然后获取