如何使用Elasticsearch动态扩展写入和索引的大小?

时间:2014-03-10 15:45:50

标签: elasticsearch sharding autoscaling horizontal-scaling

我目前正在探索解决方案,以便存档并提供大量文档数据的网络搜索引擎。我首先开始寻找搜索引擎解决方案的搜索,最后得出的结论是,当您必须处理大量数据时,Elasticsearch是最好的之一。我已经读过,它很容易扩展,开箱即用,我确信。

然后我查看了没有SQL数据库,由于演员的数量,我花了更多的时间在我的搜索上,我已经阅读了几个资源(没有SQL提取,Amazon Dynamo纸张,Google BigTable纸张等)导致我为了更好地理解分布式系统。我还看到,大多数No SQL可伸缩数据库都能够在碎片变得太大时自动将碎片拆分为两个碎片。

然后我意识到Elasticsearch不提供此功能。此外,相信文档:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-update-settings.html

创建索引后,我们无法增加索引的分片数。所以这带来了我的问题:

假设您创建了一个索引,指定了预期流量/数据量的分片数量,并且超出了您的预期,您没有足够的分片来处理写入请求和索引的大小,您怎么能管理这种情况?

2 个答案:

答案 0 :(得分:1)

我想我找到了一种方法,如果知道ElasticSearch的人可以确认它会很好用,那就太好了。

我刚读过这篇文章,最后一节激发了我的想法:

http://www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/

这个想法是创建两个别名(index_search和index_write),它们指向同一个索引(让我们称之为index_1)。想象一下,有一天index_1中的分片数量不够,在这种情况下,我们可以使用相同的映射和分片数创建一个新索引(让我们称之为index_2),如果我们可以添加到index_1本来可以做到的。

然后,我们更新别名index_search,使其指向“index_1,index_2”(index_1和index_2),就像在两个索引上进行搜索一样。然后,我们将index_write更新为index_2,因此只会对新的分片进行写入,因为index_1的分片被认为已满。

将来我们可以添加一个新索引(index_3)并将index_search映射到“index_1,index_2,index_3”。

当然在我们的应用程序中,我们总是使用别名而不是像这样的索引的真实名称,转换将对应用程序不可见,我们不必更改应用程序的代码。

使用Sense语法的示例:

PUT index_1
{
    "settings": {
        "number_of_shards": 1
    }
}

POST _aliases
{
    "actions": [
       {
          "add": {
             "index": "index_1",
             "alias": "index_search"
          }
       },
        {
          "add": {
             "index": "index_1",
             "alias": "index_write"
          }
       }
    ]
}

PUT index_write/article/1
{
    "title":"One first index",
    "article":"This is an article that is indexed on index_1"
}

PUT index_2
{
    "settings": {
        "number_of_shards": 2
    }
}

POST _aliases
{
    "actions": [
       {
          "add": {
             "index": "index_2",
             "alias": "index_search"
          }
       },
        {
          "add": {
             "index": "index_2",
             "alias": "index_write"
          }
       },
        {
          "remove": {
             "index": "index_1",
             "alias": "index_write"
          }
       }
    ]
}

PUT index_write/article/2
{
    "title":"One second index",
    "article":"This is an article that is indexed on index_2"
}

此解决方案的问题是,如果您在index_1上更新index_1上的文档而index_write指向index_2,则会复制它。这意味着你必须在更新它之前搜索它才能找到真正的索引。 此外,您不能使用ID为一个index_write的GET命令。

答案 1 :(得分:0)

在这种情况下,我们需要删除所有索引数据并增加分片并重新索引所有数据..

有关更多信息,请参阅以下链接

http://m.youtube.com/watch?v=lpZ6ZajygDY