9- 考虑安装和设置自动启动 ElasticSearch

这是我以前在Hatena博客上投稿的文章。

首先/首要

因为上一次已经完成了基本设置,为了简化运营,我们将考虑自动化的方案。

学习Elastic公司的公式方法.

停止的方式

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

就像上面所说的那样,只是通过终止进程来停止它。(真是大胆啊)

请尝试查看在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) 我们将重新启动操作系统。

请确认文件夹是否已经被创建。在这个例子中,应该已经创建了一个名为「my_auto_elasticsearch」的文件夹。

# ls /var/run

创建一个能够通过systemctl进行控制的脚本

我将创建一个脚本,使其被识别为systemctl控制的服务。

请在/etc/systemd/system目录下创建一个名为”服务名.service”的文件。
要注意,如果没有包含”.service”部分,systemctl将无法识别它作为一个服务。

创建启动/停止主节点脚本
为每个节点创建单独的启动脚本。

・主节点

# 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)创建一个可启动节点的shell脚本
我们要创建一个调用从注册到systemctl的启动脚本的shell脚本。

# 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)进行Shell操作验证

使用已创建的脚本,传递节点类型和控制来执行。
确保可以启动/停止单个节点和在每个服务器上运行想要的多个节点。

/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多节点配置的情况下,如果不按照指定的步骤执行,可能会导致数据损坏。
※有关多节点的指定启动/停止方法将稍后详述。

因此,建议将启动/停止命令记录在文本中并执行。
* 迄今为止,我们创建的机制旨在通过简短的命令轻松实现启动/停止。
* 目前仅存在管理数据,几乎不会出现损坏的情况。

・红帽企业Linux #1

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

・红帽企业版Linux#2

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

・红帽企业Linux3

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

・红帽企业 Linux 版本4

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

红帽企业版Linux 5

# systemctl start/stop data_node.service
# systemctl start/stop client_node.service
bannerAds