1

我目前正在探索解决方案,以便为大量文档数据存档和提供网络搜索引擎。我首先开始寻找搜索引擎解决方案,最终得出的结论是,当您必须处理大量数据时,Elasticsearch 是最好的解决方案之一。我读过它可以轻松扩展并且开箱即用,我对此深信不疑。

然后我查看了 No SQL 数据库,由于参与者的数量,我在搜索上花费了更多时间,并且我阅读了一些资源(No SQL 提炼、Amazon Dynamo 论文、Google BigTable 论文等),这些资源使我获得了更好的对分布式系统的总体理解。我还看到,大多数 No SQL 可扩展数据库都能够在分片变得太大时自动将分片分成两个分片。

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

我们不能在他创建后增加索引的分片数。所以这带来了我的问题:

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

4

2 回答 2

1

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

我刚刚阅读了这篇文章,最后一节启发了我这个想法:

http://www.elasticsearch.org/blog/chang-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_write 指向 index_2,它会复制它。这意味着您必须在更新之前搜索它才能找到真正的索引。此外,您不能使用 ID 为 1 index_write 的 GET 命令。

于 2014-03-11T08:14:04.277 回答
0

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

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

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

于 2014-03-11T02:43:23.237 回答