先给出解决方案:利用docker创建多个Neo4j容器,并且为每个镜像都配置不同的端口映射。
———— ———— 以下正文 ———— ————
最近由于个人项目的原因,需要用到多个图数据库,并且希望多个图数据库之间相互独立,即:仅给指定人群访问部分数据库的权限。在尝试了多种方案之后,终于找到了适合我的需求的实现策略,这里仅记录一下本次踩坑的经历,日后技术进步之时再回来鞭笞自己。
最初思路:在同一个Neo4j下构建多个database
在当时的认知中,Neo4j每次是只能打开一个数据库的。按照这个思路,如果我们创建多个数据库,在使用的时候进行切换、并且给予多个用户不同的访问权限,这样就OK了。这个方案应当是技术人员能想到的最合理、简洁的做法,实现步骤也非常简单:
- 打开命令行界面(win10环境下最好用管理员权限打开cmd或者powershell);
- 关闭当前已启用的neo4j服务——
neo4j stop
; - 进入neo4j安装路径(例如我的就是
xxx/neo4j-community-4.2.5
); - 在
./data/database
下创建一个新的文件夹,名字就是你的新数据库的名字,该文件夹将作为数据库存储路径,如qin
; - 修改
neo4j-community-4.2.5/conf/neo4j.conf
配置文件中的dbms.default_database=neo4j
一行,将默认数据库名设置为第3步中创建的文件夹名(即qin
,保存修改; - 启动neo4j服务——
neo4j start
- 在浏览器中访问
http://localhost:7474
在访问时,发现我不仅可以访问qin数据库,还可以访问原先的名为neo4j的默认数据库。
“沿着之前的思路,再去寻找一下用户权限设置方式就好了”。我首先用Google+Baidu搜了一下技术博客,没发现有类似的技术文章;随后翻阅了Neo4j官方文档,结果也没发现相关的设置方式。
显然,事情并不OK,至少对处于目前认知水平的我是这样的。
由于我并不希望我的用户能够访问全部的数据库,因此在设置用户访问权限之前,我必须先考虑数据库的独立性问题,那么——我们构造多个不同的Neo4j实例就好啦!
解决方案 利用docker构建多个Neo4j实例
有了idea之后,为了效率最大化,自然要先搜索是否有可借鉴的成熟方案。通过Google+Baidu,发现有部分博客推荐大家在自己的服务器中安装不同版本的Neo4j,并分别启动、维护。Well…不得不说这一思路确实是对的,因为根据上面的经历来看同一个Neo4j只能启动一个实例,而在计算机中安装不同的安装版本自然也是启动不同的实例。但是这个方案有一个缺陷让我无法忽视——由于Neo4j版本是可枚举的,这样一来,能创建的数据库个数岂不是有限的吗?显然,这也不是一个长久之计。
就在这时,忽然看到了右下角的小图标
对呀!可以用docker呀!只需要拉取Neo4j镜像,然后创建不同的容器、并构建不同的端口映射,不就能实现创建多个Neo4j实例的方法了吗!
这里主要参考了打瞌睡的布偶猫的这篇博客,其中docker的安装、镜像的拉取在这篇博客以及各大技术论坛中已经有详细的描述了,在此我们还是专注于如何创造neo4j容器。
Step1 创建新的Neo4j database数据存储目录
假设我们想新建一个名为qin的独立neo4j数据库,并且希望把该数据库的项目以及数据存储到/home/ubuntu
中,则我们首先需要
- 定位到该目录下:
cd /home/ubuntu
- 新建名为qin的目录并定位到该目录下:
mkdir qin & cd qin
- 在该目录下创建data、logs、conf、import四个文件夹:
mkdir data logs conf import
至此,我们的待使用目录就准备好了。
在这里再补充一下,这四个目录的含义与作用分别为:
- data:存放数据
- logs:存放运行日志
- conf:存放数据库配置文件(neo4j.conf)
- import:存放用于导入Neo4j的数据的csv文件,通常应包含nodes.csv和rel.csv两个文件,分别存储了节点数据与关系数据。
这四个目录可以按照自己的实际需要选择创建,例如我习惯通过python来上传neo4j中的数据,所以就没有创建import
目录。
Step2 创建Neo4j容器
(创建容器前,请确认自己的计算机上已经拉取了自己所需版本的Neo4j的docker镜像。)
在创建容器时,我们会设置容器名、端口映射、目录挂载、使用的镜像。例如,neo4j的默认对外端口为7474,而我本机的7474已经被占用、所以我想用7475;bolt端口我也因为同样的理由而想设置为7688,那么我们就可以如下设置:
1 | docker run -d --name your_container_name \ |
然后使用浏览器访问http://localhost:7475
,填写好bolt的路径(即:http://you_ip:7688
)、刚刚填写的用户名和密码(your_username、your_password),即可正常访问。
注意:这里不要把bolt端口填写成7687,否则你访问的依然是宿主机上的Neo4j实例
补充:在容器中的Neo4j实例里创建数据库
上面的解决方案主要处理的是Neo4j的独立性问题,实际中我们还可能会想在同一个Neo4j实例中创建不同的数据库以便于数据管理,这里[Neo4j实例-数据库]的关系有点类似于MySQL中的[数据库-表格]的关系。
对于社区版的Neo4j来说,无法在browser界面下直接使用CREATE DATABASE xxx
命令来创建数据库(这是企业版才有的特性,氪金才是最强的~),因此需要采取一些不那么优雅的方式来创建数据库。
对于主机上的Neo4j实例,我们一般通过最初思路中涉及的数据库创建方式来新建数据库。而对于docker容器中的Neo4j实例,我们需要在挂载目录下进行操作,然后再重启容器。简单地说,就是在/home/ubunt/qin/data/database
目录下新建一个newdatabase
文件夹,并且将/home/ubuntu/qin/conf/neo4j.conf
中的dbms.default_database
字段修改为dbms.default_database=newdatabase
,最后执行docker restart your_container_name
即可。
Enjoy it~