概要
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が稼働する環境が作成できます。
導入までの参考情報
- (Install Elasticsearch with RPM | Elasticsearch Reference [8.0]
- Install Kibana with RPM | Kibana Guide [8.0]
クラスター化とノードの追加
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"
クラスタ化に関する参考情報
- Bootstrapping a cluster | Elasticsearch Guide [7.8]
- Designing for Scale | Elasticsearch: The Definitive Guide [2.x]
- セキュリティ機能のはじめ方 | Elastic Blog
- Start the Elastic Stack with security enabled | Elasticsearch Guide [8.1]
ご自宅に高耐久性のある全文検索エンジンが欲しい方は、是非試してみてください。