启动与停止 Elasticsearch
理解如何正确启动和停止 Elasticsearch 对于维护稳定高效的集群至关重要。本指南概述了安全启动和停止 Elasticsearch 的推荐方法,同时考虑了不同的安装类型,包括基于包的安装、Docker 容器以及手动解压的归档文件。
启动 Elasticsearch 的方法因安装方式而异。
如果您在 Linux 或 MacOS 上使用 .tar.gz 包安装了 Elasticsearch,则可以从命令行启动 Elasticsearch。
运行以下命令从命令行启动 Elasticsearch
./bin/elasticsearch
默认情况下,Elasticsearch 将其日志输出到控制台(stdout)以及日志目录中的 <cluster name>.log 文件中。Elasticsearch 在启动时会记录一些信息,但在完成初始化后,它将继续在前台运行,并且在发生值得记录的事情之前不会再记录任何内容。在 Elasticsearch 运行时,您可以通过其默认端口为 9200 的 HTTP 接口与其交互。
要停止 Elasticsearch,请按 Ctrl-C。
Elasticsearch 随附的所有脚本都需要支持数组的 Bash 版本,并假定 Bash 位于 /bin/bash。因此,Bash 应直接或通过符号链接在此路径下可用。
如果您是第一次启动 Elasticsearch,它还会启用并配置安全性。了解详情。
要将 Elasticsearch 作为守护进程运行,请在命令行中指定 -d,并使用 -p 选项将进程 ID 记录在文件中
./bin/elasticsearch -d -p pid
如果您对 Elasticsearch 密钥库进行了密码保护,系统将提示您输入密钥库的密码。有关更多详细信息,请参阅安全设置。
日志消息可以在 $ES_HOME/logs/ 目录中找到。
要关闭 Elasticsearch,请终止 pid 文件中记录的进程 ID
pkill -F pid
如果您在 Windows 上使用 .zip 包安装了 Elasticsearch,则可以从命令行启动 Elasticsearch。如果您希望 Elasticsearch 在引导时自动启动而无需任何用户交互,请将 Elasticsearch 安装为服务。
运行以下命令从命令行启动 Elasticsearch
.\bin\elasticsearch.bat
默认情况下,Elasticsearch 将其日志输出到控制台(STDOUT)以及日志目录中的 <cluster name>.log 文件中。Elasticsearch 在启动时会记录一些信息,但在完成初始化后,它将继续在前台运行,并且在发生值得记录的事情之前不会再记录任何内容。在 Elasticsearch 运行时,您可以通过其默认端口为 9200 的 HTTP 接口与其交互。
要停止 Elasticsearch,请按 Ctrl-C。
如果您是第一次启动 Elasticsearch,它还会启用并配置安全性。了解详情。
要将 Elasticsearch 配置为在系统启动时自动启动,请运行以下命令
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service
可以按如下方式启动和停止 Elasticsearch
sudo systemctl start elasticsearch.service
sudo systemctl stop elasticsearch.service
这些命令不会就 Elasticsearch 是否已成功启动提供任何反馈。相反,此信息将被写入位于 /var/log/elasticsearch/ 中的日志文件中。
如果您对 Elasticsearch 密钥库设置了密码保护,您需要通过本地文件和 systemd 环境变量向 systemd 提供密钥库密码。此本地文件在存在期间应予以保护,并且一旦 Elasticsearch 正常运行,即可安全删除。
echo "keystore_password" > /path/to/my_pwd_file.tmp
chmod 600 /path/to/my_pwd_file.tmp
sudo systemctl set-environment ES_KEYSTORE_PASSPHRASE_FILE=/path/to/my_pwd_file.tmp
sudo systemctl start elasticsearch.service
默认情况下,Elasticsearch 将针对 systemd 的 TimeoutStartSec 参数设置为 900s。如果您运行的 systemd 版本至少为 238,则 Elasticsearch 可以自动延长启动超时,并且即使耗时超过 900 秒,也会反复延长直至启动完成。
238 之前的 systemd 版本不支持超时延长机制,如果 Elasticsearch 未在配置的超时时间内完全启动,系统将终止该进程。如果发生这种情况,Elasticsearch 将在其日志中报告它在启动后不久被正常关闭
[2022-01-31T01:22:31,077][INFO ][o.e.n.Node ] [instance-0000000123] starting ...
...
[2022-01-31T01:37:15,077][INFO ][o.e.n.Node ] [instance-0000000123] stopping ...
[2022-01-31T01:37:15,079][INFO ][o.e.n.Node ] [instance-0000000123] closing ...
[2022-01-31T01:37:15,080][INFO ][o.e.n.Node ] [instance-0000000123] closed
然而,systemd 日志将报告启动超时
Jan 31 01:22:30 debian systemd[1]: Starting Elasticsearch...
Jan 31 01:37:15 debian systemd[1]: elasticsearch.service: Start operation timed out. Terminating.
Jan 31 01:37:15 debian systemd[1]: elasticsearch.service: Main process exited, code=killed, status=15/TERM
Jan 31 01:37:15 debian systemd[1]: elasticsearch.service: Failed with result 'timeout'.
Jan 31 01:37:15 debian systemd[1]: Failed to start Elasticsearch.
为避免这种情况,请将您的 systemd 升级到至少 238 版本。您也可以通过延长 TimeoutStartSec 参数来临时规避该问题。如果升级后超时错误仍然存在,请在您的 systemd 重写 (override) 配置中设置 NotifyAccess=all。
如果您安装了 Docker 镜像,则可以从命令行启动 Elasticsearch。根据您使用的是开发模式还是生产模式,有不同的方法。请参见使用 Docker 安装 Elasticsearch。
Elasticsearch 的有序关闭确保了 Elasticsearch 有机会清理和关闭未完成的资源。例如,以有序方式关闭的节点将从集群中自我移除、将事务日志(translog)同步到磁盘并执行其他相关的清理活动。通过正确停止 Elasticsearch,您可以帮助确保有序关闭。
如果您将 Elasticsearch 作为服务运行,则可以通过安装提供的服务管理功能来停止 Elasticsearch。
如果您直接运行 Elasticsearch,如果您在控制台中运行 Elasticsearch,可以通过发送 Ctrl+C 来停止它,或者在 POSIX 系统上向 Elasticsearch 进程发送 SIGTERM。您可以通过各种工具(例如 ps 或 jps)获取要向其发送信号的 PID
$ jps | grep elasticsearch
14542 elasticsearch
从 Elasticsearch 启动日志中
[2016-07-07 12:26:18,908][INFO ][node ] [I8hydUG] version[5.0.0-alpha4], pid[15399], build[3f5b994/2016-06-27T16:23:46.861Z], OS[Mac OS X/10.11.5/x86_64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_92/25.92-b14]
或者通过在启动时指定写入 PID 文件的位置(-p <path>)
$ ./bin/elasticsearch -p /tmp/elasticsearch-pid -d
$ cat /tmp/elasticsearch-pid && echo
15516
$ kill -SIGTERM 15516
在 Elasticsearch 虚拟机生命周期内,可能会出现某些使虚拟机处于可疑状态的致命错误。此类致命错误包括内存溢出错误、虚拟机内部错误以及严重的 I/O 错误。
当 Elasticsearch 检测到虚拟机遇到此类致命错误时,Elasticsearch 将尝试记录该错误,然后停止虚拟机。当 Elasticsearch 发起此类关闭时,它不会经历上述的有序关闭。Elasticsearch 进程还将返回一个指示错误性质的特殊状态码。
| 状态码 | 错误 |
|---|---|
| 1 | 未知的致命错误 |
| 78 | 引导检查失败 |
| 124 | 严重的 I/O 错误 |
| 125 | 未知的虚拟机错误 |
| 126 | 栈溢出错误 |
| 127 | 内存溢出错误 |
| 128 | JVM 内部错误 |
| 134 | 段错误 |
| 137 | 被内核 oom-killer 杀死 |
| 143 | 用户或内核 SIGTERM |
| 158 | 被 jvmkiller 代理杀死 |