elasticsearch Elasticsearch无法获取节点锁,以下位置是否可写
Elasticsearch不会开始使用
elasticsearch Elasticsearch无法获取节点锁,以下位置是否可写,
elasticsearch,
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/
/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
有什么问题
正在尝试在linux上运行elasticsearch 1.4.4,但没有根访问权限 在我的情况下,我对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
在我的例子中,此错误是由于没有使用“sudo mount”装载用于配置数据目录的设备造成的。我收到了相同的错误消息,但装载情况良好,权限分配正确 原来我有一个“孤立”的elasticsearch进程,它没有被正常的stop命令终止
我不得不手动终止该进程,然后重新启动elasticsearch。我有一个与elasticsearch相关的孤立Java进程。杀死它解决了锁的问题
ps aux | grep 'java'
kill -9 <PID>
ps aux | grep'java'
杀死-9
您已经在运行ES。要证明这一类型:
curl'localhost:9200/_cat/index?v'
如果要在同一个框中运行另一个实例,可以将elasticsearch.yml中的node.max\u local\u storage\u nodes设置为大于1的值。原因是另一个实例正在运行
首先找到running elastic的id
ps aux | grep 'elastic'
然后使用kill-9
有一些关于删除node.lock文件的答案,但这没有帮助,因为正在运行的实例将再次删除node.lock文件 尝试以下操作: 1.查找端口9200,例如:
lsof-i:9200
这将显示哪些进程使用端口9200。
2.关闭pid,例如,对步骤1中显示的lsof
输出的每个pid重复kill-9 pid
3.重新启动elasticsearch,例如,
elasticsearch
我在同一台机器上运行了另一个elasticsearch
要检查的命令:netstat-nlp | grep9200(9200-弹性端口)
结果:tcp 0 0:::9210:::*侦听27462/java
通过,
杀死-927462
27462-ElasticSearch实例的PID
启动elastic search,它现在可能会运行。要添加到上述答案,可能还有其他一些情况下会出现错误。事实上,我已经将elasticsearch从5.5更新到了6.3。我一直在使用docker compose设置,为数据目录命名卷。我必须执行
docker卷修剪
,以删除陈旧的。这样做之后,我就不再面临这个问题。在我将elasticsearch docker映像从5.6.x版升级到6.3.y版之后,由于上述错误,容器将不再启动
无法获取节点锁
在我的例子中,错误的根本原因是缺少文件权限
elasticsearch使用的数据文件夹已从主机系统装入容器(在docker compose.yml中声明):
由于我完全不理解的原因,elasticsearch无法再访问此文件夹。在我对该文件夹和所有子文件夹设置了非常许可的文件权限后,容器再次启动
我不想复制命令来设置挂载docker文件夹上的那些非常允许的访问权限,因为这很可能是一个非常糟糕的做法和安全问题。我只是想告诉大家,这可能不是elasticsearch运行的第二个过程,但实际上只是缺少对已装入文件夹的访问权限
也许有人可以详细说明为docker容器中已装入的文件夹设置的适当权限?对我来说,错误很简单:我创建了一个新的数据目录/mnt/elkdata,并将所有权更改为elastic用户。然后我复制了文件,后来又忘了更改所有权
执行此操作并重新启动elastic节点后,它开始工作。与其他许多人一样,这是由于目录上的权限错误(不属于elasticsearch用户)造成的。在我们的例子中,这是由于卸载Elasticsearch并重新安装它(通过yum,使用官方存储库)造成的 此时,repo在卸载
节点时不会删除目录,但会删除拥有它的elasticsearch
用户/组。因此,当重新安装Elasticsearch时,将创建一个新的、不同的Elasticsearch
用户/组,使旧的节点
目录仍然存在,但属于旧UID/GID。这会产生冲突并导致错误
@oleksii提到的递归chown就是解决方案。chown-R elasticsearch:elasticsearch/var/lib/elasticsearch
它直接表明它没有获得锁的权限。因此需要授予权限。检查这些选项
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/
sudo chown 1000:1000
#和码头工人
sudo chown 1000:1000/数据/弹性搜索/
或
#用虚拟机
sudo chown elasticsearch:elasticsearch/data/elasticsearch/
在我的例子中,/var/lib/elasticsearch
是缺少权限的目录(CentOS 8):
错误:java.io.IOException:无法获取/var/lib/elasticsearch/nodes/0上的锁
要修复它,请使用:
chown-R elasticsearch:elasticsearch/var/lib/elasticsearch
如果有人认为这是由以下原因引起的:
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\u local\u storage\u节点
node.max_local_storage_nodes: 2
在您的开发机器上,将其设置为大于1的数字
默认情况下,Elasticsearch配置为防止多个节点共享同一数据路径。要允许多个节点(例如,在开发机器上),请使用设置node.max_local_storage_nodes并将其设置为大于1的正整数
我认为那很有弹性
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])?
node.max_local_storage_nodes: 2