多个neo4j服务共用同一个data目录

本文探讨了在Docker环境下同时运行多个Neo4j实例时遇到的问题,包括数据目录冲突、权限错误及解决方案。介绍了如何通过修改文件夹归属和创建独立数据目录来解决共用data目录的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

neo4j的data目录不能被多个启动服务读写。更具体来讲,data目录下仅能对一个neo4j服务提供磁盘数据。在data/databases有一个名为store_lock的文件,就是数据库的锁文件,防止数据的错乱。具体实例如下:目录/data/dev_tool/neo4j-community-3.4.6已经被名为neo4j_ownthink的容器映射,此时试图再创建一个也映射到该目录且名为neo4j_pkubase容器是能够成功的。如果neo4j_ownthink容器已经启动服务,此时想要启动neo4j_pkubase容器会失败。neo4j_ownthink容器的创建如下:

docker run --name=neo4j_ownthink  -it -p 7473:7473 -p 7474:7474 -p 7687:7687 -v $NEO4J_HOME/conf:/conf -v $NEO4J_HOME/data:/data -v $NEO4J_HOME/certificates:/certificates -v $NEO4J_HOME/import:/import -d neo4j

可以看出$NEO4J_HOME/data目录已经被映射。

分析

(1)查看neo4j已经启动的服务:
在这里插入图片描述

(2)创建neo4j_pkubase容器:

docker run --name=neo4j_pkubase  -it -p 7483:7483 -p 7484:7484 -p 7688:7688 -v $NEO4J_HOME/conf_pkubase:/conf -v $NEO4J_HOME/data:/data -v $NEO4J_HOME/certificates:/certificates -d neo4j

(3)查看已经创建的neo4j容器:
在这里插入图片描述

(4)尝试启动neo4j_pkubase容器:
docker container start neo4j_pkubase
查看neo4j已经启动的服务:
在这里插入图片描述
可以看出,其实neo4j_pkubase容器并未启动成功。

如果此时将neo4j_ownthink服务停止,再尝试启动neo4j_pkubase容器:
在这里插入图片描述
可以看出,此时确实能够启动neo4j_pkubase容器,但是服务很快就挂掉了。。。所以,docker container ls看到的其实是服务在启动,而非已经启动。

(5)查看日志:
docker logs -f -t --tail 10 neo4j_pkubase
日志结果如下:

2019-12-06T01:54:00.453721082Z 2019-12-06 01:54:00.452+0000 ERROR Failed to start Neo4j: Starting Neo4j failed: Component 'org.neo4j.server.database.LifecycleManagingDatabase@64a8c844' was successfully initialized, but failed to start. Please see the attached cause exception "/data/databases/pkubase.db/neostore (Permission denied)". Starting Neo4j failed: Component 'org.neo4j.server.database.LifecycleManagingDatabase@64a8c844' was successfully initialized, but failed to start. Please see the attached cause exception "/data/databases/pkubase.db/neostore (Permission denied)".
2019-12-06T01:54:00.453776176Z org.neo4j.server.ServerStartupException: Starting Neo4j failed: Component 'org.neo4j.server.database.LifecycleManagingDatabase@64a8c844' was successfully initialized, but failed to start. Please see the attached cause exception "/data/databases/pkubase.db/neostore (Permission denied)".

从日志上看似乎是文件权限的原因。
在这里插入图片描述

解决方案1:

修改文件夹归属

明确了问题所在,那么解决方案就很简单了,只需要修改下所属的用户和组别即可:
chown -R 101:101 pkubase.db
在这里插入图片描述

再次启动服务:
在这里插入图片描述
并在浏览器上访问7484端口,确实启动了服务。

是否能够同时启动共用data目录的多个服务

在上述配置共用data目录的前提下,我们尝试依次启动:
docker container start neo4j_ownthink
docker container start neo4j_pkubase
发现服务其实可以启动,只是在尝试访问数据的时候报错:
在这里插入图片描述

解决方案2:

另一种懒惰的办法是,直接启动一个新的目录。
数据准备:
最终模仿data目录新建data_pkubase目录存放pkubase.db(直接拷贝或者mv过去即可)。另外,为了复用账号和密码,将dbms/auth一并拷贝过去。

创建容器:

docker run --name=neo4j_pkubase  -it -p 7483:7483 -p 7484:7484 -p 7688:7688 -v /data/dev_tool/neo4j-community-3.4.6/conf_pkubase:/conf -v /data/dev_tool/neo4j-community-3.4.6/data_pkubase:/data -d neo4j

此时就可以正常访问数据库了。

总结

综上可以得出:
(1)多个neo4j可以共用data目录,此时多个服务可以启动,除首个服务外其他服务仅对数据有读操作,也无法通过浏览器访问数据库。
(2)多个neo4j服务可以共用data目录。由于数据库锁data/databases/store_lock的存在,要注意保持只有一个neo4j服务在访问该目录。
(3)在neo4j服务启动失败之际要注意查看日志,辅助问题的排查

你可以使用 Docker 来安装和部署多个 Neo4j 容器。下面是一个简单的步骤: 1. 确保你已经安装了 Docker。你可以在 Docker 官方网站上找到适合你操作系统的安装包,并按照说明进行安装。 2. 创建一个用于存储 Neo4j 数据的目录。在命令行中执行以下命令: ``` mkdir neo4j-data ``` 3. 创建一个自定义的 Docker 网络,以便容器之间可以相互通信。在命令行中执行以下命令: ``` docker network create neo4j-network ``` 4. 使用 Docker 运行多个 Neo4j 容器。执行以下命令创建第一个容器: ``` docker run -d --name neo4j1 --network neo4j-network -p 7474:7474 -p 7687:7687 -v $PWD/neo4j-data:/data -e NEO4J_AUTH=neo4j/password neo4j:latest ``` 这将创建一个名为 `neo4j1` 的容器,并将它与 `neo4j-network` 网络连接。容器的 7474 和 7687 端口将映射到主机上,你可以使用这些端口访问 Neo4j 的 Web 界面和 Bolt 协议。 5. 创建更多的容器,可以使用类似的命令,只是需要调整容器名称和端口映射。例如: ``` docker run -d --name neo4j2 --network neo4j-network -p 7475:7474 -p 7688:7687 -v $PWD/neo4j-data:/data -e NEO4J_AUTH=neo4j/password neo4j:latest ``` 这将创建一个名为 `neo4j2` 的容器,并将它与 `neo4j-network` 网络连接。容器的 7475 和 7688 端口将映射到主机上。 你可以根据需要创建更多的容器,并根据你的需求进行配置。确保每个容器的名称、端口映射和数据目录都不冲突。 希望这些步骤对你有所帮助!如果你有任何其他问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值