CentOS7 + Elasticsearch クラスター 構築

今更だけど、elasticsearchを導入する。モチベーションは、とりあえずダッシュボードとしてkibanaを使っていきたいから。手癖の悪いクローラーが来ると、wordpressのレスポンスがスローダウンするんだけど、いちいちaccess.log見て調べるのも億劫なので、普段から簡単に見れるようにしておきたい。おいおいは全文索引の検索エンジンとしても使っていくつもり。検索エンジンというカテゴリで考えれば、もう幾つか選択肢はあるんだけど、esはクラスターとしての運用が考慮されているのが素敵。

検索エンジンは一般的にデータの増加に伴って2次関数的な性能の劣化を引き起こす。それを回避するために、データ構造に合わせたスケールアウトが必要となる。esはそのためindexをshardと呼ばれる単位で分割して管理する。動的にノード数を増やすことで、replica数を増やしたり、indexのsubsetであるshardのノード配置を組み替えて、性能を最適化してくれる。ただし、このshard数については動的に変更できないので、成長しそうなindexは予め多くのshardに分けておくなどの工夫が必要となる。

昔は自力で索引分割したり、更新処理の中でreplicaを作ったりしてスケールアウトしていたことを思い返すと、本当に便利な時代になったと、しみじみ感じてしまう。ともあれ、うちのwordpressのaccess解析程度であれば、1台でも多いくらい。冗長性を考慮して最低数の2台にしておけば充分。ホスト名はそれぞれes1とes2と仮定する。まずは1台目を構築する。centos7はyumでinstallできるので楽。以下のような感じでインストールしてサービスを起動する。

cat<<EOF>/etc/yum.repos.d/es.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
yum install elasticsearch
systemctl start elasticsearch
curl http://localhost:9200/

最後のcurlは動作確認なので、正しく起動していればesがホスト名やバージョンを返してくれる。これで1台目が完成。同様の手順で2台目を構築する。2台のesが出来たら、これをクラスターとして認識させる。以下のようなelasticsearch.ymlを用意して、それぞれ再起動していく。

vi /etc/elasticsearch/elasticsearch.yml
    :
cluster.name: es
node.name: ${HOSTNAME}
network.host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ['es1','es2']
discovery.zen.minimum_master_nodes: 1

systemctl restart elasticsearch
curl http://es1:9200/_cat/nodes

discoveryの設定は、split-brainを防ぐ目的のものなんだけど、我が家でネットワークレベルのsplit-brainはまず起きないと考えているので、かなり緩めの設定となっている。一方がネットワークダウンすることによるsplit-brainはありうるが、その場合は更新も止まるのでよしとする。es1を再起動したら、es2にも同じ設定を行ってから再起動する。これで2台はクラスターとして認識しあうはず。最後のcurlコマンドでクラスターノードを確認できる。

esデフォルトのnumber_of_replicasは1なので、索引を作れば必ずもう一方のノードにreplicaを作ろうとする。作れなければhealthがyellow扱いになるので、索引を作ってhealthがgreenであれば、クラスターとしてうまく機能していると判断できる。おまけ程度の確認方法を最後に載せておくので参照されたし。

curl -XPUT http://es1:9200/test
curl http://es1:9200/_cat/indices/test
curl -XDELETE http://es1:9200/test

スケールアウトの運用管理が抜群に楽できるelasticsearch。昔ながらの検索エンジンを触っていた人間からすれば夢のようなミドルウェア。欲を言えば、cassandraのような動的なshardingにも対応してくれると尚嬉しい。これだけのクラスター機能を生かすほどのデータを扱う機会はそうそうないかもしれないけど、いざ?というときのために是非とも使いこなしておきたい。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)