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

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

背景

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服务启动失败之际要注意查看日志,辅助问题的排查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值