著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

Elasticsearch は、データをリアルタイムで分散検索および分析するためのプラットフォームです。 その人気は、その使いやすさ、強力な機能、およびスケーラビリティによるものです。

ElasticsearchはRESTful操作をサポートしています。 これは、HTTPメソッド(GETPOSTPUTDELETEなど)をHTTP URI(/ collection /エントリ)データを操作します。 直感的なRESTfulアプローチは、開発者とユーザーの両方に優しいものであり、これがElasticsearchの人気の理由の1つです。

Elasticsearchは無料のオープンソースソフトウェアであり、その背後には確固たる会社があります—Elastic。 この組み合わせにより、個人テストから企業統合まで、多くのユースケースに適しています。

この記事では、Elasticsearchを紹介し、Elasticsearchをインストール、構成、および使用を開始する方法を示します。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • 1GB以上のメモリとroot以外のsudoユーザーを備えたCentOS8を実行しているサーバー。 詳細な手順については、 CentOS8の初期サーバーセットアップガイドをご覧ください。
  • サーバーにwgetinstalled

ステップ1—CentOS8へのJavaのインストール

ElasticsearchはJavaプログラミング言語で書かれています。 したがって、最初のタスクは、サーバーにJavaランタイム環境(JRE)をインストールすることです。 JREにはネイティブのCentOSOpenJDKパッケージを使用します。 このJREは無料で、十分にサポートされており、CentOSYumインストールマネージャーを介して自動的に管理されます。

OpenJDK8の最新バージョンをインストールします。

  1. sudo dnf install java-1.8.0-openjdk.x86_64 -y

次に、インストールを確認します。

  1. java -version

このコマンドは、次のような出力を作成します。

Output
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—CentOS8でのElasticsearchのダウンロードとインストール

Elasticsearchは、ziptar.gzdeb、またはrpmパッケージのelastic.coから直接ダウンロードできます。 CentOSの場合は、ネイティブのrpmパッケージを使用するのが最適です。これにより、Elasticsearchの実行に必要なすべてのものがインストールされます。

この記事の執筆時点では、Elasticsearchの最新バージョンは7.9.2です。

作業ディレクトリから、プログラムをダウンロードします。

  1. sudo rpm -ivh https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-x86_64.rpm

Elasticsearchは/usr/share/elasticsearch/にインストールされ、構成ファイルは/etc/elasticsearchに配置され、初期化スクリプトは/etc/init.d/elasticsearchに追加されます。

Elasticsearchがサーバーで自動的に開始および停止するようにするには、そのinitスクリプトをデフォルトのランレベルに追加します。

  1. sudo systemctl daemon-reload && sudo systemctl enable elasticsearch.service

Elasticsearchをインストールしたら、いくつかの重要な設定を構成します。

ステップ3—CentOS8でElasticsearchを設定する

ElasticsearchとそのJava依存関係をインストールしたので、Elasticsearchを構成します。

Elasticsearch構成ファイルは/etc/elasticsearchディレクトリにあります。 レビューおよび編集するものは次のとおりです。

  • elasticsearch.yml —Elasticsearchサーバーの設定を構成します。 これはほとんどのオプションが保存される場所であり、それが私たちがこのファイルに主に関心を持っている理由です。

  • jvm.options —メモリ設定などのJVMの構成を提供します。

Elasticsearchサーバーでカスタマイズする最初の変数は、elasticsearch.ymlnode.namecluster.nameです。 今それをしましょう。

それらの名前が示すように、node.nameは、サーバー(ノード)と後者が関連付けられているクラスターの名前を指定します。 これらの変数をカスタマイズしない場合、サーバーのホスト名に関してnode.nameが自動的に割り当てられます。 cluster.nameは、デフォルトのクラスターの名前に自動的に設定されます。

cluster.name値は、Elasticsearchの自動検出機能によって使用され、Elasticsearchノードを自動的に検出してクラスターに関連付けます。 したがって、デフォルト値を変更しないと、クラスター内の同じネットワーク上に不要なノードが見つかる可能性があります。

メインのelasticsearch.yml構成ファイルの編集を始めましょう。

nanoまたはお好みのテキストエディタを使用して開きます。

  1. sudo nano /etc/elasticsearch/elasticsearch.yml

node.nameおよびcluster.nameの行頭の#文字を削除してコメントを解除し、値を変更します。 /etc/elasticsearch/elasticsearch.ymlファイルでの最初の構成変更は次のようになります。

/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を変更することで変更できます。

/etc/elasticsearch/elasticsearch.yml
...
node.roles: [ master ]
...

変更を検討するもう1つの設定は、path.dataです。 これにより、データが保存されるパスが決まります。デフォルトのパスは/var/lib/elasticsearchです。 本番環境では、Elasticsearchデータを保存するために専用のパーティションとマウントポイントを使用することをお勧めします。 最良の場合、この専用パーティションは、より優れたパフォーマンスとデータ分離を提供する別個のストレージメディアになります。 path.data行のコメントを解除し、その値を次のように変更することで、別のpath.dataパスを指定できます。

/etc/elasticsearch/elasticsearch.yml
...
path.data: /media/different_media
...

すべての変更を行ったので、elasticsearch.ymlを保存して閉じます。

jvm.optionsでも構成を編集する必要があります。

ElasticsearchはJVMによって実行されることを思い出してください。 本質的にはJavaアプリケーションです。 したがって、他のJavaアプリケーションと同様に、ファイル/etc/elasticsearch/jvm.optionsで構成できるJVM設定があります。 特にパフォーマンスに関して最も重要な設定の2つは、XmsXmxで、最小値(Xms)と最大値(Xmx)を定義します。メモリ割り当て。

デフォルトでは、両方とも1GBに設定されていますが、これが最適になることはほとんどありません。 それだけでなく、サーバーに1GBのRAMしかない場合、デフォルト設定でElasticsearchを起動することはできません。 これは、オペレーティングシステムが少なくとも100MBを使用するため、Elasticsearchに1GBを割り当てることができないためです。

残念ながら、メモリ設定を計算するための普遍的な公式はありません。 当然、割り当てるメモリが多いほどパフォーマンスは向上しますが、サーバー上の残りのプロセス用に十分なメモリが残っていることを確認してください。 たとえば、マシンに1GBのRAMがある場合、XmsXmxの両方を512MBに設定して、残りのプロセスにさらに512MBを許可できます。 通常、JVMガベージコレクションのパフォーマンスの低下を回避するために、XmsXmxの両方が同じ値に設定されることに注意してください。

サーバーにRAMが1GBしかない場合は、この設定を編集する必要があります。

jvm.optionsを開きます:

  1. sudo nano /etc/elasticsearch/jvm.options

次に、XmsXmxの値を512MBに変更します。

/etc/elasticsearch/jvm.options
...
-Xms512m
-Xmx512m
...

ファイルを保存して終了します。

次に、Elasticsearchを初めて起動します。

  1. sudo systemctl start elasticsearch.service

Elasticsearchを使用する前に、Elasticsearchが起動するまで少なくとも10秒待ちます。 そうしないと、接続エラーが発生する可能性があります。

注:すべてのElasticsearch設定が設定され、構成ファイルに保持されているわけではないことを知っておく必要があります。 代わりに、index.number_of_shardsindex.number_of_replicasなどの一部の設定はAPIを介して設定されます。 1つ目は、インデックスが分割されるピース(シャード)の数を決定します。 2つ目は、クラスター全体に分散されるレプリカの数を定義します。 シャードを増やすとインデックス作成のパフォーマンスが向上し、レプリカを増やすと検索が速くなります。

単一ノードでElasticsearchを引き続き調査およびテストしていると仮定すると、次のcurlコマンドを実行して、これらの設定を試して変更することができます。

  1. curl -XPUT -H 'Content-Type: application/json' 'http://localhost:9200/_all/_settings?preserve_existing=true' -d
  2. '{
  3. "index.number_of_replicas" : "0",
  4. "index.number_of_shards" : "1"
  5. }'

Elasticsearchをインストールして構成したら、サーバーを保護してテストします。

ステップ4—(オプション)CentOS8でElasticsearchを保護する

Elasticsearchにはセキュリティが組み込まれておらず、HTTPAPIにアクセスできる人なら誰でもそれを制御できます。 このセクションは、Elasticsearchを保護するための包括的なガイドではありません。 それとそれが実行されているサーバー/仮想マシンへの不正アクセスを防ぐために必要な対策を講じてください。

デフォルトでは、Elasticsearchはローカルホストネットワークインターフェースでのみリッスンするように設定されています。 リモート接続はできません。 次のいずれかまたは両方の対策を講じていない限り、この設定は変更しないでください。

  • TCPポート9200へのアクセスを、iptablesを使用する信頼できるホストにのみ制限しました。
  • 信頼できるホスト間にvpnを作成し、vpnの仮想インターフェイスの1つでElasticsearchを公開します。

上記を実行した後でのみ、Elasticseachがローカルホスト以外の他のネットワークインターフェイスでリッスンできるようにすることを検討する必要があります。 このような変更は、たとえば、別のホストからElasticsearchに接続する必要がある場合に考慮される可能性があります。

ネットワークの露出を変更するには、ファイルelasticsearch.ymlを開きます。

  1. sudo nano /etc/elasticsearch/elasticsearch.yml

このファイルで、network.hostを含む行を見つけ、行の先頭にある#文字を削除してコメントを解除し、値をセキュリティで保護されたネットワークインターフェイスのIPアドレスに変更します。 行は次のようになります。

/etc/elasticsearch/elasticsearch.yml
...
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を再起動します。

  1. sudo service elasticsearch restart

このステップでは、Elasticsearchサーバーを保護するためのいくつかの対策を講じました。 これで、アプリケーションをテストする準備が整いました。

ステップ5—CentOS8でElasticsearchをテストする

これで、Elasticsearchはポート9200で実行されているはずです。 これは、クライアント側のURL転送用のコマンドラインツールであるcurlを使用してテストできます。

サービスをテストするには、次のようにGETリクエストを行います。

  1. 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—CentOS8でElasticsearchを使用する

このステップでは、Elasticsearchにデータを追加してから、手動でクエリを実行します。

curlを使用して、最初のエントリを追加します。

  1. 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リクエストを使用して最初のエントリを取得します。

  1. 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リクエストを使用できます。

  1. curl -H 'Content-Type: application/json' -X PUT 'localhost:9200/tutorial/helloworld/1?pretty' -d
  2. '
  3. {
  4. "message": "Hello People!"
  5. }'

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引数を追加して、結果を「きれいにする」こともできます。

  1. 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 8でElasticsearchをインストール、構成し、使用を開始しました。 手動クエリに慣れたら、次のタスクはアプリケーションからサービスの使用を開始することです。