2

Ruby on Railsプロジェクトの 1 つでElasticsearch - Bonsaiを使用しています。そのため、これまでのところは非常にスムーズに進んでいました。しかし、このアプリケーションをエンドユーザーに公開し、人々が入り始めた瞬間、単一のelasticsearchクエリが応答するのに5〜7秒かかることに気付きました(私たちにとっては本当に悪い経験です)-しかし、8〜2倍のWebがありますダイノが配置されています。

そこで、BonsaiアドオンをBonsai 10にアップグレードし、 NewRelicアドオンも追加することにしました (単一のクエリが応答するのにかかる時間を監視するため)。

以下は私たちの環境設定です:

Ruby: 2.2.4
Rails: 4.2.0
elasticsearch: 1.0.15
elasticsearch-model: 0.1.8

そのため、データを Elasticsearch に再度インポートしました。ElasticSearchクラスターの状態は次のとおりです。

pry(main)> Article.__elasticsearch__.client.cluster.health
=> {"cluster_name"=>"elasticsearch",
    "status"=>"green",
    "timed_out"=>false,
    "number_of_nodes"=>3,
    "number_of_data_nodes"=>3,
    "active_primary_shards"=>1,
    "active_shards"=>2,
    "relocating_shards"=>0,
    "initializing_shards"=>0,
    "unassigned_shards"=>0,
    "delayed_unassigned_shards"=>0,
    "number_of_pending_tasks"=>0,
    "number_of_in_flight_fetch"=>0}

以下は、 ESコールのNewRelicのデータです

ここに画像の説明を入力

これは、心配する大きな理由を示しています。

以下の私のモデルarticle.rb

class Article < ActiveRecord::Base
  include Elasticsearch::Model

  after_commit on: [:create] do
    begin
      __elasticsearch__.index_document
    rescue Exception => ex
      logger.error "ElasticSearch after_commit error on create: #{ex.message}"
    end
  end

  after_commit on: [:update] do
    begin
      Elasticsearch::Model.client.exists?(index: 'articles', type: 'article', id: self.id) ? __elasticsearch__.update_document :     __elasticsearch__.index_document
    rescue Exception => ex
      logger.error "ElasticSearch after_commit error on update: #{ex.message}"
    end
  end

  after_commit on: [:destroy] do
    begin
      __elasticsearch__.delete_document
    rescue Exception => ex
      logger.error "ElasticSearch after_commit error on delete: #{ex.message}"
    end
  end

  def as_indexed_json(options={})
    as_json({
      only: [ :id, :article_number, :user_id, :article_type, :comments, :posts, :replies, :status, :fb_share, :google_share, :author, :contributor_id, :created_at, :updated_at ],
      include: {
        posts: { only: [ :id, :article_id, :post ] },
      }
    })
  end
end

さて、 Herokuの BONSAI 10 プランを見ると、20 個のシャードが得られますが、現在のクラスターの状態では、1 つのアクティブなプライマリ シャードと 2 つのアクティブなシャードしか使用していません。いくつかの質問が突然頭に浮かびました。

  1. シャードの数を 20 に増やすと、ここで役に立ちますか?
  2. ES クエリをキャッシュすることも可能です -- 同じことをお勧めしますか? ――メリット・デメリットはありますか?

時間を短縮し、ES の作業をより効率的にする方法を見つけるのを手伝ってください。

アップデート

ここに小さなコード スニペットhttps://jsfiddle.net/puneetpandey/wpbohqrh/2/があります。ElasticSearchへの呼び出しが非常に多く必要な理由を正確に示すために (参照として) 作成しました。

上記の例では、(各チェックボックス要素の前に) いくつかのカウントを表示しています。これらのカウントを表示するには、ES を押して取得した数値を取得する必要があります

わかりましたので、コメントを読んだ後、ここで良い記事を見つけました:検索で最高のパフォーマンスを得るために1つのサーバーでelasticsearchクラスターを構成する方法私は再構築するのに十分だと思います

一番、

プニート

4

2 に答える 2

1

ここで盆栽とニック。サポート チーム (support@bonsai.io) にご連絡いただければ、パフォーマンスに関する質問にいつでも喜んで対応いたします。また、より詳細なログにアクセスして、その解決に役立てることができます。それまでの間、ここで十分に一般的なアドバイスを共有できると思います…</p>

この場合、New Relic レポートの興味深い統計は「平均呼び出し数 (txn あたり): 109」です。私の理解が正しければ、あなたのアプリは Web リクエストごとに Elasticsearch を平均 100 回以上呼び出しているようです。異常に高いそうです。

その 3,000 ミリ秒が 100 以上のリクエストすべてで平均される場合、それは Elasticsearch へのリクエストごとに約 30 ミリ秒です。これも通常の平均より少し遅いですが、1 回のリクエストで 3,000 ミリ秒よりもはるかに妥当です。(よりプライベートなサポート通信を通じて、より具体的な番号を共有することができます。)

Elasticsearch リクエストの数を減らすことに集中したい場合があります。リクエストの合計を減らすことができない場合は、それらを組み合わせて、リクエストごとおよび接続ごとのオーバーヘッドを節約することを検討してください。Bonsai は HTTP キープアライブもサポートしているため、リクエスト間で接続を再利用できるため、最初の TLS ハンドシェイクのオーバーヘッドを削減できます。

更新を統合するには、Bulk APIを使用できます。検索用のMulti Search APIと、単一ドキュメントの取得要求用のMulti Get APIもあります。

削減と統合の両方が不可能な場合は、これらすべての検索を個別に行うために重要な別のユース ケースがある可能性があります。その場合は、UI で Ajax を使用してこれらの検索をポストロードすることをお勧めします。こうすることで、アプリは最初の応答を迅速に提供し、進行状況をユーザーに表示しながら、残りの部分を徐々に埋めていくことができます。

于 2016-03-06T03:34:04.580 に答える
0

3 つの ES ノードがあり、最適なパフォーマンスを得るには、ノードごとに少なくとも 1 つのシャードが必要です。Heroku はおそらく別のことを報告します。シャードは、ES クラスター自体ではなく、ES 内の特定のインデックスのプロパティであるため、インデックスに含まれるシャードの数を確認してください。しかし、シャードが 1 つでも、クエリがそれほど遅くなることはありません。おそらく、ドキュメントのインデックスが間違った方法で作成された可能性があります。インデックス、クエリ、負荷に関する情報が少なすぎます。

キャッシングは、他のストレージ システムと同じように役立ちますが、短所と長所は常に同じです。

于 2016-03-05T16:42:06.957 に答える