クラスタ構成のElasticsearchのインストール

Pocket

概要

Elasticsearch、ELK stackめっちゃ使いますよね。
メトリクスの収集や構造化ログのストックなど、いろいろな用途に使えて便利です。ただdocker composeでザックリ上げただけの環境では、そのままproduction環境として使用するには色々と惜しいので、今回はclusterringさせる機能を使用して複数ノードのリソースを効率よく使っていきます。
production環境として使用するには冗長化も考えないといけないですからね。

前提

構成設計

今回は簡易的な構成としてelasticsearchのみを2台のノードでクラスタ化した構成を組みます。
クラスタに参加するノード名はそれぞれ「elastic1-dev」「elastic2-dev」で設定しました。
また各ノードに割り当てられているIPアドレスは「192.168.57.120/24」「192.168.57.121/24」です。

操作ユーザがログインする前提のkibanaの冗長化については、DNSラウンドロビンなりkeepalivedなりの方法で冗長化してください。kibana / logstashからelasticsearchの接続に関しては、バックエンドのelasticsearchがクラスタ化された状態を前提に実装されている為、設定変更で対応できます。

環境情報

今回はOSとしてAlmalinuxを選択していますが、CentOS Stream8やCentOS8などRHEL系のOSであれば基本的に同じ手順で導入できます。debian系のOS(ubuntuなど)を利用する際にはパッケージ管理ソフトのdnfをaptに、rpmレポジトリをdebレポジトリにそれぞれ読み替えてください。

# cat /etc/os-release
NAME="AlmaLinux"
VERSION="8.5 (Arctic Sphynx)"
ID="almalinux"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.5"
PLATFORM_ID="platform:el8"
PRETTY_NAME="AlmaLinux 8.5 (Arctic Sphynx)"
ANSI_COLOR="0;34"
CPE_NAME="cpe:/o:almalinux:almalinux:8::baseos"
HOME_URL="https://almalinux.org/"
DOCUMENTATION_URL="https://wiki.almalinux.org/"
BUG_REPORT_URL="https://bugs.almalinux.org/"

ALMALINUX_MANTISBT_PROJECT="AlmaLinux-8"
ALMALINUX_MANTISBT_PROJECT_VERSION="8.5"

またテスト機で作業した都合上、低メモリ下(具体的には各インスタンスの割当てメモリ4GB)で実行するように一部手を加えてます。展開可能なshard数等に影響しますので、メモリがふんだんに使用できる環境では手順を省略してください。

インストール

Eslasticsearch repositoryのGPG keyの導入

Elasticsearchの各パッケージにはGPGで署名されていますが、各パッケージの導入時に署名の有効性からエラーが発生します。これを回避するためにElastic社が提供しているsigning keyをパッケージ署名鍵としてインポートします。

# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

signining keyは更新される可能性があります。後述のパッケージインストールの際に有効性検証が出来ない旨のエラーが発生するようであれば、公式のドキュメントを参照して最新のsigning keyをインポートしてください。

rpm repositoryの導入とパッケージインストール

パッケージ管理ソフト「yum」または「dnf」上のレポジトリとして登録して、パッケージ管理ソフト上から導入します。/etc/yum.repos.d/ に elasticsearch.repo を作成し、yum上のレポジトリとして読み込みしましょう。RHEL/CentOS以外のOSを利用する場合は適宜読み替えてください。

/etc/yum.repos.d/elasticsearch.repo
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

Elasticsearch パッケージをdnfからインストールします。

# dnf check-update --enablerepo=elasticsearch
Elasticsearch repository for 8.x packages              1.2 MB/s | 2.1 MB     00:01
Last metadata expiration check: 0:00:03 ago on Mon 07 Mar 2022 05:29:36 AM UTC.

# dnf install elasticsearch --enablerepo=elasticsearch
Last metadata expiration check: 0:02:15 ago on Mon 07 Mar 2022 05:29:36 AM UTC.
Dependencies resolved.
  Verifying        : elasticsearch-8.0.1-1.x86_64  

Installed:
  elasticsearch-8.0.1-1.x86_64

Complete!

systemd上からサービスとして有効化しておくと、OSの起動時に自動的に起動するよう設定できます。dnfよりパッケージとして導入した場合、systemdのunitファイルが必要な個所に配置される為、下記の様にenableするのみで問題ありません。

# systemctl enable elasticsearch
Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /usr/lib/systemd/system/elasticsearch.service.

Elasticsearch セットアップ

簡単な初期セットアップ(最低限の稼働状態を作る)を行い、最小構成で仮稼働させるところまで作業します。後々クラスタ化させる際にこれらに加えて設定変更するので、現時点ではIndexの作成等は行わないでください。

まず、superuser roleがアサインされている特権ユーザ等のパスワードを設定する為、systemd上からelasticsaerchを起動します。

# systemctl start elasticsearch

built-in の superuser ‘elastic’のパスワードを変更します。下記バイナリでは個別ユーザのパスワード変更のみ対応していますが、同一のディレクトリにある「elasticsearch-setup-passwords」を利用すれば、対話型でsystem系roleがアサインされた各ユーザのパスワードを一括して変更できます。

# /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i
This tool will reset the password of the [elastic] user.
You will be prompted to enter the password.
Please confirm that you would like to continue [y/N]y

Enter password for [elastic]:
Re-enter password for [elastic]:
Password for the [elastic] user successfully reset.

Elasticsearchのシステム系indexを自動作成する設定を有効化します。elasticsearch.ymlの最終行に追記してください。

/etc/elasticsearch/elasticsearch.yml
action.auto_create_index: .monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*

今回は使用可能メモリ量が限られた環境で実行する為、メモリ使用を1GB+αまで低減させます。JVMのヒープサイズの調整の為、JVM起動時のオプションを追記しましょう。

/etc/elasticsearch/jvm.options
-Xms1g
-Xmx1g

これらの設定を反映する為、Elasticsearchを再起動します。

# systemctl restart elasticsearch

正常性の確認

これまでの設定を反映して、正常に起動しindicesが展開されているかどうか確認します。暫定的に先程設定したsuperuserアカウントの「elastic」を利用して、直接indexのリストをコールしてみましょう。

# curl -k -u elastic https://localhost:9200
Enter host password for user 'elastic':
{
  "name" : "elastic1.novalocal",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "************************",
  "version" : {
    "number" : "8.0.1",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "801d9ccc7c2ee0f2cb121bbe22ab5af77a902372",
    "build_date" : "2022-02-24T13:55:40.601285296Z",
    "build_snapshot" : false,
    "lucene_version" : "9.0.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}
# curl -k -u elastic https://localhost:9200/_cat/indices | sort
Enter host password for user 'elastic':
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

現時点でindexが作成されていない為、空行が応答されます。

kibanaのパッケージインストール

先程と同様にkibanaパッケージをdnfからインストールします。この時点でGPG keyのインポートとelasticのレポジトリの追加は完了している筈なので、パッケージを導入するのみです。

# dnf install kibana --enablerepo=elasticsearch
Last metadata expiration check: 0:43:45 ago on Mon 07 Mar 2022 05:33:44 AM UTC.
Dependencies resolved.
  Verifying        : kibana-8.0.1-1.x86_64              1/1

Installed:
  kibana-8.0.1-1.x86_64

Complete!

kibana向けenrollment tokenの作成

kibana – elasticsearch間の繋ぎ込みを、以前の様なuser/passwordではなくenrollment tokenによる認証で対応します。

# /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana_system

kibana用メンテナンスアカウントのパスワードリセット

こちらは従来の様なuser/passwordによる認証を行う為の設定です。従前まではusername「kibana」がkibanaとの連携アカウントとしてセットアップされていましたが、現在の8.01ではdeprecateとなっています。
「-i」オプションを使用すると対話型でパスワードが設定できます。

# /usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system -i

kibana セットアップ

必要に応じてkibanaの各設定を変更していきます。

今回は上述の通り、限られたメモリ量の環境下で運用する為、nodejsでの利用メモリサイズのリミットを1024MBまで低減します。下記設定を最終行に追記してください。
いずれESStackのパフォーマンスチューニングに関しては別記事として紹介したいですね。

/etc/kibana/node.options
--max-old-space-size=1024

kibanaのlistenするアドレスを変更し、localhost以外からのアクセスを許容するよう設定します。
接続するelasticsearchノードの設定を変更して、クラスター化を見越してリスト化して整理します。
先程設定したkibana用のシステムアカウントのusername/passwordも記述しましょう。
また、自己署名証明書でelasticsearchをSSL化した状態でセットアップされる為、elasticsearchへの接続時の証明書の検証を省略します。

/etc/kibana/kibana.yml
server.host: "0.0.0.0"
elasticsearch.hosts:
  - "https://192.168.57.120:9200"
elasticsearch.username: "kibana_system"
elasticsearch.password: "*****************"
elasticsearch.ssl.verificationMode: none

上記の設定変更が終わったら、systemd上から起動します。

# systemctl start kibana

ここまでの作業で、シングルノードのelasticsearch/kibanaが稼働する環境が作成できます。

導入までの参考情報

クラスター化とノードの追加

node1側elasticsearch設定変更

node1側のelasticsearch.ymlをclusterとしてnodeを追加可能な様に設定変更していきます。
特に下記のポイントに絞って変更していきましょう。

  • cluster.nameの定義
  • node.nameの設定
  • node間通信の設定
/etc/elasticseaerch/elasticsearch.yml
cluster.name: dev-cluster
node.name: elastic1-dev
discovery.seed_hosts: ["192.168.57.120", "192.168.57.121"]
cluster.initial_master_nodes: ["192.168.57.120", "192.168.57.121"]
transport.host: ["192.168.57.120"]

自己署名証明書関連のvalidationの回避

このままだと自己署名証明書を利用している為、証明書のvalidationでエラーとなり正常にクラスターに参加できない状態です。elasticsearchのssl機能をオフにすることもできますが、今回は証明書のvalidationを行わない設定に変更して回避します。
クラスターに参加する全てのノードのelasticsearch.ymlで、回避策として下記設定を変更しましょう。

/etc/elasticsearch/elasticsearch.yml
xpack.security.transport.ssl:
  enabled: true
#   verification_mode: certificate
  verification_mode: none

上記の設定変更が完了したら、反映する為にelasticsearchをsystemdから再起動します。

# systemctl restart elasticsearch

node2側elasticsearch設定

node1側のclusterに参加するように、node2側のelasticsearchの設定を行っていきます。
パッケージの導入と基本的な設定に関しては上述の「インストール」から「Elasticsearchセットアップ」までを参考にしてください。

cluster.nameは各クラスタで同一の値を設定してください。node.nameは各ノードを識別するための設定なので、各ノードで個別の値を設定しましょう。transport.hostは各ノードで対応する値を設定してください。

/etc/elasticsearch/elasticsearch.yml
cluster.name: dev-cluster
node.name: elastic2-dev
discovery.seed_hosts: ["192.168.57.120", "192.168.57.121"]
cluster.initial_master_nodes: ["192.168.57.120", "192.168.57.121"]
transport.host: ["192.168.57.121"]

これらの設定を反映する為、elasticsearchをsystemdから再起動します。

# systemctl restart elasticsearch

以上の作業でclusterにnode2が追加されました。

正常性の確認

クラスターに参加している全ノードのステータスを表示し、正常稼働を確認します。

# curl -k -u elastic https://localhost:9200/_cat/nodes?v
Enter host password for user 'elastic':
ip             heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
192.168.57.120           56          96   1    0.19    0.18     0.12 cdfhilmrstw *      elastic1-dev
192.168.57.121           55          55   0    0.01    0.02     0.01 cdfhilmrstw -      elastic2-dev

各ノードのstatusが正常に表示されれば完了です。

kibanaのクラスタへの接続対応

先程設定したkibanaのバックエンドのelasticsearch接続先に、新しく追加したelastic2-devを設定します。

/etc/kibana/kibana.yml
elasticsearch.hosts:
  - "https://192.168.57.120:9200"
  - "https://192.168.57.121:9200"

クラスタ化に関する参考情報

ご自宅に高耐久性のある全文検索エンジンが欲しい方は、是非試してみてください。

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください