背景
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服務啓動失敗之際要注意查看日誌,輔助問題的排查