CentOS7にElasticsearchをインストールして設定する方法
著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Elasticsearch は、データをリアルタイムで分散検索および分析するためのプラットフォームです。 その人気は、その使いやすさ、強力な機能、およびスケーラビリティによるものです。
ElasticsearchはRESTful操作をサポートしています。 これは、HTTPメソッド(GET
、POST
、PUT
、DELETE
など)をHTTP URI(/ collection /エントリ)データを操作します。 直感的なRESTfulアプローチは、開発者とユーザーの両方に優しいものであり、これがElasticsearchの人気の理由の1つです。
Elasticsearchは無料のオープンソースソフトウェアであり、その背後には確固たる会社があります—Elastic。 この組み合わせにより、個人テストから企業統合まで、多くのユースケースに適しています。
この記事では、Elasticsearchを紹介し、Elasticsearchをインストール、構成、および使用を開始する方法を示します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- 1GB以上のメモリとroot以外のsudoユーザーを備えたCentOS7を実行しているサーバー。 詳細な手順については、 CentOS7の初期サーバーセットアップガイドをご覧ください。
- サーバーにwgetinstalled
ステップ1—CentOS7へのJavaのインストール
ElasticsearchはJavaプログラミング言語で書かれています。 したがって、最初のタスクは、サーバーにJavaランタイム環境(JRE)をインストールすることです。 JREにはネイティブのCentOSOpenJDKパッケージを使用します。 このJREは無料で、十分にサポートされており、CentOSYumインストールマネージャーを介して自動的に管理されます。
OpenJDK8の最新バージョンをインストールします。
- sudo yum install java-1.8.0-openjdk.x86_64
次に、インストールを確認します。
- java -version
このコマンドは、次のような出力を作成します。
Outputopenjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)
Elasticsearchの使用を進めて、より優れたJavaパフォーマンスと互換性を探し始めたら、Oracle独自のJava(Oracle JDK 8)をインストールすることを選択できます。 詳細については、CentOSおよびFedoraにJavaをインストールする方法に関する記事を参照してください。
ステップ2—CentOS7へのElasticsearchのダウンロードとインストール
Elasticsearchは、zip
、tar.gz
、deb
、またはrpm
パッケージのelastic.coから直接ダウンロードできます。 CentOSの場合は、ネイティブのrpm
パッケージを使用するのが最適です。これにより、Elasticsearchの実行に必要なすべてのものがインストールされます。
この記事の執筆時点では、Elasticsearchの最新バージョンは7.9.2です。
選択した作業ディレクトリから、プログラムをダウンロードします。
- wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-x86_64.rpm
次に、rpm
コマンドを使用してインストールします。
- sudo rpm -ivh elasticsearch-7.9.2-x86_64.rpm
Elasticsearchは/usr/share/elasticsearch/
にインストールされ、構成ファイルは/etc/elasticsearch
に配置され、初期化スクリプトは/etc/init.d/elasticsearch
に追加されます。
Elasticsearchがサーバーで自動的に開始および停止するようにするには、そのinitスクリプトをデフォルトのランレベルに追加します。
- sudo systemctl enable elasticsearch.service
Elasticsearchをインストールしたら、いくつかの重要な設定を構成します。
ステップ3—CentOS7でのElasticsearchの設定
ElasticsearchとそのJava依存関係をインストールしたので、Elasticsearchを構成します。
Elasticsearch構成ファイルは/etc/elasticsearch
ディレクトリにあります。 レビューおよび編集するものは次のとおりです。
-
elasticsearch.yml
—Elasticsearchサーバーの設定を構成します。 これはほとんどのオプションが保存される場所であり、それが私たちがこのファイルに主に関心を持っている理由です。 -
jvm.options
—メモリ設定などのJVMの構成を提供します。
Elasticsearchサーバーでカスタマイズする最初の変数は、elasticsearch.yml
のnode.name
とcluster.name
です。 今それをしましょう。
それらの名前が示すように、node.name
は、サーバー(ノード)と後者が関連付けられているクラスターの名前を指定します。 これらの変数をカスタマイズしない場合、サーバーのホスト名に関してnode.name
が自動的に割り当てられます。 cluster.name
は、デフォルトのクラスターの名前に自動的に設定されます。
cluster.name
値は、Elasticsearchの自動検出機能によって使用され、Elasticsearchノードを自動的に検出してクラスターに関連付けます。 したがって、デフォルト値を変更しないと、クラスター内の同じネットワーク上に不要なノードが見つかる可能性があります。
メインのelasticsearch.yml
構成ファイルの編集を始めましょう。
nano
またはお好みのテキストエディタを使用して開きます。
- sudo nano /etc/elasticsearch/elasticsearch.yml
node.name
およびcluster.name
の行頭の#
文字を削除してコメントを解除し、値を変更します。 /etc/elasticsearch/elasticsearch.yml
ファイルでの最初の構成変更は次のようになります。
...
node.name: "My First Node"
cluster.name: mycluster1
...
ネットワーク設定はelasticsearch.yml
にもあります。 デフォルトでは、Elasticsearchはポート9200のローカルホストでリッスンするため、同じサーバーのクライアントのみが接続できます。 Elasticsearchのオープンソースおよび無料版は認証機能を提供していないため、セキュリティの観点からこれらの設定は変更しないでください。
もう1つの重要な設定は、node.roles
プロパティです。 これは、master-eligible
(構成ではmaster
のみ)、data
、またはingest
に設定できます。
master-eligible
の役割は、クラスターの正常性と安定性に責任があります。 多くのクラスターノードを使用する大規模な展開では、master
の役割のみを持つ複数の専用ノードを用意することをお勧めします。 通常、専用のmaster
ノードは、データの保存もインデックスの作成も行いません。 したがって、クラスターの状態が危険にさらされる可能性がある過負荷になる可能性はありません。
data
ロールは、データを格納するノードを定義します。 データノードが過負荷になった場合でも、追加の負荷をかける他のノードがあれば、クラスターの状態に深刻な影響を与えることはありません。
最後に、ingest
の役割により、ノードはデータストリームを受け入れて処理できます。 大規模なセットアップでは、master
およびdata
ノードで発生する可能性のある過負荷を回避するために、専用のingest
ノードが必要です。
注: 1つのノードに1つ以上の役割があり、Elasticsearchセットアップのスケーラビリティ、冗長性、および高可用性を実現できます。 デフォルトでは、これらの役割はすべてノードに割り当てられています。 これは、この記事で説明するシナリオ例のように、単一ノードのElasticsearchに適しています。 したがって、役割を変更する必要はありません。 それでも、ノードをmaster
として専用にするなど、役割を変更する場合は、次のように/etc/elasticsearch/elasticsearch.yml
を変更することで変更できます。
...
node.roles: [ master ]
...
変更を検討するもう1つの設定は、path.data
です。 これにより、データが保存されるパスが決まります。デフォルトのパスは/var/lib/elasticsearch
です。 本番環境では、Elasticsearchデータを保存するために専用のパーティションとマウントポイントを使用することをお勧めします。 最良の場合、この専用パーティションは、より優れたパフォーマンスとデータ分離を提供する別個のストレージメディアになります。 path.data
行のコメントを解除し、その値を次のように変更することで、別のpath.data
パスを指定できます。
...
path.data: /media/different_media
...
すべての変更を行ったので、elasticsearch.yml
を保存して閉じます。
jvm.options
でも構成を編集する必要があります。
ElasticsearchはJVMによって実行されることを思い出してください。 本質的にはJavaアプリケーションです。 したがって、他のJavaアプリケーションと同様に、ファイル/etc/elasticsearch/jvm.options
で構成できるJVM設定があります。 特にパフォーマンスに関して最も重要な設定の2つは、Xms
とXmx
で、最小値(Xms
)と最大値(Xmx
)を定義します。メモリ割り当て。
デフォルトでは、両方とも1GB
に設定されていますが、これが最適になることはほとんどありません。 それだけでなく、サーバーに1GBのRAMしかない場合、デフォルト設定でElasticsearchを起動することはできません。 これは、オペレーティングシステムが少なくとも100MBを使用するため、Elasticsearchに1GBを割り当てることができないためです。
残念ながら、メモリ設定を計算するための普遍的な公式はありません。 当然、割り当てるメモリが多いほどパフォーマンスは向上しますが、サーバー上の残りのプロセス用に十分なメモリが残っていることを確認してください。 たとえば、マシンに1GBのRAMがある場合、Xms
とXmx
の両方を512MB
に設定して、残りのプロセスにさらに512MBを許可できます。 通常、JVMガベージコレクションのパフォーマンスの低下を回避するために、Xms
とXmx
の両方が同じ値に設定されることに注意してください。
サーバーにRAMが1GBしかない場合は、この設定を編集する必要があります。
jvm.options
を開きます:
- sudo nano /etc/elasticsearch/jvm.options
次に、Xms
とXmx
の値を512MB
に変更します。
...
-Xms512m
-Xmx512m
...
ファイルを保存して終了します。
次に、Elasticsearchを初めて起動します。
- sudo service elasticsearch start
Elasticsearchを使用する前に、Elasticsearchが起動するまで少なくとも10秒待ちます。 そうしないと、接続エラーが発生する可能性があります。
注:すべてのElasticsearch設定が設定され、構成ファイルに保持されているわけではないことを知っておく必要があります。 代わりに、index.number_of_shards
やindex.number_of_replicas
などの一部の設定はAPIを介して設定されます。 1つ目は、インデックスが分割されるピース(シャード)の数を決定します。 2つ目は、クラスター全体に分散されるレプリカの数を定義します。 シャードを増やすとインデックス作成のパフォーマンスが向上し、レプリカを増やすと検索が速くなります。
単一ノードでElasticsearchを引き続き調査およびテストしていると仮定すると、次のcurlコマンドを実行して、これらの設定を試して変更することができます。
- curl -XPUT -H 'Content-Type: application/json' 'http://localhost:9200/_all/_settings?preserve_existing=true' -d
- '{
- "index.number_of_replicas" : "0",
- "index.number_of_shards" : "1"
}'
Elasticsearchをインストールして構成したら、サーバーを保護してテストします。
ステップ4—(オプション)CentOS7でElasticsearchを保護する
Elasticsearchにはセキュリティが組み込まれておらず、HTTPAPIにアクセスできる人なら誰でもそれを制御できます。 このセクションは、Elasticsearchを保護するための包括的なガイドではありません。 それとそれが実行されているサーバー/仮想マシンへの不正アクセスを防ぐために必要な対策を講じてください。
デフォルトでは、Elasticsearchはローカルホストネットワークインターフェースでのみリッスンするように設定されています。 リモート接続はできません。 次のいずれかまたは両方の対策を講じていない限り、この設定は変更しないでください。
- TCPポート9200へのアクセスを、iptablesを使用する信頼できるホストにのみ制限しました。
- 信頼できるホスト間にvpnを作成し、vpnの仮想インターフェイスの1つでElasticsearchを公開します。
上記を実行した後でのみ、Elasticseachがローカルホスト以外の他のネットワークインターフェイスでリッスンできるようにすることを検討する必要があります。 このような変更は、たとえば、別のホストからElasticsearchに接続する必要がある場合に考慮される可能性があります。
ネットワークの露出を変更するには、ファイルelasticsearch.yml
を開きます。
- sudo nano /etc/elasticsearch/elasticsearch.yml
このファイルで、network.host
を含む行を見つけ、行の先頭にある#
文字を削除してコメントを解除し、値をセキュリティで保護されたネットワークインターフェイスのIPアドレスに変更します。 行は次のようになります。
...
network.host: 10.0.0.1
...
警告: Elasticsearchにはセキュリティが組み込まれていないため、制御または信頼していないサーバーからアクセスできるIPアドレスにこれを設定しないことが非常に重要です。 Elasticsearchをパブリックまたは共有プライベートネットワークIPアドレスにバインドしないでください。
また、セキュリティを強化するために、カスタム式の評価に使用されるスクリプトを無効にすることができます。 カスタムの悪意のある表現を作成することにより、攻撃者は環境を危険にさらす可能性があります。
カスタム式を無効にするには、/etc/elasticsearch/elasticsearch.yml
ファイルの最後に次の行を追加します。
...
[label /etc/elasticsearch/elasticsearch.yml]
script.allowed_types: none
...
上記の変更を有効にするには、Elasticsearchを再起動する必要があります。
今すぐElasticsearchを再起動します。
- sudo service elasticsearch restart
このステップでは、Elasticsearchサーバーを保護するためのいくつかの対策を講じました。 これで、アプリケーションをテストする準備が整いました。
ステップ5—CentOS7でElasticsearchをテストする
これで、Elasticsearchはポート9200で実行されているはずです。 これは、クライアント側のURL転送用のコマンドラインツールであるcurl
を使用してテストできます。
サービスをテストするには、次のようにGET
リクエストを行います。
- curl -X GET 'http://localhost:9200'
次の応答が表示されます。
Output{
"name" : "My First Node",
"cluster_name" : "mycluster1",
"cluster_uuid" : "R23U2F87Q_CdkEI2zGhLGw",
"version" : {
"number" : "7.9.2",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "d34da0ea4a966c4e49417f2da2f244e3e97b4e6e",
"build_date" : "2020-09-23T00:45:33.626720Z",
"build_snapshot" : false,
"lucene_version" : "8.6.2",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
同様の応答が表示された場合、Elasticsearchは正常に機能しています。 そうでない場合は、インストール手順を再確認し、Elasticsearchが完全に起動するまでしばらく待ちます。
これでElasticsearchサーバーが動作可能になりました。 次のステップでは、アプリケーションからいくつかのデータを追加および取得します。
ステップ6—CentOS7でElasticsearchを使用する
このステップでは、Elasticsearchにデータを追加してから、手動でクエリを実行します。
curl
を使用して、最初のエントリを追加します。
- curl -H 'Content-Type: application/json' -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "message": "Hello World!" }'
次の出力が表示されます。
Output{"_index":"tutorial","_type":"helloworld","_id":"1","_version":3,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":4
curl
を使用して、HTTPPOST
リクエストをElasticseachサーバーに送信しました。 リクエストのURIは/tutorial/helloworld/1
でした。 これらのパラメータを詳しく見てみましょう。
tutorial
は、Elasticsearchのデータのインデックスです。helloworld
がタイプです。1
は、上記のインデックスとタイプの下にあるエントリのIDです。
また、すべてのPOST
リクエストのコンテンツタイプを、引数-H 'Content-Type: application/json'
を使用してJSONに設定する必要があることに注意してください。 これを行わないと、Elasticsearchはリクエストを拒否します。
次に、HTTPGET
リクエストを使用して最初のエントリを取得します。
- curl -X GET 'http://localhost:9200/tutorial/helloworld/1'
結果は次のようになります。
Output{"_index":"tutorial","_type":"helloworld","_id":"1","_version":3,"_seq_no":2,"_primary_term":4,"found":true,"_source":{ "message": "Hello World!" }}
既存のエントリを変更するには、次のようなHTTPPUT
リクエストを使用できます。
- curl -H 'Content-Type: application/json' -X PUT 'localhost:9200/tutorial/helloworld/1?pretty' -d
- '
- {
- "message": "Hello People!"
}'
Elasticsearchは、次のような変更が成功したことを確認します。
Output{
"_index" : "tutorial",
"_type" : "helloworld",
"_id" : "1",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
上記の例では、最初のエントリのmessage
を"Hello People!"
に変更しました。 これに伴い、バージョン番号は2
に増加しました。
GET
操作の出力をより人間が読めるようにするために、pretty
引数を追加して、結果を「きれいにする」こともできます。
- curl -X GET 'http://localhost:9200/tutorial/helloworld/1?pretty'
これで、応答がより読みやすい形式で出力されます。
Output{
"_index" : "tutorial",
"_type" : "helloworld",
"_id" : "1",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"message" : "Hello People!"
}
}
これは、Elasticsearchでデータを追加およびクエリする方法です。 その他の操作については、ElasticsearchAPIのドキュメントを確認してください。
結論
このチュートリアルでは、CentOS 7でElasticsearchをインストール、構成し、使用を開始しました。 手動クエリに慣れたら、次のタスクはアプリケーションからサービスの使用を開始することです。