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