アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

SolrCloud で Solr を冗長化する

こんにちは、tahara です。

EC2 はとてもいいのですが、たまにインスタンスが勝手にリブートしたりするんですよね。 わかっています。Multi-AZ 配置にしましょう、ということですよね。

ということで SolrCloud で Solr を冗長化しました。

次のような構成で1シェード、2レプリカです。

  • ap-northeast-1a
    • サーバ1
      • Solr(レプリカ1)
      • ZooKeeper
  • ap-northeast-1c
    • サーバ2
      • Solr(レプリカ2)
      • ZooKeeper
    • サーバ3
      • ZooKeeper

ZooKeeper は多数決をおこなうので、サーバ3は Solr なしで ZooKeeper だけ動かしています。

設定は https://cwiki.apache.org/confluence/display/solr/SolrCloud に書いてあるとおりやれば特に問題なく簡単にできます。

Solr の schema.xml などを変更する場合、Solr の設定ファイルは ZooKeeper 管理になるのでちょっとしたコマンドをたたく必要があります。 次のような Capistrano タスクを作成しました。

set :solr_host, 'ec2-56-111-111-111.ap-northeast-1.compute.amazonaws.com'
namespace :solr do
  desc '設定ファイルのリロード'
  task :reload, hosts: solr_host do
    run "/opt/solr/scripts/cloud-scripts/zkcli.sh -zkhost localhost:2181 -cmd upconfig -confdir /opt/solr/solr/outing/conf -confname outing"
    run "curl -s 'http://localhost:8983/solr/admin/collections?action=RELOAD&name=outing&wt=json'"
  end
end

1つの Solr サーバに対して実行すれば他の Solr サーバにも反映されます。

ここで注意ずべきことは、必ず Solr の zkcli.sh を使うこと。 ZooKeeper の bin/zkCli.sh を使ってしまうと動かなくて半日無駄にしてしまいます。

あとひっかかったのが ZooKeeper が次のようなログが出して動いてくれないことでした。

2014-10-17 04:05:46,507 [myid:1] - INFO  [WorkerSender[myid=1]:QuorumCnxManager@193] - Have smaller server identifier, so dropping the connection: (2, 1)

EC2 特有のインスタンスを stop & start したら IP が変ってしまうのが原因のようで、 他のサーバの ZooKeeper を1つずつ再起動していったら、ちゃんと動くようになりました。

ZooKeeper を指定して Solr を起動するだけで、設定らしい設定をすることなくシェード、 レプリカを増やせる SolrCloud はとてもいいですね。 MySQL のマスター、スレーブ構成とは違い、どの Solr サーバに対しても参照、更新リクエストをなげられるのはとても便利です。

また Multi-AZ 配置で冗長化したため Solr のアクセスがアベイラビリティゾーンをまたぐ必要がなくなり、 アプリのレスポンスタイムが 10ms くらい向上しました。

これでいこーよは完全に Multi-AZ 配置になりました。 アベイラビリティゾーンが1つつぶれてもサービスがとまらないということが週末の心のやすらぎに大きく貢献してくれる、 というのが今回の一番大きな発見でした。

最後に、 おでかけ先探しに悩むパパ・ママを助けてくれるエンジニアを募集していますので、 よろしくお願いします。