やさぐれSEの技術メモ

皆が辛い思いをしないようにハマったポイントなどを書きます

Elasticsearchのインストール及び設定 その9 スナップショットの作成

設定変更の際や定期的なスナップショットの取得がElasticsearchに不可欠です。

公式URL

www.elastic.co

準備

NFSのマウント

スナップショットの取得、スナップショットからのデータ復旧には、基本的に全てのインスタンスが同一領域をマウントしている必要があります。
※スナップショットの操作を実施する際にマウントする運用が良いかと思われます。

(1)Configの「path.repo」という定義でそのディレクトリを指定してますので、そこにNFS領域をマウントします。
 ※RHEL#1~#5全台に実施します。

mount -t nfs -o rw NFSサーバのIPアドレス:NFS共有ディレクトリパス /snapshot

(2)dfコマンド等でマウントされていることを確認します。

リポジトリの作成

スナップショットのデータを格納する器としてリポジトリを作成する必要があります。
こちらはいずれかのインスタンスから一度だけ実施します。

curl -H "Content-Type: application/json" -XPUT -u elastic 'http://192.168.0.3:9200/_snapshot/リポジトリ名' -d '{
"type": "fs",
"settings": {
"location": "/snapshot",
"compress": true
}
}'
  • リポジトリ名に任意の名称を入力します。
  • typeには共有フォルダを示す「fs」を入力します。
  • locationにはスナップショット用のパスを記述します。
  • compressは圧縮するかどうかを設定します。

[参考]
type の設定値ですが、下記の6種類があります。 クラウドストレージへの格納を是非やってみたいところです。

type リポジトリ
fs 共有フォルダ
url 読み取り専用URL(なんのこっちゃか解りませんね)
s3 S3ストレージ
hdfs Hadoop環境のバックアップ先みたいです
azure Azureストレージ
gcs Google Cloudのストレージ

[余談]

Elasticsearch 6系からPUTのAPIを発行する際に「"Content-Type: application/json"」を付けないとエラーになります。
これを知らずに多少はまりました。

curl -H "Content-Type: application/json" -XPUT なにがしかのURL

スナップショットの作成

実際にスナップショットの取得を実施します。

■特定のインデックスを指定する場合

curl -H "Content-Type: application/json" -XPUT -u elastic 'http://192.168.0.3:9200/_snapshot/リポジトリ名/スナップショット名?wait_for_completion=true' -d '{
"indices": "インデックス名",
"ignore_unavailable": true,
"include_global_state": false
}'
  • indices にスナップショットを取得したいインデックス名を記入します
  • ignore_unavailable は存在しないインデックスを記入した場合に無視するかどうかです。基本的に「true」で良いと思います。
  • include_global_state はglobal stateファイルを含めるかどうかの指定になります。基本的に「false」で良いと思います。

スナップショットの確認方法

スナップショットからのデータ復旧方法は下記の通りです。

■特定のスナップショットを指定する場合

curl -XGET -u elastic 'http://192.168.0.3:9200/_snapshot/リポジトリ名/スナップショット名

■全スナップショットを指定する場合

curl -XGET -u elastic 'http://192.168.0.3:9200/_snapshot/リポジトリ名/_all?pretty

スナップショットからのリストア

curl -H "Content-Type: application/json" -XPOST -u elastic 'http://192.168.0.3:9200/_snapshot/リポジトリ名/リストアに使用するスナップショット名/_restore' -d '{
"indices": "リストア後のインデックス名",
"ignore_unavailable": "true",
"include_global_state": false
}'

Elasticsearchのインストール及び設定 その8 最終的なコンフィグを作成する

その7までの作業を実施すると、基本的な定義及びsystemctlによる起動停止が可能になります。
今回はコンフィグファイルの最終版を作成したいと思います。

前回の自動起動が上手くいかない場合があれば、この最終版のコンフィグで試していただければと思います。
(駄目な場合はどこかが悪いので・・・・・頑張って直すしかないです。)

(1)Configの修正

# vi /etc/elasticsearch/elasticsearch.yml

【解説】:私の所見を記述しています。
【追加】:オリジナルのConfigに無い定義を追加しています。
【変更】:デフォルト値から変更したものを記述しています。

今回修正をする部分については「★」マークをつけています。

# ======================== Elasticsearch Configuration =========================
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
#       Before you set out to tweak and tune the configuration, make sure you
#       understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please consult the documentation for further information on configuration options:
# https://www.elastic.co/guide/en/elasticsearch/reference/index.html
#
# 【解説】クラスタに関する設定項目
# ---------------------------------- Cluster -----------------------------------    
#
# Use a descriptive name for your cluster:
#
#cluster.name: my-application

# 【解説】【変更】任意のクラスタ名を設定します。
cluster.name: クラスタ名

# 【解説】【追加】同一インスタンス内にシャードを作成しないための設定
#    複数ノード/インスタンスのインスタンスダウン時に2重障害にならないようにする設定です。
cluster.routing.allocation.awareness.attributes: host

#
# 【解説】ノードに関する設定
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
#node.name: node-1
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#

# 【解説】【変更】ノードにホスト名を覚え込ませる設定
#    OSのホスト名を取得して設定するようにしています。
node.attr.host: ${HOSTNAME} 

# 【解説】【追加】1インスタンス内にいくつノードを起動できるかの設定
#    こちらを設定しないと1インスタンス内に複数ノードの起動ができません。
#    今回の最大ノード数が「3」なので3を設定します。
node.max_local_storage_nodes: 3

# 【解説】各種パスに関する設定
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
#path.data: /var/lib/elasticsearch

#【解説】【変更】データを配置するディレクトリ
#    複数ディレクトリ指定したい場合はカンマ( , )で区切って設定します。
path.data: /data

#
# Path to log files:
#

# 【解説】elasticsearchに関するログを保存するディレクトリ
#    困ったことがあればこのログを参照すると手がかりがあります。
path.logs: /var/log/elasticsearch

#
# Path to Snapshot:
#

# 【解説】【追加】スナップショットのデータを保存するディレクトリ
#    他のディレクトリと記述の仕方が異なるので注意が必要です。
#    APIでスナップショットを作成する場合も必要となります。
path.repo: ["/snapshot"]


#
# 【解説】メモリに関する設定
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
#bootstrap.memory_lock: true

# 【解説】【変更】物理メモリのみ利用する設定
#     起動スクリプト側(Systemctl)でも対応が必要なので注意
#     ★起動スクリプトの対応が終わっているので、「true」に修正します。
bootstrap.memory_lock: true #★

#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# 【解説】ネットワークに関する設定
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
#network.host: 192.168.0.1

# 【解説】【変更】バインドIPアドレス
#     ネットワークインタフェースが複数ある場合は、どのIPからの接続を許可するか記述する。
#    (全部OKにする場合は 0.0.0.0)
network.host: 各インスタンスのIPアドレス(19.168.0.1~5)

#
# Set a custom port for HTTP:
#
#http.port: 9200
#
# For more information, consult the network module documentation.
#

# 【解説】クラスタを構成するための要素を設定する項目
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
#discovery.zen.ping.unicast.hosts: ["host1", "host2"]

# 【解説】【変更】マスター適格ノードの指定
#        マスター適格ノード配置するインスタンスのIPアドレスとノードのポート番号を指定します。
#        例では3つのマスター適格ノードを想定しています。
discovery.zen.ping.unicast.hosts: ["192.168.0.1:9390", "192.168.0.2:9390", "192.168.0.3:9390"]

#
# Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):
#
#discovery.zen.minimum_master_nodes:

# 【解説】【変更】マスター適格ノードの最定数
#     マスター適格ノードの障害に備え、どこを最低数とするか指定をします。
#     「discovery.zen.ping.unicast.hostsに指定したノード数 / 2 +1 」で計算します。
#     この数を下回るとElasticsearchの機能が停止します。
discovery.zen.minimum_master_nodes: 2

#
# For more information, consult the zen discovery module documentation.
#
# 【解説】ゲートウェイに関する設定
# ---------------------------------- Gateway -----------------------------------
#
# Block initial recovery after a full cluster restart until N nodes are started:
#
#gateway.recover_after_nodes: 3
#
# For more information, consult the gateway module documentation.
#
# 【解説】その他設定
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true 

# 【解説】【変更】インデックスを指定しないと削除できなくするオプション
#     x-packを導入すると管理用インデックスが作成されます。(「.monitering」等)
#     インデックス全削除APIなどあるのですが、管理用インデックスを削除してしまう事故が
#     発生しないようにこちらを有効にすることをオススメします。
action.destructive_requires_name: true  

# 【解説】X-Pack設定(通常のConfigには記述されていないので、追記する必要があります)
# ---------------------------------- X-Pack ----------------------------------- 

# 【解説】x-packのセキュリティを有効化
xpack.security.enabled: true

# 【解説】セキュリティ有効化にするとTLS設定を有効化する必要がある
xpack.security.transport.ssl.enabled: true

# 【解説】TLSの認証モードの指定
xpack.security.transport.ssl.verification_mode: certificate

# 【解説】TLSのキー設定 
# 「Elasticsearchのインストール及び設定 その2 TLS設定」で作成した認証キーを指定します。
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/certificate/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/certificate/elastic-certificates.p12

# 【解説】モニタリングの設定
#    ★「true」に変更します。
xpack.monitoring.enabled: true #★

# 【解説】ウォッチャーの設定
#    ★「true」に変更します。
xpack.watcher.enabled: true #★

# 【解説】機械学習の設定
# GOLDライセンスには機械学習が含まれないためfalseとします。
xpack.ml.enabled: false

(2)起動/停止確認をします。

前回作成の自動起動/停止の仕組みを利用して起動/停止確認を実施してください。

Elasticsearchのインストール及び設定 その7 自動起動の検討

前回までで一通りの設定が終わりましたので、運用を簡単にするためにも自動化の検討をします。

Elastic社公式のやり方を学ぶ

停止方法

www.elastic.co

$ ./bin/elasticsearch -p /tmp/elasticsearch-pid -d
$ cat /tmp/elasticsearch-pid && echo
15516
$ kill -SIGTERM 15516

上記のようにあくまでプロセスのKillで停止しています。(大胆だなぁ)

RPMインストールで設定されるスクリプトを確認してみる

停止方法だけだとイマイチちゃんとしたものが作れないので、標準のsystemctlで実行しているスクリプトを確認したいと思います。

以下のようにサービスを有効化するとリンクが有効化されますので、そのファイルを確認してみました。

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

以下、標準の自動起動スクリプトの中身

[Unit]
Description=Elasticsearch   # メモ:Unitの説明文
Documentation=http://www.elastic.co # メモ:ドキュメントのURL
Wants=network-online.target # メモ:このUnitが必要とする前提Unit⇒自前systemctlで活用する
After=network-online.target # メモ:このUnitより先に起動するべきUnit⇒自前systemctlで活用する

[Service]
RuntimeDirectory=elasticsearch
Environment=ES_HOME=/usr/share/elasticsearch
Environment=ES_PATH_CONF=/etc/elasticsearch
Environment=PID_DIR=/var/run/elasticsearch
EnvironmentFile=-/etc/sysconfig/elasticsearch

WorkingDirectory=/usr/share/elasticsearch

User=elasticsearch
Group=elasticsearch

ExecStart=/usr/share/elasticsearch/bin/elasticsearch -p ${PID_DIR}/elasticsearch.pid --quiet

# StandardOutput is configured to redirect to journalctl since <===== ここから下も流用します。
# some error messages may be logged in standard output before
# elasticsearch logging system is initialized. Elasticsearch
# stores its logs in /var/log/elasticsearch and does not use
# journalctl by default. If you also want to enable journalctl
# logging, you can simply remove the "quiet" option from ExecStart.
StandardOutput=journal
StandardError=inherit

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of processes
LimitNPROC=4096

# Specifies the maximum size of virtual memory
LimitAS=infinity

# Specifies the maximum file size
LimitFSIZE=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0

# SIGTERM signal is used to stop the Java process
KillSignal=SIGTERM

# Send the signal only to the JVM rather than its control group
KillMode=process

# Java process is never killed
SendSIGKILL=no

# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

# Built for distribution-6.2.2 (distribution)

自動起動の設定

Elastic社のやり方に習って自動起動を作成していきます。

PIDを格納するフォルダの作成

停止コマンドでも自動スクリプトでもPIDを元にプロセスの停止をしています。
起動時にこのPIDをファイルに書き込むのですが、そのファイルを保存するフォルダが必要となります。
/usr/lib配下にフォルダを作るのですが、RHEL7以降はちゃんと手順を踏まないと再起動したときに削除されてしまいます。

(1)/usr/lib/tmpfiles.d 配下に定義ファイルを作成
# vi /usr/lib/tmpfiles.d/my_auto_elasticsearch.conf

以下のように記述をします。

d /var/run/my_auto_elasticsearch 0755 elasticsearch elasticsearch

(2)OSの再起動を実施します。

(3)フォルダが作成されているか確認します。
例では「my_auto_elasticsearch」フォルダが出来ているはずです。

# ls /var/run

systemctlで制御するスクリプトの作成

systemctlで制御するサービスと認識されるようにスクリプトの作成をします。

/etc/systemd/system の配下に サービス名.service のファイルを作成します。
「.service」部分が無いとsystemctlのサービスとして認識されないので注意が必要です。

(1)マスターノード起動/停止スクリプトの作成
 ノード毎に起動スクリプトを分けます。

・マスターノード
# vi /etc/systemd/system/master_node.service

・データノード
# vi /etc/systemd/system/data_node.service

・クライアントノード
# vi /etc/systemd/system/client_node.service

※下記のスクリプトのXXX箇所をmaster/data/clientに書き換えてください。

[Unit]
Description=Elasticsearch XXX Node Service  
Wants=network-online.target
After=network-online.target

[Service]
#メモ:外部スクリプトを呼ぶ場合はforkingにする
Type=forking

# メモ:外部スクリプトを呼ぶようにしています。引数で対象ノードと動作を指定します。
# XXXにmaster/node/clientのいずれかを記述してください。
ExecStart=/usr/local/bin/elasticsearch_control.sh XXX start

# StandardOutput is configured to redirect to journalctl since
# some error messages may be logged in standard output before
# elasticsearch logging system is initialized. Elasticsearch
# stores its logs in /var/log/elasticsearch and does not use
# journalctl by default. If you also want to enable journalctl
# logging, you can simply remove the "quiet" option from ExecStart.
StandardOutput=journal
StandardError=inherit

# プロセスの最大ファイルディスクリプタ数(Elasticsearchの起動スクリプトのデフォルト値を設定)
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# プロセスの最大数(Elasticsearchの起動スクリプトのデフォルト値を設定)
# Specifies the maximum number of processes
LimitNPROC=4096

# 仮想メモリの最大サイズ(Elasticsearchの起動スクリプトのデフォルト値を設定)
# Specifies the maximum size of virtual memory
LimitAS=infinity

# 最大ファイルサイズ(Elasticsearchの起動スクリプトのデフォルト値を設定)
# Specifies the maximum file size
LimitFSIZE=infinity

# タイムアウトを無効化し、プロセスの停止まで待つ(Elasticsearchの起動スクリプトのデフォルト値を設定)
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0

# Elasticsearchのプロセス(Javaプロセス)のKillシグナルの指定(Elasticsearchの起動スクリプトのデフォルト値を設定)
# SIGTERM signal is used to stop the Java process
KillSignal=SIGTERM

# Elasticsearchのプロセス(Javaプロセス)の操作グループ(Elasticsearchの起動スクリプトのデフォルト値を設定)
# Send the signal only to the JVM rather than its control group
KillMode=process

# Javaプロセスを停止しない設定(Elasticsearchの起動スクリプトのデフォルト値を設定)
# Java process is never killed
SendSIGKILL=no

# JVMがSIGTERMシグナルを受信した際の終了コード(Elasticsearchの起動スクリプトのデフォルト値を設定)
# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143

# 【追加】swap off時に必須となるパラメータ
# 参考:https://support.elastic.co/customers/s/article/How-do-I-enable-mlockall-on-Linux
# Memory Limit
LimitMEMLOCK=infinity

[Install]
WantedBy=multi-user.target

(2)サービスの確認
以下のコマンドを実施して(1)で作成したスクリプトがサービスとして認識されていることを確認します。

systemctl list-unit-files --type=service | grep node

(3)実際にノードを起動させるシェルの作成
systemctlに登録した起動スクリプトから呼び出しているシェルを作成します。

# vi /usr/local/bin/elasticsearch_control.sh

#!/bin/bash

#### 変数定義 ####
## Common
# Elasticsearchのインストールパス
ES_HOME=/usr/share/elasticsearch

# Elasticsearchのコンフィグが格納されているパス 
ES_PATH_CONF=/etc/elasticsearch

# プロセスIDを格納するパス
PID_DIR=/var/run/my_auto_elasticsearch

#ulimitはOS側に設定していますが、念のため記述します。
ulimit -n 65536

# 引数として渡されたノードの種類によって処理をパラメタを変えます。
case "$1" in
  client)
    echo "client"
    JVM="-Xms8g -Xmx8g" # JVM
    FLG_MASTER=false    # Master Node Flag
    FLG_DATA=false  # Data Node Flag
    HTTP_PORT=9200  # REST API PORT
    TCP_PORT=9300   # INTERNAL PORT
    PID_FILE=client.pid # PID FILE NAME
    OPTIONAL_PARM=""    # OPTIONAL PARAMETER
    NODE_NAME=${HOSTNAME}_CLIENT    # NODE_NAME
    ;;
  master)
    echo "master"
    JVM="-Xms8g -Xmx8g" # JVM
    FLG_MASTER=true # Master Node Flag
    FLG_DATA=false  # Data Node Flag
    HTTP_PORT=9290  # REST API PORT
    TCP_PORT=9390   # INTERNAL PORT
    PID_FILE=master.pid # PID FILE NAME
    OPTIONAL_PARM=""    # OPTIONAL PARAMETER
    NODE_NAME=${HOSTNAME}_MASTER    # NODE_NAME
    ;;
  data)
    echo "data"
    JVM="-Xms30g -Xmx30g"   # JVM
    FLG_MASTER=false    # Master Node Flag
    FLG_DATA=true   # Data Node Flag
    HTTP_PORT=9210  # REST API PORT
    TCP_PORT=9310   # INTERNAL PORT
    PID_FILE=hot1.pid   # PID FILE NAME

    # OPTIONAL PARAMETER
    #  hot/warmの設定をしたい時は以下のパラメータを付与します。 
    #OPTIONAL_PARM="-Enode.attr.box_type=hot"  # Hot Node
    #OPTIONAL_PARM="-Enode.attr.box_type=warm"  # Warm Node

    NODE_NAME=${HOSTNAME}_DATA  # NODE_NAME
    ;;
  *)
    echo $"Usage: NODE {master|data|client}"
    exit
esac

#### Action ####

case "$2" in
  start)
    echo "Start"
    sudo -u elasticsearch ES_JAVA_OPTS="${JVM}" ${ES_HOME}/bin/elasticsearch -p ${PID_DIR}/${PID_FILE} -d -Ehttp.port=${HTTP_PORT} -Etransport.tcp.port=${TCP_PORT} -Enode.master=${FLG_MASTER} -Enode.data=${FLG_DATA} -Enode.name=${NODE_NAME} ${OPTIONAL_PARM}

    ;;

  stop)
    echo "Stop"
    kill -SIGTERM `cat ${PID_DIR}/${PID_FILE}`
    ;;

  *)
    echo $"Usage: ACTION {start|stop|restart}"

esac

(4)シェルの動作確認

実際に作成したスクリプトにノード種類と制御を渡して実行します。
単一ノード及び各サーバで動作させたいノードを複数起動/停止できることを確認します。

/usr/local/bin/elasticsearch_control.sh master start
/usr/local/bin/elasticsearch_control.sh master stop

(5)systemctl制御の確認
実際にサービス制御が可能か確認をします。

・マスターノード
# systemctl start master_node.service
# systemctl stop master_node.service

・データノード
# systemctl start data_node.service
# systemctl stop data_node.service

・クライアントノード
# systemctl start client_node.service
# systemctl stop client_node.service

各サーバの起動/停止一覧

ここまで設定を実施するとsystemctl enableで自動起動/停止を有効にしたいところですが、Elasticsearchの複数ノード構成の場合は所定の手順で実施しないとデータが破損します。
※複数ノードの所定の起動/停止方法は後ほど記述します。

そのため、起動/停止コマンドをテキストにメモしておき実行することをオススメします。
※これまで作成してきた仕組みは短いコマンドで簡単に起動/停止できるようにするためのものです。
※現時点では管理データしかないので破損はほぼないです。

RHEL#1
# systemctl start/stop master_node.service
# systemctl start/stop data_node.service

RHEL#2
# systemctl start/stop master_node.service
# systemctl start/stop data_node.service

RHEL#3
# systemctl start/stop master_node.service
# systemctl start/stop data_node.service
# systemctl start/stop client_node.service

RHEL#4
# systemctl start/stop data_node.service
# systemctl start/stop client_node.service

RHEL#5
# systemctl start/stop data_node.service
# systemctl start/stop client_node.service

Elasticsearchのインストール及び設定 その6 X-Packのライセンス登録

はじめに

Elasticsearchは基本的に無料です。
X-Packについては有償版があり、購入をするとライセンスが発行されますので登録をする必要があります。

製品版ライセンスのダウンロード

製品版ライセンスはサポートに登録したメンバーのメールアドレス宛にURL情報が送付されますので、そこからライセンスファイル(jsonファイル)のダウンロードを実施します。
※有償版の購入をすると、メールアドレスの登録が求められます。(メーリングリスト可)

ライセンスの登録

ライセンスの登録方法はBASIC(無償版)と有償版の違いはありません。
事前にライセンスファイルをElasticsearchサーバにアップロードしてください。
※本手順ではRHEL#3の/root直下にアップロードした前提で記載をします。

# curl -XPUT -u elastic 'http://192.168.0.3:9200/_xpack/license?acknowledge=true' -H "Content-Type: application/json" -d @/root/ライセンスファイル名.json

{"acknowledged":true,"license_status":"valid"}

【ポイント】
 Elasticsearch6系からPUTの際は「 -H "Content-Type: application/json"」をAPI内に入れる必要があります。  

ライセンスの確認

下記のAPIを発行することでライセンスの確認ができます。

# curl -XGET 'http://192.168.0.3:9200/_xpack/license'
{
  "license" : {
    "status" : "active",  <================= 「active」であることを確認
    "uid" : "UIDが表記される",
    "type" : "gold", <=================== 購入した製品と合致しているか確認
    "issue_date" : "ライセンス有効日",
    "issue_date_in_millis" : 1518998400000,
    "expiry_date" : "ライセンスの期限日", <===== 基本1年更新なのでライセンスの期限日を確認します
    "expiry_date_in_millis" : 1550620799999,
    "max_nodes" : 8, <================== Master及びDataノードが対象で、総数以上であることを確認します
    "issued_to" : "登録者名",
    "issuer" : "Web Form",
    "start_date_in_millis" : 1518998400000
  }
}

Elasticsearchのインストール及び設定 その5 ビルトインアカウントのパスワード変更

はじめに

前回でElasticsearchの起動ができたので、これからビルトインアカウントのパスワードを変更します。

f:id:gitya107:20180519141408p:plain

作業のポイント

  • この手順は 「クラスタで1回」 だけ実施すれば良いです。
  • 事前にElasticsearchを起動しておく必要があります。
  • Configの「xpack.security.elabled」が「true」で無ければ設定ができません
  • 実行するコマンドがデフォルトのポート(9200)に対してAPIを裏で発行しているようです。
    そのため、RHEL#3で作業を実施します。

実施手順

以下のコマンドを実行します。 各パスワードは任意のものを設定してください。
logstash を使用していませんが、気にせずパスワードを設定して大丈夫です。

# /usr/share/elasticsearch/bin/x-pack/setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,kibana,logstash_system.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N] y
Enter password for [elastic]:パスワードを入力
Reenter password for [elastic]:パスワードを入力
Enter password for [kibana]:パスワードを入力
Reenter password for [kibana]:パスワードを入力
Enter password for [logstash_system]:パスワードを入力
Reenter password for [logstash_system]:パスワードを入力
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [elastic]

確認方法(クラスタの状態確認をするAPIを発行)

セキュリティが有効の場合は、Elasticsearchに対してAPIを発行する際にID/PASを入力必要があります。
上述の手順でパスワードの設定をしましたので、APIを発行してみます。

設定と同様にRHEL#3に対してAPIを発行します。(#4、#5でも大丈夫です)
「-u」オプションの後にユーザを指定します。

curl -XGET -u elastic http://192.168.0.3:9200/_cluster/health?pretty
<<パスワードを求められたら入力>>
{
  "cluster_name" : "クラスタ名",  <===== 設定したクラスタ名か確認します
  "status" : "green",  <============= 「green」が正常です。それ以外は何かがおかしいので要調査です
  "timed_out" : false,
  "number_of_nodes" : 8, <========== Master及びDataノードの総数のはずです(手元に環境が無く自信なし)
  "number_of_data_nodes" : 5, <====== データノードが設定した数かどうかを確認します。
  "active_primary_shards" : 5, <======= データを投入すると数が変わるので、あまり気にしていないです
  "active_shards" : 10,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0, <========= shardのデータが破損した時の数です。
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

「.security」について

下記のAPIを発行するとインデックスの一覧が表示されます。 現段階だと「.security」というインデックスがあるはずです。
こちらに上記で設定したビルトインアカウントのパスワードが入っているようです。

なので、全インデックスの削除コマンドを実行すると.securityも削除され、APIの認証が通らなくなります。
(筆者が実際にやってしまった) 誤って消してしまった場合も、上記の手順で再度パスワードの設定ができます。(検証済)
また、Configの「action.destructive_requires_name」に「true」を設定することで、インデックス名を指定しないと削除ができなくなりますので、この定義は設定した方が良いです。

curl -XGET -u elastic http://192.168.0.3:9200/_aliases?pretty
<<パスワードを求められたら入力>>
~実行結果は手元にないです・・・~

Elasticsearchのインストール及び設定 その4 Config(yml)の修正及びElasticsearchの起動

Elasticsearchの設定をしていきます。

構成としては前回解説したもので、さらにIPアドレスと内部通信用ポート(93XX)、API用ポート(92XX)を下図のような感じで作成しようと思います。

SIer出身なのでなるべく設定は統一し、拡張性を考えた感じとしています。
ポートも気にされるお客様が多いので固定かつノードの種類毎に割り振りを考えています。

f:id:gitya107:20180513160318p:plain

各種ディレクトリの作成

Elasticsearchの設定で以下の2つのディレクトリが必要となります。

RHEL#1~#5それぞれのサーバに設定が必要です。

データ格納用ディレクトリの作成

Elasticsearchのデータが格納されるディレクトリを作成します。
Configではpath.dataという定義で指定されます。
1つでも複数でも良く、データの配分等々はElasticsearchが自動的に実施してくれます。
結構なディスクI/Oがあるようなので、ディスク(RAID)毎にディレクトリを作成した方が良いです。

(1)ディレクトリの作成
# mkdir -p /data

(2)所有者及び権限の変更

# chown -R elasticsearch:elasticsearch /data
#chmod -R o-rx /data

スナップショット用ディレクトリの格納

スナップショットを作成するためにはConfigのpath.repoという定義を設定する必要があります。
スナップショットはNFSサーバの共有ディレクトリに取得する必要があります。
ただし、常時NFSをマウントするより必要時にマウントする方が良いと思われます。
そのため、path.repoにはマウントポイントを設定するのが良いと思われます。

(1)ディレクトリの作成
# mkdir -p /snapshot

(2)所有者及び権限の変更

# chown -R elasticsearch:elasticsearch /snapshot
# chmod -R o-rx /snapshot

Config(yml)の修正

RHEL#1~#5それぞれのサーバに設定が必要です。

全ての定義をConfigに記述しても良いのですが、今回1インスタンス内に複数ノードを起動する想定のため各ノードの共通設定をConfigに記述します。
※全て起動コマンドに記述する方法もあります。

(1)Configのバックアップ
# cp -p /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.org

(2)バックアップとオリジナルの差分がないことを確認 # diff /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.org

(3)Configの修正 # vi /etc/elasticsearch/elasticsearch.yml

【解説】:私の所見を記述しています。
【追加】:オリジナルのConfigに無い定義を追加しています。
【変更】:デフォルト値から変更したものを記述しています。

# ======================== Elasticsearch Configuration =========================
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
#       Before you set out to tweak and tune the configuration, make sure you
#       understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please consult the documentation for further information on configuration options:
# https://www.elastic.co/guide/en/elasticsearch/reference/index.html
#
# 【解説】クラスタに関する設定項目
# ---------------------------------- Cluster -----------------------------------    
#
# Use a descriptive name for your cluster:
#
#cluster.name: my-application

# 【解説】【変更】任意のクラスタ名を設定します。
cluster.name: クラスタ名

# 【解説】【追加】同一インスタンス内にシャードを作成しないための設定
#    複数ノード/インスタンスのインスタンスダウン時に2重障害にならないようにする設定です。
cluster.routing.allocation.awareness.attributes: host

#
# 【解説】ノードに関する設定
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
#node.name: node-1
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#

# 【解説】【変更】ノードにホスト名を覚え込ませる設定
#    OSのホスト名を取得して設定するようにしています。
node.attr.host: ${HOSTNAME} 

# 【解説】【追加】1インスタンス内にいくつノードを起動できるかの設定
#    こちらを設定しないと1インスタンス内に複数ノードの起動ができません。
#    今回の最大ノード数が「3」なので3を設定します。
node.max_local_storage_nodes: 3

# 【解説】各種パスに関する設定
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
#path.data: /var/lib/elasticsearch

#【解説】【変更】データを配置するディレクトリ
#    複数ディレクトリ指定したい場合はカンマ( , )で区切って設定します。
path.data: /data

#
# Path to log files:
#

# 【解説】elasticsearchに関するログを保存するディレクトリ
#    困ったことがあればこのログを参照すると手がかりがあります。
path.logs: /var/log/elasticsearch

#
# Path to Snapshot:
#

# 【解説】【追加】スナップショットのデータを保存するディレクトリ
#    他のディレクトリと記述の仕方が異なるので注意が必要です。
#    APIでスナップショットを作成する場合も必要となります。
path.repo: ["/snapshot"]


#
# 【解説】メモリに関する設定
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
#bootstrap.memory_lock: true

# 【解説】【変更】物理メモリのみ利用する設定
#     起動スクリプト側(Systemctl)でも対応が必要なので注意
#     この時点では`false`としておきます。
bootstrap.memory_lock: false

#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# 【解説】ネットワークに関する設定
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
#network.host: 192.168.0.1

# 【解説】【変更】バインドIPアドレス
#     ネットワークインタフェースが複数ある場合は、どのIPからの接続を許可するか記述する。
#    (全部OKにする場合は 0.0.0.0)
network.host: 各インスタンスのIPアドレス(19.168.0.1~5)

#
# Set a custom port for HTTP:
#
#http.port: 9200
#
# For more information, consult the network module documentation.
#

# 【解説】クラスタを構成するための要素を設定する項目
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when new node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
#discovery.zen.ping.unicast.hosts: ["host1", "host2"]

# 【解説】【変更】マスター適格ノードの指定
#        マスター適格ノード配置するインスタンスのIPアドレスとノードのポート番号を指定します。
#        例では3つのマスター適格ノードを想定しています。
discovery.zen.ping.unicast.hosts: ["192.168.0.1:9390", "192.168.0.2:9390", "192.168.0.3:9390"]

#
# Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):
#
#discovery.zen.minimum_master_nodes:

# 【解説】【変更】マスター適格ノードの最定数
#     マスター適格ノードの障害に備え、どこを最低数とするか指定をします。
#     「discovery.zen.ping.unicast.hostsに指定したノード数 / 2 +1 」で計算します。
#     この数を下回るとElasticsearchの機能が停止します。
discovery.zen.minimum_master_nodes: 2

#
# For more information, consult the zen discovery module documentation.
#
# 【解説】ゲートウェイに関する設定
# ---------------------------------- Gateway -----------------------------------
#
# Block initial recovery after a full cluster restart until N nodes are started:
#
#gateway.recover_after_nodes: 3
#
# For more information, consult the gateway module documentation.
#
# 【解説】その他設定
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true 

# 【解説】【変更】インデックスを指定しないと削除できなくするオプション
#     x-packを導入すると管理用インデックスが作成されます。(「.monitering」等)
#     インデックス全削除APIなどあるのですが、管理用インデックスを削除してしまう事故が
#     発生しないようにこちらを有効にすることをオススメします。
action.destructive_requires_name: true  

# 【解説】X-Pack設定(通常のConfigには記述されていないので、追記する必要があります)
# ---------------------------------- X-Pack ----------------------------------- 

# 【解説】x-packのセキュリティを有効化
xpack.security.enabled: true

# 【解説】セキュリティ有効化にするとTLS設定を有効化する必要がある
xpack.security.transport.ssl.enabled: true

# 【解説】TLSの認証モードの指定
xpack.security.transport.ssl.verification_mode: certificate

# 【解説】TLSのキー設定 
# 「Elasticsearchのインストール及び設定 その2 TLS設定」で作成した認証キーを指定します。
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/certificate/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/certificate/elastic-certificates.p12

# 【解説】モニタリングの設定
# ※この時点ではfalseにしておきます。
xpack.monitoring.enabled: false

# 【解説】ウォッチャーの設定
# ※この時点ではfalseにしておきます。
xpack.watcher.enabled: false

# 【解説】機械学習の設定
# GOLDライセンスには機械学習が含まれないためfalseとします。
xpack.ml.enabled: false

起動コマンドによる起動

上記のElasticsearchのConfig作成が完了したら、以下のコマンドから各ノードの起動を実施します。
コマンドで設定する内容としてはポートやノード名などConfigで共通定義できないものとしています。
(全部コマンドで設定する人も居るようです)

次回以降で起動コマンドのsystemctlについて記載しますので、最終的にはもっと楽になります。

「elasticsearch」コマンドでノードの起動を実施します。
※長いので改行して見やすくしています。実行時は1行のコマンドに修正してください。

sudo -u elasticsearch ES_JAVA_OPTS="JAVAメモリ設定" /etc/elasticsearch/bin/elasticsearch 
-d -Ehttp.port=API用ポート番号 
-Etransport.tcp.port=内部通信用ポート番号 
-Enode.master=マスターノードかどうか 
-Enode.data=データノードかどうか 
-Enode.name=ノード名

各サーバで実行するコマンドは今回の環境では下記のようになります。
結構なコマンド数になるのでsystemctlに登録した方がいいです。

(1)RHEL#1

・マスターノード

# sudo -u elasticsearch ES_JAVA_OPTS="-Xms8g -Xmx8g" /etc/elasticsearch/bin/elasticsearch -d -Ehttp.port=9290  -Etransport.tcp.port=9390 -Enode.master=true -Enode.data=false -Enode.name=master

・データノード

# sudo -u elasticsearch ES_JAVA_OPTS="-Xms30g -Xmx30g" /etc/elasticsearch/bin/elasticsearch -d -Ehttp.port=9210  -Etransport.tcp.port=9310 -Enode.master=false -Enode.data=true -Enode.name=data

(2)RHEL#2

・マスターノード

# sudo -u elasticsearch ES_JAVA_OPTS="-Xms8g -Xmx8g" /etc/elasticsearch/bin/elasticsearch -d -Ehttp.port=9290  -Etransport.tcp.port=9390 -Enode.master=true -Enode.data=false -Enode.name=master

・データノード

# sudo -u elasticsearch ES_JAVA_OPTS="-Xms30g -Xmx30g" /etc/elasticsearch/bin/elasticsearch -d -Ehttp.port=9210  -Etransport.tcp.port=9310 -Enode.master=false -Enode.data=true -Enode.name=data

(3)RHEL#3

・マスターノード

# sudo -u elasticsearch ES_JAVA_OPTS="-Xms8g -Xmx8g" /etc/elasticsearch/bin/elasticsearch -d -Ehttp.port=9290  -Etransport.tcp.port=9390 -Enode.master=true -Enode.data=false -Enode.name=master

・データノード

# sudo -u elasticsearch ES_JAVA_OPTS="-Xms30g -Xmx30g" /etc/elasticsearch/bin/elasticsearch -d -Ehttp.port=9210  -Etransport.tcp.port=9310 -Enode.master=false -Enode.data=true -Enode.name=data

・クライアントノード

# sudo -u elasticsearch ES_JAVA_OPTS="-Xms8g -Xmx8g" /etc/elasticsearch/bin/elasticsearch -d -Ehttp.port=9200  -Etransport.tcp.port=9300 -Enode.master=false -Enode.data=false -Enode.name=client

(4)RHEL#4

・データノード

# sudo -u elasticsearch ES_JAVA_OPTS="-Xms30g -Xmx30g" /etc/elasticsearch/bin/elasticsearch -d -Ehttp.port=9210  -Etransport.tcp.port=9310 -Enode.master=true -Enode.data=false -Enode.name=master

・クライアントノード

# sudo -u elasticsearch ES_JAVA_OPTS="-Xms8g -Xmx8g" /etc/elasticsearch/bin/elasticsearch -d -Ehttp.port=9200  -Etransport.tcp.port=9300 -Enode.master=false -Enode.data=false -Enode.name=client

(5)RHEL#5

・データノード

# sudo -u elasticsearch ES_JAVA_OPTS="-Xms30g -Xmx30g" /etc/elasticsearch/bin/elasticsearch -d -Ehttp.port=9210  -Etransport.tcp.port=9310 -Enode.master=true -Enode.data=false -Enode.name=master

・クライアントノード

# sudo -u elasticsearch ES_JAVA_OPTS="-Xms8g -Xmx8g" /etc/elasticsearch/bin/elasticsearch -d -Ehttp.port=9200  -Etransport.tcp.port=9300 -Enode.master=false -Enode.data=false -Enode.name=client

起動後の確認

この状態ですと次の「ビルトインアカウントのパスワード変更」をしないとElasticsearchのAPIが利用(認証)できないです。
そのため、起動しているかどうかは「java」のプロセス数で確認してください。

# ps -ef | grep java | grep -v grep | wc -l

上記のコマンドで起動したノード数と一致していれば大丈夫です。

Elasticsearchのインストール及び設定 その3 構成を検討する

はじめに

定義ファイルや起動コマンドの解説をする前にどういった構成を作成するか記述します。

下記事項はインストールする前に検討した方が良いです。
記事の投稿順を間違えました。。。。

Elasticsearch 構成の検討

実際に設定をしていく前にElasticsearchの構成を検討します。
今回は下記のような構成を考えました。

f:id:gitya107:20180512102711p:plain

(1)サーバ(インスタンス)の台数について
デフォルトのシャード設定がプライマリ5:レプリカ1と言うことで、何も考えずにデータを投入した際に1サーバに1シャード配置される想定で5台としています。
次の項目で記載するマスター適格ノードの考察から、クラスタを構成する場合はサーバ3台以上が望ましいと思われます。

(2)マスター適格ノードの数について
図中ではMasterと記載しています。
後ほど記載するのですが、定義ファイル内にマスター適格ノードの最低数を定義する項目があります。
その算出式が「マスター適格ノードの合計数 / 2 +1」となっています。この式から最低数が2ノードであり、1ノード障害を考慮すると3ノードかなと思われます。

一般的なクラスタでも3台以上の構成というのが多いので、今回は3ノードとします。
(どこかにElasticsearchのクラスタ構成に関する記述があったと思いますので、後で探してみようと思います。)

(3)データノードの数について
上述した通りデフォルトのシャード分割から5つとしています。

1ノードのメモリ上限が30GBですので、サーバ1台にデータノードを複数保持することも可能です。
ただし、サーバ障害やメンテナンス時に停止となるノード数が複数になってしまうため、データ欠損の可能性があがります。
このあたりはシャード/性能/冗長性を考慮する必要があり、一度構成を組んで実際に使いながら検討をした方が良いです。
格納されるデータの内容や量、ユーザ数や利用状況等々により変わってくるので、事前に検討は難しいと思います。

(4)クライアントノード(Ingest node)
マスターと同様の考えで3ノードとしています。

サーバの構成について

物理か仮想か

Elasticsearchの性能設計はどうしたら良いのか色々と調べましたが、これと言った算出根拠はありませんでした。
色々なところに書いていますが、格納されるデータの内容や量、ユーザ数や利用状況等々で必要性能が変わってくるため、公式ではあまり触れていないのかなと類推しています。

上記もあり柔軟にリソースの変更が可能な「仮想」をオススメします。

リソースの検討

サーバのリソースを検討します。

公式HP

www.elastic.co

(1)CPU
2コア~8コア以上のCPUが推奨となっています。

(2)メモリ
下記の条件から検討します。

  • OSの半分のメモリをElasticsearchに割り当てる
  • マスター及びクライアントノード:4~8GB
  • データノード:~30GB

RHEL#3がノード数最多なので、こちらを基準とします。
最大でElasticsearchとして46GB使用しますので、96GB(92だが一般的なメモリで搭載したケースを考慮)のメモリが必要です。

(3)ディスク
ディスクI/OがElasticsearchの性能に大きく影響するようです。

SSDをお勧めします。
Elasticsearchの データは他のところに原本がある/データを分散保持しており、他から再構成が可能 という特性からRAIDは組まなくても大丈夫かなと思います。

データの保存場所は定義ファイルで複数指定できるので、複数本のSSDを接続して容量を確保できます。