Neo4j系列博客-数据库管理

部署

部署主要包括:容量规划、单实例或集群安装及安装后的相关处理。

系统需求

运行一个 Neo4j 数据库实例所需的系统需求清单:

  • CPU:通常性能受限于内存容量和磁盘 I/O 容量。推荐配置:Intel Core i7, IBM POWER8
  • 内存:图越大则所需内存越多。推荐配置:16~32GB 或更多。
  • 磁盘:磁盘性能是最重要的指标。推荐配置:SSD w/ SATA
  • 文件系统:由于普通 Linux / UNIX 系统中存在的缓冲区高速缓存或页面高速缓存,大多数磁盘都是经过缓存进行的。因此当系统发生故障时,这种延迟可能会造成文件更新内容的丢失。推荐配置:ext4 / ZFS
  • 软件:Neo4j 需要一个 Java 虚拟机,因此 Neo4j 中都会提前预装 JVM

文件位置

默认情况下 Neo4j 安装后的重要文件及目录如下:(此处为 Linux / UNIX 发行版本的文件目录)

  • Configuration<neo4j-home>/conf/neo4j.conf
  • Data<neo4j-home>/data
  • Logs<neo4j-home>/logs
  • Metrics<neo4j-home>/metrics
  • Import<neo4j-home>/import
  • Bin<neo4j-home>/bin
  • Lib<neo4j-home>/lib
  • Plugins<neo4j-home>/plugins

Log 文件位置:

  • neo4j.log: 标准日志。
  • debug.log: 调试 Neo4j 的日志。
  • http.logHTTP API 的请求日志。
  • gc.logJVM 提供的垃圾收集日志。
  • query.log: 记录超过设定查询时间阈值的查询日志(仅限企业版)。
  • security.log: 数据库安全事件日志(仅限企业版)。
  • service-error.log: 安装或运行 Windows 服务时遇到的错误日志(仅限 Windows)。

可以使用 dbms.directions.* 配置对数据库部分路径进行修改,<neo4j-home>, bin, conf, certificates 的位置可以使用环境变量进行配置。

Neo4j 数据库运行的用户必须对相应的文件夹和文件具有以下权限:

  • 只读权限: conf, import, bin, lib, plugins
  • 读写权限: data, logs, metrcis
  • 执行权限: bin 目录中的所有文件。

端口

Neo4j 使用到的主要端口:

  • 6362: 备份端口。默认情况下禁用备份功能。
  • 7474: HTTP 服务端口。建议生产环境下不打开此端口,因为未加密。
  • 7473: 由 REST API 使用。
  • 7687: 由 Cypher-ShellNeo4j 浏览器使用。
  • 5000, 6000, 7000: 因果集群端口。列出的端口是配置文件中的默认端口,端口在实际使用中可能不同,须做相应的修改。
  • 5001, 6001: 高性能集群端口。列出的端口是配置文件中的默认端口,端口在实际使用中可能不同,须做相应的修改。
  • 2003: Graphite 监控端口。Neo4j 数据库与 Graphite 服务器通信的端口。
  • 3637: JMX 监控端口。不推荐采用这种检查数据库的方式,默认情况下不启用。
  • 1337: Neo4j-shell 工具使用的端口,现已被弃用。

初始密码

使用 neo4j-adminset-inital-password 命令设定当前用户的 neo4j 数据库密码,此操作必须在首次启动数据库之前执行。
语法为:neo4j-admin set-inital-password <password>
如果未使用此方法显式设置密码,Neo4j 数据库将其设置为默认密码 neo4j,该密码可在首次登录时依据提示来更改此默认密码。

数据收集器

Neo4j 使用数据收集器(UDC)收集使用数据的信息,并提供给官方的 UDC 服务器(网址为: udc.neo4j.com),该数据收集器可以禁用,并且不收集任何机密信息。
Neo4j 数据库默认开启 UDC 程序,并伴随数据库启动而自动运行,UDC 将在数据库正常运行的 10 分钟后才发送第一个 ping 命令,这样做有两个考虑:首先不希望启动 UDC 而使数据库变慢,其次希望将自动 ping 测试保持最少。

配置 Neo4j 连接器

应用程序与 Neo4j 数据库之间通信需要有相应的机制作为保障,从而 Neo4j 连接器应用而生,支持 Bolt 二进制协议或者 HTTP/HTTPS 方式,极大的方便了应用程序的开发。
默认情况下可配置三种不同的 Neo4j 连接器:Bolt 连接器、HTTP 连接器和 HTTPS 连接器。

每种 Neo4j 连接器均有三个参数:

  • enabled: 启用或禁用连接器。
  • listen_address: 设定指定 Neo4j 如何监听传入链接,它由两部分组成:网络 IP 地址和端口号,并以格式 “网络 IP 地址 : 端口号” 表示。
  • advertised_address: 设定指定客户端使用该连接器的地址。
  • dbms.connectors.default_listen_address: 所有连接器的 listen_address 的默认网络接口地址。
  • dbms.connectors.default_advertised_address: 所有连接器的 advertised_address 的默认网络接口地址。

证书

默认情况下,Neo4j 数据库在与官方驱动配套程序使用时,将采用 TLS 协议加密苏哦有客户服务器通信,包括 BoltHTTP 协议,这能确保应用程序与数据库之间的安全可靠通信。
如果需要使用自己的 SSL 证书,则需要这两个文件分别命名为 neo4j.keyneo4j.cert。其中密钥文件 neo4j.key 是不加密的,需要正确设置该文件的权限,以便只有 Neo4j 用户能够读取它。先将此文件放入指定的目录中,默认在 <neo4j-home>/certificates 目录下,也可通过在 neo4j.conf 中设置 dbms.connectories.certificates 来指定证书文件的存放路径,默认为 certificates(相对路径)。


监控

Neo4j 数据库提供了一个简单直观的 Web 监控界面,通过浏览器方式访问 Neo4j 数据库。主要包含:磁盘利用情况、缓存活跃情况和集群情况。
集群情况中包含了众多的界面参数:

  • Store Sizes: 存储容量。
  • ID AllocationID 分配。
  • Page Cache: 页面缓存。
  • Transactions: 事务。

指标

指标的功能仅企业版支持。
Neo4j 可以配置为以下两种不同的方式来呈现指标:

  • 将指标导出为 CSV 文件。
  • Graphite 或基于 Graphite 协议的任何监控工具发送指标。
  1. 启用指标记录

    1
    2
    3
    4
    5
    metrics.neo4j.enabled=true
    metrics.neo4j.tx.enabled=true
    metrics.neo4j.pagecache.enabled=true
    metrics.neo4j.counts.enabled=true
    metrics.neo4j.network.enabled=true
  2. Graphite
    将以下设置添加到 neo4j.conf 配置文件中,以开启与 Graphite 的集成,从而启动 Neo4j 连接到 Graphite 来监控 Neo4j 的各项指标。

    1
    2
    3
    4
    metrics.graphite.enabled=true
    metrics.graphite.server=localhost:2003
    metrics.graphite.interval=3m
    metrics.prefix=Neo4j_1
  3. CSV 文件
    将以下设置添加到 neo4j.conf 配置文件中,以便将各项指标导出到本地 CSV 文件中。

    1
    2
    3
    4
    metrics.csv.enabled=true
    # default is a metrics directory under neo4j-home
    # metrics.csv.path='/local/fiel/system/path'
    metrics.csv.interval=3m
  4. 可用通用指标
    建议查书或者官方网站。

日志

Neo4j 日志分为安全日志和查询日志两种,用于记录数据库的查询和发生的安全事件。

查询日志
  • dbms.logs.query.enabled=fasle: 是否记录数据库所执行的查询。
  • dbms.logs.query.paramter_logging_enabled=true: 是否设定查询耗时超过配置阈值。
  • dbms.logs.query.threshold=0: 用于设定记录查询的阈值,即如果查询执行所花费的时间大于此阈值,则记录此查询(前提是启用查询日志记录)。
  • query.log: 设置查询日志的文件名,存储在 Logs 目录中,当然也可以在 neo4j.conf 配置文件中配置查询日志的轮换。
  • dbms.logs.query.ratation.keep_number=7: 设置保存历是查询日志文件的数量。
  • dbms.logs.query.ratation.size=20MB: 查询日志自动轮换的文件大小。
安全事件日志

Neo4j 数据库安全事件日志功能用于记录所有的安全事件,对于本机用户管理,将记录以下操作:

  • 登陆尝试,每个默认值都记录成功和不成功的登录。
  • 更改用户的密码、管理员和用户。
  • 创建和删除用户,包括失败的尝试。
  • 创建和删除自定义角色,包括失败的尝试。
  • 为用户分配和删除角色,包括失败的尝试。
  • 暂停和激活用户。
  • 非管理员用户尝试列出用户和角色的失败尝试。

如果使用 LDAP 作为身份验证方法,还会记录一些 LDAP 配置错误的情况,以及 LDAP 服务器通信事件和故障。

安全事件日志文件名为 security.log,存放在 Logs 目录中,可以在 neo4j.conf 配置文件中配置安全事件日志的轮换。

  • dbms.logs.security.rotation.size=20MB: 安全事件日志自动轮换的文件大小。
  • dbms.logs.security.rotation.delay=300s: 设置在最后一次日志轮换发生后,日志可能再次轮换之前的最小时间间隔。
  • dbms.logs.security.rotation.keep_number=7: 设置保存安全事件日志的文件数量。

查询管理

Neo4j 提供了相应的手段可从安全性或性能角度对查询语句进行检查。查询日志可用于数据库的连续监控和故障排除,事务超时功能可以为查询设定最大的运行时间,查询管理则可查看数据库中运行的查询,必要时可以终止某个查询。

事务超时

执行保护功能可以终止某执行时间超过配置超时时间的事务。
dbms.transaction.timeout=10s 表示设定事务超时时间为 10s,而当设定值为 0s 时,则为禁用执行保护。

此功能对使用自定义超时(通过 Java API)指定的事务不产生影响。

查询管理

此功能仅在企业版中支持。

  1. 列出所有的查询
    管理员可以查询到当前运行中的所有查询,而当前用户仅可以查看到自己当前运行的所有查询。
    语法为: CALL dbms.listQueries();

  2. 终止多个查询
    管理员可以终止给定查询 ID 列表的事务,而当前用户仅可以终止自己创建的事务。
    语法为: CALL dbms.killQueries(ids);,其中 idsList<String> 类型,是需要终止的事务 ID 的列表。

  3. 终止一个查询
    管理员可以终止给定查询 ID 列表的任意一个事务,而当前用户仅可以终止自己创建的一个事务。
    语法为: CALL dbms,killQuery(id);,类型为 String 类型,是需要终止的事务 ID

因果集群监控

  1. 查询因果集群核心服务器
    可以在因果集群的每个实例上调用过程 dbms.cluster.role() 以返回该实例的角色。
    语法为: CALL dbms.cluster.role(),返回值为 LEADER, FOLLOWER, READ_REPLICA 三个中的一个,类型为 String 类型。

  2. 获取因果集群的整体概况
    函数 dbms.cluster.overview() 返回集群中所有实例的详细信息,以便获取集群的拓扑概述。
    语法为: CALL dbms.cluster.overview()

  3. 获取路由推荐
    应用程序需要知道哪个实例可以提供所需的服务。
    语法为: CALL dbms.cluster.routing.getServers(),该过程返回特定服务与提供此服务的实例的地址之间的映射,还返回生存时间(TTL)信息。


安全管理

对于 Neo4j 数据库而言,首要的就是数据安全,可通过遵循有关服务器和网络安全性的行业做法确保物理数据安全,再通过适当的身份验证和授权规则来确保 Neo4j 的信息安全。

社区版用户管理

Neo4j 社区版在安全管理方面相比企业版而言,功能较弱,仅提供用户和密码管理,没有涉及角色、权限控制等企业必需的安全管理功能。本地用户和角色管理通过使用内置的 Cypher 过程进行管理。

  1. dbms.security.listUsers
    当前用户查看系统中所有用户的详细信息。
    语法为:CALL dbms.security.listUsers();,返回值为:usernameflags

  2. dbms.security.changePassword
    当前用户更改自己的密码。
    语法为:CALL dbms.security.changePassword(password);,其中参数为当前用户的新密码。

  3. dbms.security.showCurrentUser
    显示当前用户详情,并显示是否需要更改密码。
    语法为:CALL dbms.security.showCurrentUser();,返回值为 usernamefalgs

  4. dbms.security.createUser
    将用户添加到 Neo4j 社区版系统。
    语法为:CALL dbms.scurity.createUser(usernaem, password, requirePasswordChange);,其中 usernamepassword 为新添加用户的用户名和密码,requirePasswordChange 表示是否需要修改密码。

  5. dbms.security.deleteUser
    从系统中永久删除用户。
    语法为:CALL dbms,security.deleteUser();,其中 username 为待删除的用户名。

LDAP 集成

LDAP 协议以 X.500 标准为基础,但与 X.500 相比 LDAP 更简单,它可根据需要定制,并支持 TCP/IP 协议,因此使用非常广泛。
Neo4j 本身支持 LDAP 协议,包括:Active DirectoryOpenLDAP 或者其他的 LDAP 兼容的身份验证服务。所有设置都需要在服务器启动时在默认配置文件 neo4j.conf 中进行设定。

  1. 配置Neo4j 使用 LDAP 作为身份验证和授权提供方。

    1
    2
    dbms.security.auth_enabled=true
    dbms.security.auth_provider=ldap
  2. 配置活动目录。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    dbms.security.ldap.host=ldap://myactivedirectiory.example.com
    dbms.security.ldap.authentication.user_dn_template=cn=[0],cn=Users,dc=example,dc=com
    dbms.security.ldap.authentication.user_search_base=cn=Users,dc=example,dc=com
    dbms.security.ldap.authentication.user_search_filter=cn=(&(objextClass=*)(cn={0}))
    dbms.security.ldap.authentication.group_membership_attributes=memberOf
    dbms.security.ldap.authentication.group_to_role_mapping=\
    "cn=Neo4j Read Only,cn=Users,dc=neo4j,dc=com" = reader ;\
    "cn=Neo4j Read-Write,cn=Users,dc=neo4j,dc=com" = publisher ;\
    "cn=Neo4j Schema Manager,ch=Users,dc=neo4j,dc=com" = architect ;\
    "cn=Neo4j Administrator,cn=Users,dc=neo4j,dc=com" = admin ;\
    "cn=Neo4j Procedures,cn=Users,dc=neo4j,dc=com" = allowed_role ;\
ldapsearch 工具

可以使用 LDAP 命令行工具 ldapsearch 来验证配置是否正确、LDAP 服务器是否正在响应,可以通过发送包含 LDAP 配置设置值的搜索命令来执行此项操作。

  1. 参数 dbms.security.ldap.authorization.use_system_account=true 的验证为:

    1
    2
    # ldapsearch -v -H ldap://<dbms.security.ldap.host> -x -D <dbms.security.ldap.authentication.system_username> -w <dbms.security.ldap.authentication.system_password> -b <dbms.security.ldap.authentication.user_search_base> "<dbms.security.ldap.authentication.user_search_filter>" <dbms.security.ldap.authentication.group_membership_attributes>
    # ldapsearch -v -H ldap://myactivedirectiory.example.com:389 -x -D cn=search-account,cn=Users,dc=example,dc=com -w secret -b cn=Users,dc=example,dc=com "cn=(&(objextClass=*)(cn=john))" memberOf
  2. 参数 dbms.security.ldap.authorization.use_system_account=false 的验证为:

    1
    2
    # ldapsearch -v -H ldap://<dbms.security.ldap.host> -x -D <dbms.security.ldap.authentication.user_dn_template : replace {0}> -W -b <dbms.security.ldap.authentication.user_search_base> "<dbms.security.ldap.authentication.user_search_filter : replace {0}>" <dbms.security.ldap.authentication.group_membership_attributes>
    # ldapsearch -v -H ldap://myactivedirectiory.example.com:389 -x -D cn=search-account,cn=Users,dc=example,dc=com -W -b cn=Users,dc=example,dc=com "cn=(&(objextClass=*)(cn=john))" memberOf
认证缓存

认证缓存(Auth Cache)是 Neo4j 通过 LDAP 服务器缓存认证结果以提升性能的机制,它采用 dbms.security.ldap.autnentication.cache_enableddbms.security.auth_cache_ttl 参数进行配置。

1
2
dbms.security.ldap.authentication.cache_enabled=true
dbms.security.auth_cache_ttl=10m

管理员可以手动清除身份验证缓存,以强制重新查询来自联合身份验证提供的系统身份验证和授权信息,可以在 Neo4j 浏览器或 Neo4j Cypher Shell 中执行语句:CALL dbms.security.clearAuthCache(); 即可。

可以采用 StartTLD 来配置对活动目录的加密。

1
2
3
4
dbms.security.ldap.use_startls=true
dbms.security.ldap.host=ldap://myactivedirectory.example.com
# 也可以使用 LDAPS 来配置活动目录
dbms.security.ldap.host=ldaps://myactivedirectory.example.com:636

在实际生产环境中,建议使用由证书颁发机构颁发的 SSL 证书来确保对 LDAP 服务器的安全访问。可以在 neo4j.conf 中使用参数 dbms.jvm.addtional 来指定证书的详细信息,以告知 Neo4j 本地证书的位置。

1
2
3
4
dbms.jvm.addtional=-Djavax.net.ssl.keyStore=MyCert.key
dbms.jvm.addtional=-Djavax.net.ssl.keyStorePassword=secret
dbms.jvm.addtional=-Djavax.net.ssl.trustStore=MyCert.jks
dbms.jvm.addtional=-Djavax.net.ssl.trustStorePassword=secret

子图访问控制

通过使用用户定义的过程和自定义角色,管理员可以将用户的访问和动作限制到图中的指定部分,即:可以在子图的级别配置访问控制。
自定义角色是由 Neo4j 数据库管理员创建和删除,仅用于控制执行某些自定义开发的过程,与数据库自带的角色相比,自定义角色的权限需要在 neo4j.conf 中显式准许。

管理自定义角色
  1. 本机用户场景
    创建自定义角色,然后将此角色分配给相关用户。

    1
    2
    3
    # 创建 accounting 角色并将其分配给预先存在的 billsmith 用户
    CALL dbms.security.createRole('accounting')
    CALL dbms.security.addRoleToUser('accounting', 'billsmith')
  2. 联合用户场景(LDAP
    LDAP 方案中,LDAP 用户组必须映射到 Neo4j 中的自定义角色。

    1
    2
    # 将组号 101 的 LDAP 组映射到自定义 accounting 角色
    dbms.security.realms.ldap.authorization.group_to_role_mapping=101=accounting
配置过程的权限

需要自行创建读或写数据的过程(Procedure),自然内置或第三方库自带的过程除外,此过程与普通 Cypher 语句执行的安全规则相同。
可以使用配置选项 dbms.security.procedures.default_alloweddbms.security.procedures.roles 来准许特定角色执行相应的访问过程。

1
2
# 具有 Convert 角色的用户都可执行 apoc.convert 命名空间中的所有过程
dbms.security.procedures.roles = apoc.convert.*:Convert;apoc.load.json.*:Convert,DataSource;apoc.trigger.add:TriggerHappy

安全清单

安全清单为 Neo4j 数据库安全性建议的总结。

  • 在安全网络及安全服务器上部署 Neo4j,使用子网和防火墙,只打开必要的端口。
  • 保护静态数据,使用卷加密,管理对数据库转换和备份的访问。
  • 保护传输中的数据,对远程访问 Neo4j 数据库,只打开加密的 BoltHTTPS 访问链接,使用受信任证书颁发机构颁发的 SSL 证书。
  • 验证部署的任何自定义代码(过程和非托管扩展)。
  • 确保 Neo4j 文件正确的文件权限。
  • 如果启用了 LOAD CSV 函数操作,确保未授权用户不可导入数据。
  • 检查 neo4j.conf 文件,了解已弃用函数和远程 JMX 相关的端口。
  • 使用 Neo4j 最新的补丁版本。

运维与优化

本节介绍影响操作性能的因素,以及如何调整 Neo4j 以获得最佳吞吐量。

内存调优

Neo4j 在启动时将自动配置内存相关参数的默认值,并默认可使用机器上的所有内存。
有三种类型的内存需要考虑:

  • 操作系统内存。
  • 页面缓存。
  • 堆空间。

需要注意的是,操作系统内存不能显式配置,而实指定页面缓存和堆空间之后所剩余的内存。

  1. 操作系统内存大小
    必须为服务器上与 Neo4j 数据库不相关的其他程序预留一些内存。
    1 GB 内存是 Neo4j 服务器的最低配置。基本的计算方法如下: 系统内存 = 1GB + (graph.db / index) + (graph.db / schema)

  2. 页面缓存大小
    页面缓存用于缓存存储在磁盘上的 Neo4j 数据,确保将来自磁盘的所有或至少大部分图数据缓存到内存中。
    可通过简单的方法确定页面缓存的大小:汇总含 <neo4j-home>/data/database/graph.db/*store.db* 的所有文件大小,再增加 20% 的预留。
    指定页面缓存的参数是 dbms.memory.pagecache.size 该参数设定允许 Neo4j 使用多少内存用于高速缓存。如果在启动时没有明确指定,Neo4j 将给予默认配置: (机器可用内存 - JVM 最大堆分配) * 50%

  3. 堆大小
    可用堆大小是影响 Neo4j 性能的一个重要因素。大多数 Neo4j 应用,堆大小设置为 8~16GB 之间即可稳定运行。在文件 <neo4j-home>/conf/neo4j-wrapper.conf 中设置 dbms.memory.heap.initial_sizedbms.memory.heap_max_size 参数即可,以兆字节为单位。(建议将这两个参数设置为相同的值,以避免不必要的垃圾收集)

  4. 调整垃圾收集器
    建议使用并发垃圾收集器。

  5. 因此内存调优可按照如下步骤进行:

    • 计划操作系统内存大小。
    • 计划页面缓存大小调整。
    • 计划堆空间大小。
    • 做合理的检查,实际操作系统内存分配 = 可用内存 - (页面缓存 + 堆空间大小)。

压缩存储

在很多情况下,Neo4j 可以压缩和内联存储属性值,其目的在于节省磁盘空间和提高 I/O 操作性能。

短数组的压缩存储采用位剃削算法,以减少存储数组中成员的位数。步骤如下:

  • 对于数组的每个成员,确定最左边设置位的位置。
  • 确定数组中所有成员中最大的位置。
  • 他将所有成员减少到该位数。
  • 存储这些值,前缀为一个小标题。

当在数组中包括单个负值时,将使用原始字节大小来存储。

Linux 文件系统调优

Neo4j 数据库在查询数据时通常会产生许多少量、随机的读操作,而在提交更改时经常会产生少量的顺序写操作。
因此修改 Linux 使用的完全公平排队(Completely Fair Queuing, CFQ)算法来调度 IO 请求,将其修改为期限调度器(Deadline Scheduler)更适合数据库的特定 IO 工作负载情形。

1
2
3
$echo 'deadline' > /sys/block/sda/queue/scheduler
$cat /sys/block/sda/queue/scheduler
noop [deadline] cfq

磁盘、内存及相关提示

与其他的持久化方案一致,性能取决于使用的持久化介质,这就意味着更好的磁盘等于更好的性能。
存储文件保存在低寻道时间的磁盘上将大大提高读取操作的性能。同时为了减少磁盘访问可以加大内存容量。
同时也可以使用 dstatvmstat 等工具来收集应用程序的运行信息。


备份与恢复

此功能仅适用于企业版。
Neo4j 数据库备份到远程或离线存储是一项基本操作,Neo4j 支持全量备份和增量备份,对于三种配置方式(单实例、高可用集群和因果集群)的 Neo4j 数据库,其备份过程是相同的。备份使用 neo4j-bakcup 工具在网络上运行,即可从 Neo4j 服务器备份到本地副本。

必须配置两个参数才能执行备份:

  • dbms.backup.enabled=true,启用备份,这是默认值。
  • dbms.backup.address=<IP>:6362,配置备份服务监听的接口和端口。

这里备份的数据与生产系统没有任何的依赖关系,需要分开存储,如果可以需要遵循321原则

执行备份

备份命令 neo4j-admin 工具位于 bin 目录下,使用 backup 参数运行它,以便对正在运行的数据库执行联机备份。
语法为:neo4j-admin backup --backup-dir=<backup-path> --name=<graph.db-backup> [--from=<address>] [--fallback-to-full[=<true|fasle>]] [--check-consistency[=<true|false>]] [--cc-report-dir=<directory>] [--additional-config=<config-file-path>] [--timeout=<timeout>]

1
neo4j-admin backup --from=192.168.1.34 --backup-dir=/mnt/backup/neo4j-backup --name=graph.db-backup

增量备份需指定现有备份目录并且有上次被封以来的事务日志。备份工具将上次备份之后的任何操作进行备份,其结果将是与当前服务器状态一致的更新备份。
另外增量备份可能会失败,主要原因在于事务日志被删除且 --fallback-to-full 参数被设置为 false,建议将参数设置为 true,避免在增量备份时失败可以转换为全量备份。同时事务日志的自动轮询时间也是很重要的,配置 dbms.tx_log.rotation.retention_policy 以便事务日志保存在增量备份之间。

1
neo4j-admin backup --from=192.168.1.34 --backup-dir=/mnt/backup/neo4j-backup --name=graph.db-backup --fallback-to-full=true --check-consistency=true

备份因果集群时,核心服务器和只读副本都支持备份协议,都可用于集群备份,但是在生产中更倾向于使用只读副本作为备份,因为只读副本的数量在因果集群部署中远远多于核心服务器。

恢复备份

Neo4j 备份是全功能的数据库备份。恢复备份,必须关闭数据库,使用 neo4j-admin 工具的 restore 参数恢复备份。
语法为:neo4j-admin restore --from=<backup-path> --database=graph.db --force

1
neo4j-admin restore --from=/mnt/backup/neo4j-backup --database=graph.db --force

从高可用集群环境中的备份进行恢复,请按照以下步骤进行:

  • 关闭集群中的所有数据库实例。
  • 恢复每个实例上的备份。
  • 启动数据库实例。

恢复 Neo4j 因果集群的步骤与创建因果集群的步骤类似,即首先创建一个新的因果集群,但是不要启动组成集群的实例,而首先进行数据库的恢复。


相关工具

Cypher Shell

Cypher ShellNeo4j 数据库的一个命令行工具,可以用于数据库连接、调用 Cypher 语句进行数据查询或定义相关模式和执行管理任务。
Cypher Shell 采用显式事务方式,允许将多个操作分组一并执行或回滚,通信方式采用加密的二进制 Bolt 协议。
语法为:cypher-shell [-h] [-a ADDRESS] [-u USEWRNAME] [-p PASSWORD] [--encryption {true, fasle}] [--format {verbose, plain}] [--debug] [--fail-fast | --fail-at-end] [cypher]

1
2
$cypher-shell -u johnode -p secret
neo4j>MATCH (n) RETURn n

转储和加载

Neo4j 数据转储和加载需要用到 neo4j-admin 命令,该命令可将数据库从一个环境移动到另一个环境,也可用于数据库的脱机备份。
命令格式为:neo4j-admin dump --database=<datttabase> --to=<destination-path>neo4j-admin load --from=<archive-path> --database=<database> [--force]

1
2
neo4j-admin dump --database=graph.db --to=/backups/graph.db/2022-02-27.dump
neo4j-admin load --from=/backups/graph.db/2022-02-27.dump --database=graph.db --force

对于 Neo4j 在版本上的变更导致数据库目录结构的变更,建议 neo4j-admin dumpneo4j-admin load 这种更安全的全库导出、导入方式。

一致性检查

一致性检查可以使用 neo4j-admin 工具的 check-consistency 参数来检查数据库的一致性。
neo4j-admin 工具位于 bin 目录中,语法调用为:neo4j-admin check-conversistency --database=<database> [--report-dir=<directory>] [--additional-config=<file>] [--verbose]

1
neo4j-admin check-conversistency --database=graph.db

如果一致性检查工具未发现错误,则程序自动运行结束并不生成相应的报告;但如果发生错误,程序将会退出,退出代码为 1,并将错误信息写入到 inconsistencies-YYYY-MM-DD.HH24.MI.SS.report 的报告文件中,此文件位置在当前目录下或者由参数 report-dir 指定。
一致性检查工具可以调用由参数 --additional-config 指定的配置文件中的其他配置选项,配置文件的格式与 neo4j.conf 格式相同。

1
2
3
4
5
# conversistency-check.properties
tools.conversistency_checker.check_graph=false
tools.conversistency_checker.check_indexes=true
tools.conversistency_checker.check_label_scan_store=true
tools.conversistency_checker.check_property_owners=false

一致性检查工具不能与当前正在使用的数据库一起使用,如果与正在运行的数据库一起使用,这自动停止并输出错误信息。


引用

321原则


个人备注

此博客内容均为作者学习所做笔记,侵删!
若转作其他用途,请注明来源!