avatar

在服务器中启动多个Neo4j数据库

先给出解决方案:利用docker创建多个Neo4j容器,并且为每个镜像都配置不同的端口映射。

———— ———— 以下正文 ———— ————

最近由于个人项目的原因,需要用到多个图数据库,并且希望多个图数据库之间相互独立,即:仅给指定人群访问部分数据库的权限。在尝试了多种方案之后,终于找到了适合我的需求的实现策略,这里仅记录一下本次踩坑的经历,日后技术进步之时再回来鞭笞自己。

最初思路:在同一个Neo4j下构建多个database

在当时的认知中,Neo4j每次是只能打开一个数据库的。按照这个思路,如果我们创建多个数据库,在使用的时候进行切换、并且给予多个用户不同的访问权限,这样就OK了。这个方案应当是技术人员能想到的最合理、简洁的做法,实现步骤也非常简单:

  1. 打开命令行界面(win10环境下最好用管理员权限打开cmd或者powershell);
  2. 关闭当前已启用的neo4j服务——neo4j stop
  3. 进入neo4j安装路径(例如我的就是xxx/neo4j-community-4.2.5);
  4. ./data/database下创建一个新的文件夹,名字就是你的新数据库的名字,该文件夹将作为数据库存储路径,如qin
  5. 修改neo4j-community-4.2.5/conf/neo4j.conf配置文件中的dbms.default_database=neo4j一行,将默认数据库名设置为第3步中创建的文件夹名(即qin,保存修改;
  6. 启动neo4j服务——neo4j start
  7. 在浏览器中访问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中,则我们首先需要

  1. 定位到该目录下:cd /home/ubuntu
  2. 新建名为qin的目录并定位到该目录下:mkdir qin & cd qin
  3. 在该目录下创建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,那么我们就可以如下设置:

plaintext
1
2
3
4
5
6
7
8
9
docker run -d --name your_container_name \
-p 7475:7474 \ //将容器的端口号映射到宿主机的端口号, 意味着访问宿主机7475端口时即访问容器的7474端口
-p 7688:7687 \ //同上
-v /home/ubuntu/qin/data:/data \ // 挂载数据目录
-v /home/ubuntu/qin/logs:/logs \ // 挂载日志目录
-v /home/ubuntu/qin/conf:/conf \ // 挂载配置目录
-v /home/ubuntu/qin/import:/import \ //挂载数据导入目录
--env NEO4J_AUTH=your_username/your_password \ // 设定访问该数据库的用户名与密码
neo4j //指定使用的镜像

然后使用浏览器访问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~

Author: Qin Yue
Link: https://qinyuenlp.com/article/1376bee9b28b/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.

Comment