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 つのアクティブなシャードしか使用していません。いくつかの質問が突然頭に浮かびました。
- シャードの数を 20 に増やすと、ここで役に立ちますか?
- ES クエリをキャッシュすることも可能です -- 同じことをお勧めしますか? ――メリット・デメリットはありますか?
時間を短縮し、ES の作業をより効率的にする方法を見つけるのを手伝ってください。
アップデート
ここに小さなコード スニペットhttps://jsfiddle.net/puneetpandey/wpbohqrh/2/があります。ElasticSearchへの呼び出しが非常に多く必要な理由を正確に示すために (参照として) 作成しました。
上記の例では、(各チェックボックス要素の前に) いくつかのカウントを表示しています。これらのカウントを表示するには、ES を押して取得した数値を取得する必要があります
わかりましたので、コメントを読んだ後、ここで良い記事を見つけました:検索で最高のパフォーマンスを得るために1つのサーバーでelasticsearchクラスターを構成する方法私は再構築するのに十分だと思います
一番、
プニート