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