1

私は現在、膨大なドキュメント データをアーカイブし、Web 検索エンジンを提供するためのソリューションを模索しています。最初に検索エンジン ソリューションを探して検索を開始しましたが、大量のデータを処理する必要がある場合、Elasticsearch が最適なソリューションの 1 つであるという結論に達しました。簡単にスケーリングでき、箱から出してすぐに使用できることを読んで、確信しました。

次に、No SQL データベースについて調べました。アクターの数が多かったため、検索により多くの時間を費やしました。いくつかのリソース (SQL 蒸留なし、Amazon Dynamo の論文、Google BigTable の論文など) を読んだことで、より良い方法にたどり着きました。一般的な分散システムの理解。また、ほとんどの No SQL スケーラブル データベースには、シャードが大きくなりすぎたときに、シャードを 2 つのシャードに自動的に分割する機能があることも確認しました。

その後、Elasticsearch がこの機能を提供していないことに気付きました。さらに、ドキュメントを信じて: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-update-settings.html

作成後にインデックスのシャード数を増やすことはできません。だからこれは私の質問をもたらします:

予想されるトラフィック/データ量に対してシャード数を指定してインデックスを作成し、ある日、予想を超えて、書き込み要求とインデックスのサイズを処理するのに十分なシャードがなくなったとします。この状況をどのように管理できますか?

4

2 に答える 2

1

私は方法を見つけたと思います.ElasticSearchをよく知っている人がそれがうまく機能することを確認できれば、それは素晴らしいことです.

この記事を読んだばかりで、最後のセクションから次のアイデアが思い浮かびました。

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

アイデアは、先頭で同じインデックス (index_1 と呼びましょう) を指す 2 つのエイリアス (index_search と index_write) を作成することです。ある日、index_1 のシャードの数が十分ではないと想像してください。この場合、同じマッピングとシャードの数で新しいインデックス (index_2 と呼びましょう) を作成できます。できたかもしれません。

次に、エイリアス index_search を更新して、"index_1, index_2" (index_1 と index_2 の両方) を指すようにします。これにより、2 つのインデックスで検索が行われるようになります。次に、index_write を index_2 に更新します。これにより、index_1 のシャードがいっぱいであると見なされるため、新しいシャードに対してのみ書き込みが行われます。

将来的には、新しいインデックス (index_3) を追加し、index_search を「index_1、index_2、index_3」にマップすることができます。

もちろん、私たちのアプリケーションでは常にエイリアスを使用し、そのようなインデックスの実際の名前は決して使用しません。変換はアプリケーションからは見えず、アプリケーションのコードを変更する必要はありません。

センス構文を使用した例:

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_write が index_2 をポイントしているときに index_1 のドキュメントを更新すると、そのコピーが作成されることです。これは、実際のインデックスを見つけるために、更新する前に検索する必要があることを意味します。さらに、id one index_write で GET コマンドを使用することはできません。

于 2014-03-11T08:14:04.277 に答える