Attention : Amazon Linux 2 がリリースされており、この記事は古くなっています。
皆さん、AWSというものをご存じでしょうか。
Amazonがやっている、クラウド基盤提供サービスです。
クラウドとは何かというともう幅が広すぎて説明できませんが、Amazonはそのクラウドで全方位的に幅広くサービスを提供しています。
ECサイトよりAWSの方が儲かっているらしいです。
この記事は、すでに立ち上がりつつあるサービスの貧弱なインフラをAWSに切り替えるまでの足跡です。
AWSのインスタンスを立ち上げ、Elasticseachやその他ミドルウェアをインストール/設定していきます。
Elasticsearchとは
公式サイトによると、
Elasticsearchは、様々なユースケースを解決する、分散型RESTful検索/分析エンジンです。予期した結果や、そうでないものまで検索できるようにデータを格納するElastic Stackの中核です。
というものだということですが、我々が構築しようとしているWebサービスでは検索エンジンとして利用しています。
従来のRDBという種類のデータベースとは異なり、全文検索などの利用シーンで非常に高速に動作します。
既存環境
ざっと以下のような構成です。
OS:CentOS 7
Elasticsearch 5.5
nginx 1.10.2
php-fpm
MariaDb 10.2.6
最大のボトルネックはメモリが1GBしかないということです。
そのためElasticsearchのメモリ設定を512MBに抑えていますが仮想メモリを3GBも使うという、SWAPが忙しすぎます。
遅いだけならまだしも、ElasticsearchのbulkAPIを使った、ドキュメントを登録するためのJavaバッチでElasticsearchが落ちてしまいます。
これは話になりません。
Elasticsearchを動かすだけでも話にならない容量なのに、そこにMariaDbも動かしてしまっています。
こちらも仮想メモリを1.6GB使っていて、よくOSが落ちないものです。
今のところほとんどアクセスがないので、nginxについては特に問題がありません。
php-fpmについては起動プロセスを最小限に抑えて、爪の先に明かりを灯すかのようにメモリを節約しています。
全然足りませんが。
また今回、ストレージもHDDなので、SSDに変更してパフォーマンス向上を狙っています。
Elasticsearchのインストール
まずサービスに必要なElasticsearchをインストールしました。
また、今回はkuromojiもインストールしています。
以下の公式ブログページの記事を参考にしました。
Amazon EC2 を使用して Elasticsearch クラスタをセットアップする
そのままのタイトルです。
ありがたい。
インスタンスを立ち上げるまでの操作は様々なドキュメントや記事などがありますので割愛します。
ダウンロードとインストール
Javaの確認
まず、Javaが入っていないと話になりません。
$ java -version java version "1.7.0_151" OpenJDK Runtime Environment (amzn-2.6.11.0.74.amzn1-x86_64 u151-b00) OpenJDK 64-Bit Server VM (build 24.151-b00, mixed mode)
ちゃんと入っています。
入っていますが、1.7ではダメなことが後で発覚します。
ElasticsearchのパッケージURLの確認
Elasticsearchのダウンロードサイトで最新のインストールパッケージを確認します。
私の既存環境では5.5を使っていますが、現在の最新版は5.6です。
ドキュメントについては移行しないので、バージョンアップのリスクはないものと思います。
ただ、5.5のライブラリでプログラミングしているJavaバッチが実行できるかどうか、というリスクはあります。
マイナーバージョンの違いなので、さほど心配はしていませんが。
Elasticsearchのインストール
最新版rpmファイルのURLを確認したらインストール
$ sudo rpm -i https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.3.rpm warning: /var/tmp/rpm-tmp.1IAGhB: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY Creating elasticsearch group... OK Creating elasticsearch user... OK ### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using chkconfig sudo chkconfig --add elasticsearch ### You can start elasticsearch service by executing sudo service elasticsearch start
しかし、何かワーニングが出ています。
普段rpmを使わないので意味が分かりませんでしたが、調べてみたところrpmパッケージに署名がありませんよ、ということのようです。
無視することにします。
Elasticsearchが自動起動するように設定します。
systemctl
かと思いきや、chkconfig
。
$ sudo chkconfig --add elasticsearch
kuromojiのインストール
引き続いて、kuromojiをインストールします。
先の記事ではbin/plugin install
を使うように記載がありますが、binの中にはplugin
というファイルはなく、elasticsearch-plugin
というシェルスクリプトがあるので、こちらを使うのでしょう。
$ cd /usr/share/elasticsearch/ $ sudo bin/elasticsearch-plugin install analysis-kuromoji Exception in thread "main" java.lang.UnsupportedClassVersionError: org/elasticsearch/plugins/PluginCli : Unsupported major.minor version 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:803) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:442) at java.net.URLClassLoader.access$100(URLClassLoader.java:64) at java.net.URLClassLoader$1.run(URLClassLoader.java:354) at java.net.URLClassLoader$1.run(URLClassLoader.java:348) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:347) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:312) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
Javaらしく派手に怒られました。
どうやらJava8ではないとダメなようです。
Javaのバージョンアップ
一旦、インストール済みのJava7をアンインストールし、Java8を入れます。
$ yum list installed | grep java java-1.7.0-openjdk.x86_64 1:1.7.0.151-2.6.11.0.74.amzn1 installed javapackages-tools.noarch 0.9.1-1.5.amzn1 installed tzdata-java.noarch 2017b-1.69.amzn1 installed $ sudo yum -y remove java-1.7.0-openjdk.x86_64 Loaded plugins: priorities, update-motd, upgrade-helper Resolving Dependencies --> Running transaction check ---> Package java-1.7.0-openjdk.x86_64 1:1.7.0.151-2.6.11.0.74.amzn1 will be erased 中略 Dependency Removed: aws-apitools-as.noarch 0:1.0.61.6-1.0.amzn1 aws-apitools-common.noarch 0:1.1.0-1.9.amzn1 aws-apitools-ec2.noarch 0:1.7.3.0-1.0.amzn1 aws-apitools-elb.noarch 0:1.0.35.0-1.0.amzn1 aws-apitools-mon.noarch 0:1.0.20.0-1.0.amzn1 Complete!
依存関係にaws-apitoolsなどと出てきましたが、やってはいけないことをやってしまったんでしょうか・・・
今のところこのインスタンスからAWSのAPIを叩くつもりはないので、無視することにします。
Java8をインストールします。
$ sudo yum -y install java-1.8.0-openjdk.x86_64 Loaded plugins: priorities, update-motd, upgrade-helper Resolving Dependencies --> Running transaction check ---> Package java-1.8.0-openjdk.x86_64 1:1.8.0.141-1.b16.32.amzn1 will be installed 中略 Dependency Installed: copy-jdk-configs.noarch 0:1.2-1.2.amzn1 java-1.8.0-openjdk-headless.x86_64 1:1.8.0.141-1.b16.32.amzn1 lksctp-tools.x86_64 0:1.0.10-7.7.amzn1 Complete! $ java -version openjdk version "1.8.0_141" OpenJDK Runtime Environment (build 1.8.0_141-b16) OpenJDK 64-Bit Server VM (build 25.141-b16, mixed mode)
Elasticsearchを起動します。
$ sudo service elasticsearch start Starting elasticsearch: [ OK ] $ curl -XGET http://localhost:9200/ { "name" : "DwsjPqq", "cluster_name" : "elasticsearch", "cluster_uuid" : "48W2XBvGTKaWeQ1Y4CGNlA", "version" : { "number" : "5.6.3", "build_hash" : "1a2f265", "build_date" : "2017-10-06T20:33:39.012Z", "build_snapshot" : false, "lucene_version" : "6.6.1" }, "tagline" : "You Know, for Search" }
kuromojiのインストール リトライ
さて、先ほど失敗したkuromojiをインストールします。
$ sudo bin/elasticsearch-plugin install analysis-kuromoji -> Downloading analysis-kuromoji from elastic [=================================================] 100% -> Installed analysis-kuromoji $ sudo service elasticsearch restart Stopping elasticsearch: [ OK ] Starting elasticsearch: [ OK ] curl localhost:9200/_cat/plugins?v name component version DwsjPqq analysis-kuromoji 5.6.3
インストールが完了しました。
関連記事:AWSにnginxをインストール