Elasticsearch,无法获取节点锁定,以下位置是可写的

时间:2015-03-08 21:35:06

标签: elasticsearch

Elasticsearch不会开始使用./bin/elasticsearch。 它引发了以下异常:

- ElasticsearchIllegalStateException[Failed to obtain node lock, is the following location writable?: [/home/user1/elasticsearch-1.4.4/data/elasticsearch]

我检查了同一位置的权限,该位置拥有777权限,并由user1拥有。

ls -al /home/user1/elasticsearch-1.4.4/data/elasticsearch
drwxrwxrwx  3 user1 wheel 4096 Mar  8 13:24 .
drwxrwxrwx  3 user1 wheel 4096 Mar  8 13:00 ..
drwxrwxrwx 52 user1 wheel 4096 Mar  8 13:51 nodes

有什么问题?

尝试在没有root访问权限的情况下在linux上运行elasticsearch 1.4.4。

16 个答案:

答案 0 :(得分:42)

我有一个与Elasticsearch相关的孤立java进程。杀死它解决了锁定问题。

ps aux | grep 'java'
kill -9 <PID>

答案 1 :(得分:26)

我收到了同样的错误消息,但事情安装得很好并且权限都已正确分配。

事实证明我有一个'孤儿'弹性搜索过程没有被正常停止命令杀死。

我不得不手动终止进程,然后重新启动elasticsearch再次工作。

答案 2 :(得分:14)

原因是另一个实例正在运行!
首先找到运行弹性的id。

ps aux | grep 'elastic'

然后使用kill -9 <PID_OF_RUNNING_ELASTIC>进行杀戮 删除node.lock文件有一些答案,但这没有用,因为正在运行的实例将再次创建它!

答案 3 :(得分:9)

在我的情况下,我在ES dir文件夹上拥有错误的权限。设置正确的所有者解决了它。

# change owner
chown -R elasticsearch:elasticsearch /data/elasticsearch/

# to validate
ls /data/elasticsearch/ -la
# prints    
# drwxr-xr-x 2 elasticsearch elasticsearch 4096 Apr 30 14:54 CLUSTER_NAME

答案 4 :(得分:3)

你已经在运行ES了。要证明这种类型:

curl&#39; localhost:9200 / _cat / indices?v&#39;

如果要在同一个框中运行另一个实例,可以将elasticsearch.yml中的node.max_local_storage_nodes设置为大于1的值。

答案 5 :(得分:3)

在将elasticsearch docker-image从5.6.x版本升级到6.3.y之后,由于上述错误,容器将不再启动

  

无法获取节点锁定

在我的情况下,错误的根本原因是缺少文件权限

elasticsearch使用的数据文件夹已从主机系统安装到容器中(在docker-compose.yml中声明):

    volumes:
      - /var/docker_folders/common/experimental-upgrade:/usr/share/elasticsearch/data

elasticsearch无法再访问此文件夹,原因我根本不了解。在我对此文件夹设置了非常允许的文件权限以及所有子文件夹后,容器确实重新启动了

我不想重现该命令来在已安装的docker文件夹上设置那些非常宽松的访问权限,因为这很可能是一种非常糟糕的做法,并且会带来安全问题。我只想分享一个事实,那就是它可能不是第二次运行Elasticsearch,而是实际上只是缺少对已安装文件夹的访问权限。

也许有人可以详细说明在docker-container中设置挂载文件夹的适当权利?

答案 6 :(得分:2)

尝试以下方法: 1.找到端口9200,例如:lsof -i:9200    这将显示哪些进程使用端口9200。 杀死pid,例如对kill -9 pid的输出在步骤1中显示的每个PID重复lsof 3.重启elasticsearch,例如elasticsearch

答案 7 :(得分:2)

我在同一台计算机上运行了另一个ElasticSearch。

要检查的命令: netstat -nlp | grep 9200 (9200-弹性端口) 结果:tcp 0 0 ::: 9210 ::: * LISTEN 27462 / java

通过以下方式终止该过程: 杀死-9 27462 27462-ElasticSearch实例的PID

开始弹性搜索,它可能现在开始运行。

答案 8 :(得分:1)

就我而言,/var/lib/elasticsearch 是缺少权限的目录 (CentOS 8):

<块引用>

错误:java.io.IOException:无法获得 /var/lib/elasticsearch/nodes/0 的锁

要修复它,请使用:

chown -R elasticsearch:elasticsearch /var/lib/elasticsearch

答案 9 :(得分:0)

就我而言,这个错误是由于未使用&#34; sudo mount&#34;安装用于配置数据目录的设备引起的。

答案 10 :(得分:0)

要添加到上述答案中,可能还会出现其他一些情况,您可能会遇到错误。事实上,我已经将Elasticsearch从5.5更新到6.3,我一直在使用docker compose设置以及命名卷数据目录。我必须执行docker volume prune来删除陈旧的目录。这样做之后,我不再面对这个问题。

答案 11 :(得分:0)

对我来说,错误是一个简单的错误:我创建了一个新的数据目录/ mnt / elkdata并将所有权更改为弹性用户。然后,我复制了文件,然后忘记再次更改所有权。

这样做之后,重新启动了弹性节点。

答案 12 :(得分:0)

与这里的许多其他答复一样,这是由于目录权限错误(不是Elasticsearch用户所有)引起的。在我们的案例中,这是由卸载Elasticsearch并重新安装(通过yum,使用官方存储库)引起的。

目前,存储库在卸载时不会删除nodes目录,但是会删除拥有它的elasticsearch用户/组。因此,当重新安装Elasticsearch时,将创建一个新的不同的elasticsearch用户/组,而旧的nodes目录仍然存在,但由旧的UID / GID拥有。然后这会发生冲突并导致错误。

@oleksii提到的递归chown是解决方案。

答案 13 :(得分:0)

chown -R elasticsearch:elasticsearch / var / lib / elasticsearch

它直接表明它无权获取锁。因此需要授予权限。

答案 14 :(得分:0)

检查这些选项

sudo chown 1000:1000 <directory you wish to mount>
# With docker
sudo chown 1000:1000 /data/elasticsearch/ 
OR
# With VM
sudo chown elasticsearch:elasticsearch /data/elasticsearch/

答案 15 :(得分:0)

如果有人看到这是由以下原因引起的:

Caused by: java.lang.IllegalStateException: failed to obtain node locks, tried [[/docker/es]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?

解决方案是在您的 elasticsearch.yml 中设置 max_local_storage_nodes

node.max_local_storage_nodes: 2

The docs 说在您的开发机器上将此设置为大于 1 的数字

<块引用>

默认情况下,Elasticsearch 配置为防止多个节点共享同一数据路径。要允许多个节点(例如,在您的开发机器上),请使用设置 node.max_local_storage_nodes 并将其设置为大于 1 的正整数。

我认为 Elasticsearch 需要有第二个可用节点才能启动新实例。每当我尝试在 Docker 容器内重新启动 Elasticsearch 时,就会发生这种情况。如果我重新启动我的容器,那么 Elasticsearch 将在没有此设置的情况下第一次正常启动。