CentOS 7にElasticsearchをインストールして構成する方法
CentOS 7を使用していませんか?別のバージョンまたはディストリビューションを選択してください。
著者は、Write for DOnationsプログラムの一環として寄付を受けるために、COVID-19救済基金を選択しました。
紹介
Elasticsearchは、リアルタイムでのデータの分散検索と分析のためのプラットフォームです。その人気は、使いやすさ、強力な機能、そしてスケーラビリティに起因しています。
ElasticsearchはRESTful操作をサポートしています。これは、HTTPメソッド(GET、POST、PUT、DELETEなど)をHTTP URI(/collection/entry)と組み合わせてデータを操作できることを意味します。直感的なRESTfulアプローチは開発者にもユーザーにも親しみやすく、これがElasticsearchの人気の理由の一つです。
Elasticsearchは、信頼できる企業であるElasticが支えている無料のオープンソースソフトウェアです。この組み合わせは、個人のテストから企業の統合まで、多くのユースケースに適しています。
この記事ではElasticsearchを紹介し、そのインストール、設定、および使用を開始する方法を説明します。
前提条件
このチュートリアルに従うには、次のものが必要です:
- CentOS 7を実行しているサーバーには、最低1GBのメモリと非rootのsudoユーザーが必要です。詳細な手順については、CentOS 7の初期サーバー設定ガイドをご覧ください。
wgetがあなたのサーバーにインストールされています
ステップ1 — CentOS 7にJavaをインストールする
ElasticsearchはJavaプログラミング言語で書かれています。したがって、最初のタスクは、サーバーにJava Runtime Environment(JRE)をインストールすることです。JREにはCentOSのネイティブOpenJDKパッケージを使用します。このJREは無料で、サポートが充実しており、CentOS Yumインストールマネージャーを通じて自動的に管理されます。
OpenJDK 8の最新バージョンをインストールしてください:
- sudo yum install java-1.8.0-openjdk.x86_64
インストールを確認してください:
- java -version
このコマンドは次のような出力を作成します:
openjdk 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 — CentOS 7にElasticsearchをダウンロードしてインストールする
Elasticsearch は、elastic.co から zip、tar.gz、deb、または rpm パッケージを直接ダウンロードできます。CentOS の場合、Elasticsearch を実行するために必要なすべてをインストールするネイティブの rpm パッケージを使用するのが最適です。
この記事を書いている時点で、最新の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がサーバーと自動的に起動および停止するようにするには、その初期スクリプトをデフォルトの実行レベルに追加します。
- sudo systemctl enable elasticsearch.service
Elasticsearchがインストールされたら、いくつかの重要な設定を構成します。
ステップ3 — CentOS 7での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はlocalhostのポート9200でリッスンするため、同じサーバーからのクライアントのみが接続できます。セキュリティの観点から、これらの設定は変更しない方が良いでしょう。なぜなら、Elasticsearchのオープンソースおよび無料版は認証機能を提供していないからです。
もう一つの重要な設定は、node.rolesプロパティです。これをmaster-eligible(設定では単にmaster)、dataまたはingestに設定できます。
マスター対象の役割は、クラスターの健全性と安定性を保つことに責任があります。多くのクラスターノードがある大規模な展開では、マスター役割専用のノードを複数持つことが推奨されます。通常、専用のマスターノードはデータを保存したりインデックスを作成したりしません。したがって、過負荷になる可能性はなく、クラスターの健全性が危険にさらされることはありません。
dataロールは、データを格納するノードを定義します。たとえデータノードがオーバーロードしていても、他に追加の負荷を分担できるノードがあれば、クラスターの健康状態に大きな影響はないはずです。
最後に、ingestロールはノードがデータストリームを受け入れ、処理することを許可します。より大規模なセットアップでは、masterおよびdataノードへの過負荷を避けるために、専用のingestノードを設けるべきです。
注意: 一つのノードには、スケーラビリティ、冗長性、高可用性を実現するために、1つ以上の役割を持たせることができます。デフォルトでは、これらすべての役割がノードに割り当てられます。これは、本記事で説明されているシナリオのような単一ノードのElasticsearchに適しています。したがって、役割を変更する必要はありません。それでも、ノードをmasterとして専用にするなど、役割を変更したい場合は、/etc/elasticsearch/elasticsearch.ymlを次のように変更することで可能です:
...
node.roles: [ master ]
...
変更を検討すべき別の設定は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です。
デフォルトでは、どちらも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を使用する前に、少なくとも10秒間のスタートアップ時間を許可してください。そうしないと、接続エラーが発生する可能性があります。
注意: すべてのElasticsearch設定が構成ファイルに設定されているわけではありません。代わりに、いくつかの設定はAPIを介して設定されます。例えば、index.number_of_shards と index.number_of_replicas です。最初の設定は、インデックスが何個のパーツ(シャード)に分割されるかを決定します。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 — (オプション)CentOS 7でのElasticsearchのセキュリティ強化
Elasticsearchには組み込みのセキュリティがなく、HTTP APIにアクセスできる人は誰でもそれを制御できます。このセクションはElasticsearchのセキュリティを確保するための包括的なガイドではありません。不正アクセスを防ぐために必要な措置を講じ、実行しているサーバーや仮想マシンを守ってください。
デフォルトでは、Elasticsearchはlocalhostネットワークインターフェースのみでリッスンするように設定されており、リモート接続は不可能です。この設定は、以下のいずれかまたは両方の対策を講じない限り、変更しないでください:
- iptablesを使用して、TCPポート9200へのアクセスを信頼できるホストのみに制限しました。
- 信頼できるホスト間にVPNを作成し、そのVPNの仮想インターフェースの1つでElasticsearchを公開しようとしています。
上記の作業を完了した場合にのみ、Elasticsearchがlocalhost以外の他のネットワークインターフェースでリッスンすることを検討すべきです。このような変更は、他のホストから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 — CentOS 7でのElasticsearchのテスト
今、Elasticsearchはポート9200で実行されているはずです。クライアント側のURL転送のためのコマンドラインツールであるcurlを使用して、これをテストできます。
サービスをテストするには、このようにGETリクエストを作成してください:
- curl -X GET 'http://localhost:9200'
次の応答が表示されます:
{
"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 — CentOS 7でのElasticsearchの使用
このステップでは、Elasticsearchにデータを追加し、その後手動でクエリを作成します。
curlを使って最初のエントリーを追加します:
- curl -H 'Content-Type: application/json' -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "message": "Hello World!" }'
次の出力が表示されます:
{"_index":"tutorial","_type":"helloworld","_id":"1","_version":3,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":4
コマンドcurlを使用して、ElasticsearchサーバーにHTTPPOSTリクエストを送信しました。リクエストのURIは/tutorial/helloworld/1でした。それらのパラメータを詳しく見てみましょう:
tutorialはElasticsearchのデータのインデックスです。- `helloworld`はタイプです。
1は上記のインデックスとタイプの下にある私たちのエントリーのIDです。
すべてのPOSTリクエストのコンテンツタイプをJSONに設定することも必要であることに注意してください。引数-H 'Content-Type: application/json'を使用します。これを行わないと、Elasticsearchはリクエストを拒否します。
HTTP GET リクエストを使用して最初のエントリを取得してください:
- curl -X GET 'http://localhost:9200/tutorial/helloworld/1'
結果はこのようになります:
{"_index":"tutorial","_type":"helloworld","_id":"1","_version":3,"_seq_no":2,"_primary_term":4,"found":true,"_source":{ "message": "Hello World!" }}
既存のエントリを修正するには、次のようなHTTP PUTリクエストを使用できます:
- curl -H 'Content-Type: application/json' -X PUT 'localhost:9200/tutorial/helloworld/1?pretty' -d '
- {
- "message": "Hello People!"
- }'
Elasticsearchは成功した修正を次のように認識します:
{
"_index" : "tutorial",
"_type" : "helloworld",
"_id" : "1",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
上記の例では、最初のエントリのmessageを"こんにちは、皆さん!"に変更しました。それにより、バージョン番号は2に増加しました。
あなたのGET操作の出力をより人間に読みやすくするために、pretty引数を追加することで、結果を「整形」することもできます:
- curl -X GET 'http://localhost:9200/tutorial/helloworld/1?pretty'
今、レスポンスはより読みやすい形式で出力されます:
{
"_index" : "tutorial",
"_type" : "helloworld",
"_id" : "1",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"message" : "Hello People!"
}
}
これがElasticsearchにデータを追加およびクエリする方法です。他の操作については、Elasticsearch APIドキュメントを確認してください。
結論
このチュートリアルでは、CentOS 7にElasticsearchをインストールし、設定し、使用を開始しました。手動クエリに慣れたら、次のタスクはアプリケーションからこのサービスを使用し始めることです。