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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章