Elasticsearch:elasticsearch.service 的作业失败

Pro*_*ton 28 elasticsearch

我目前正在尝试为一个项目设置Elasticsearch。我已经安装Elasticsearch 7.4.1并且还安装了Java,即openjdk 11.0.4.

但是当我尝试使用命令启动Elasticsearch 时

sudo systemctl start elasticsearch
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

elasticsearch.service 的作业失败,因为控制进程退出并显示错误代码。

有关详细信息,请参阅“systemctl status elasticsearch.service”和“journalctl -xe”。

当我尝试运行命令时

systemctl status elasticsearch.service
Run Code Online (Sandbox Code Playgroud)

我收到错误消息

? elasticsearch.service - 弹性搜索

已加载:已加载(/usr/lib/systemd/system/elasticsearch.service; 已禁用; 出售

活动:自 UTC 时间周五 2019-11-01 06:09:54 起失败(结果:退出代码);12 秒前

Docs: http://www.elastic.co
Run Code Online (Sandbox Code Playgroud)

进程:5960 ExecStart=/usr/share/elasticsearch/bin/elasticsearch -p ${PID_DI

主PID:5960(代码=退出,状态=1/FAILURE)

我已经从我的机器上删除/清除了Elasticsearch并重新安装了几次,但它似乎没有解决问题。

我试图修改默认network.host,并host.port设置在/etc/default/elasticsearchnetwork.host: 0.0.0.0http.port: 9200解决这个问题,但还没有运气。

我需要一些帮助。提前致谢。

Pro*_*ton 78

这是我解决的方法

首先,/etc/elasticsearch/elasticsearch.yml使用以下命令在您的 nano 编辑器中打开:

sudo nano /etc/elasticsearch/elasticsearch.yml
Run Code Online (Sandbox Code Playgroud)

您的网络设置应该是:

# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 127.0.0.1
#
# Set a custom port for HTTP:
#
http.port: 9200
Run Code Online (Sandbox Code Playgroud)

为了让Elasticsearch允许来自 localhost 的连接,并监听端口9200

接下来,运行下面的代码来确定错误的原因:

journalctl -xe
Run Code Online (Sandbox Code Playgroud)

错误 1

Java 运行时环境的内存不足,无法继续

解决方案

作为 JVM 应用程序,Elasticsearch主服务器进程仅使用专用于 JVM 的内存。所需的内存可能取决于所使用的 JVM(32 位或 64 位)。JVM 使用的内存通常包括:

  • 堆空间(通过-Xms和配置-Xmx
  • 元空间(受可用本机内存量的限制)
  • 内部 JVM(通常为数十 Mb)
  • 依赖于操作系统的内存功能,如内存映射文件

Elasticsearch 主要依赖于堆内存,并且通过将-Xmsand -Xmx(堆空间)选项传递给运行Elasticsearch服务器的 JVM 来手动设置。

解决方案

/etc/elasticsearch/jvm.options使用以下命令在您的 nano 编辑器中打开:

sudo nano /etc/elasticsearch/jvm.options
Run Code Online (Sandbox Code Playgroud)

首先,取消注释的价值XmxXms

接下来,修改的价值-Xms-Xmx你的物理内存不超过50%。这些设置的值取决于服务器上可用的 RAM 量,Elasticsearch 需要内存用于 JVM 堆以外的用途,为此留出空间很重要。

最低要求:如果您的物理 RAM <= 1 GB

然后,您的设置应该是:

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms128m
-Xmx128m
Run Code Online (Sandbox Code Playgroud)

或者

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms256m
-Xmx256m
Run Code Online (Sandbox Code Playgroud)

中等要求:如果您的物理 RAM >= 2 GB<= 4 GB

然后,您的设置应该是:

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms512m
-Xmx512m
Run Code Online (Sandbox Code Playgroud)

或者

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms750m
-Xmx750m
Run Code Online (Sandbox Code Playgroud)

大要求:如果您的物理 RAM >= 4 GB<= 8 GB

然后,您的设置应该是:

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms1024m
-Xmx1024m
Run Code Online (Sandbox Code Playgroud)

或者

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms2048m
-Xmx2048m
Run Code Online (Sandbox Code Playgroud)

注意:如果您的物理 RAM >= 8 GB,您可以决定要分配多少堆空间给 Elasticsearch。您可以分配-Xms2048m-Xmx2048mOR-Xms4g-Xmx4g或根据可用资源,获得更好的性能甚至更高。

错误 2

初始堆大小不等于最大堆大小

解决方案

确保的值-XmsXmx是相等的。也就是说,您使用的是最低要求,因为您的物理 RAM <= 1 GB,而不是这样:

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms128m
-Xmx256m
Run Code Online (Sandbox Code Playgroud)

应该是这样的:

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms128m
-Xmx128m
Run Code Online (Sandbox Code Playgroud)

或这个:

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms256m
-Xmx256m
Run Code Online (Sandbox Code Playgroud)

错误 3

默认发现设置不适合生产使用;必须至少配置 [discovery.seed_hosts、discovery.seed_providers、cluster.initial_master_nodes] 之一

解决方案

/etc/elasticsearch/elasticsearch.yml使用以下命令在您的 nano 编辑器中打开:

sudo nano /etc/elasticsearch/elasticsearch.yml
Run Code Online (Sandbox Code Playgroud)

您的发现设置应该是:

# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
discovery.seed_hosts: []
Run Code Online (Sandbox Code Playgroud)

修复所有错误后,运行以下命令以启动并确认Elasticsearch的状态:

sudo systemctl start elasticsearch
sudo systemctl status elasticsearch
Run Code Online (Sandbox Code Playgroud)

就这样。

我希望这有帮助

  • 如果你像我一样使用 5 美元的数字海洋(RAM:1go)droplet,建议设置`-Xms512mo`和`-Xmx512mo`。 (2认同)
  • 这大约是你 RAM 的 50% @JulienLeCoupanec,我认为这是不可取的。我建议你应该考虑-Xmx128m。 (2认同)

ash*_*rla 14

此问题的基本解决方案是卸载 Elasticsearch 和 Kibana,然后重新安装它们,您的问题就会得到解决。

卸载 Elasticsearch:

sudo apt-get remove --purge elasticsearch
Run Code Online (Sandbox Code Playgroud)

消息是:

dpkg:警告:删除elasticsearch时,目录“/var/lib/elasticsearch”不为空,因此未删除
dpkg:警告:删除elasticsearch时,目录“/etc/elasticsearch”不为空,因此未删除

也删除了这些目录:

sudo rm -rf /etc/elasticsearch
sudo rm -rf /var/lib/elasticsearch
Run Code Online (Sandbox Code Playgroud)

然后再次安装:

sudo apt-get install elasticsearch=7.10.1
sudo systemctl start elasticsearch
curl http://localhost:9200/
Run Code Online (Sandbox Code Playgroud)

卸载 Kibana:

sudo apt-get remove --purge kibana
Run Code Online (Sandbox Code Playgroud)

也删除了这些目录:

sudo rm -rf /etc/kibana
sudo rm -rf /var/lib/kibana
Run Code Online (Sandbox Code Playgroud)

然后再次安装:

sudo apt-get install kibana=7.10.1
sudo systemctl start kibana
Run Code Online (Sandbox Code Playgroud)

在浏览器上打开 Kibana:

http://localhost:5601
Run Code Online (Sandbox Code Playgroud)

  • 很高兴知道 :) (3认同)

And*_*eda 8

如果您使用包管理安装,请检查目录的所有者是否/etc/elasticsearch为elasticsearch。

sudo chown -R elasticsearch:elasticsearch /etc/elasticsearch/
Run Code Online (Sandbox Code Playgroud)


Vol*_*ied 6

小型虚拟机也有同样的问题。上面的配置已经设置好了。唯一有帮助的是增加启动超时。标准的 systemd 超时是不够的。

作为预防措施,我将超时设置为 5 分钟,如下所示。

sudo nano /usr/lib/systemd/system/elasticsearch.service
Run Code Online (Sandbox Code Playgroud)

在 elasticsearch.service 文件的 [Service] 部分下添加。

TimeoutStartSec=300
Run Code Online (Sandbox Code Playgroud)

激活对服务的更改。

sudo /bin/systemctl enable elasticsearch.service
Run Code Online (Sandbox Code Playgroud)

再次启动服务。

service elasticsearch start
Run Code Online (Sandbox Code Playgroud)