如何解决集群实例上的不一致问题
(如果使用 HA(高可用性),请分别将 `Leader` 和 `Follower` 代替 `Master` 和 `Slave`)
有时,在运行 Neo4j 集群环境时,从节点的存储可能会变得不一致。在日常操作中,如果从节点变得不一致,它会自动尝试通过从主节点实例获取数据来解决问题。但是,有时这可能无法实现。例如,如果从节点离线时间过长,可能会导致主节点实例上的事务日志文件丢失,从而无法在从节点实例上重播所有事务,因此也无法追赶进度。这将导致从节点由于存储不一致而无法加入集群。如果发生这种情况,可以使用以下步骤从主节点实例的完整备份中完全恢复从节点存储。
由于此操作的危险性,我们建议在继续操作之前始终记录支持工单。 |
步骤
-
识别日志文件中的错误
-
识别主节点实例
-
在主节点上运行备份
-
将备份移动到故障从节点
-
停止实例
-
备份旧存储 [可选]
-
恢复备份
-
启动实例
-
清理旧文件 [可选]
1. 识别日志文件中的错误
2017-02-12 15:33:37.334+0000 INFO [o.n.k.h.c.SwitchToSlaveBranchThenCopy] The store is inconsistent. Will treat it as branched and fetch a new one from the master 2017-02-12 15:33:37.334+0000 WARN [o.n.k.h.c.SwitchToSlaveBranchThenCopy] Current store is unable to participate in the cluster; fetching new store from master The master is missing the log required to complete the consistency check
2. 识别主节点实例
如果您正在运行高可用性 (HA) 集群
我们可以使用 HTTP 端点来发现哪个实例是主节点:/db/manage/server/ha/master
。从命令行,使用 curl 是询问这些端点的常用方法。在没有参数的情况下,curl 将对提供的 URI 执行 HTTP GET 并输出主体文本(如果有)。如果您还想获取响应代码,只需添加 -v 标志以获取详细输出
$ curl -v localhost:7474/db/manage/server/ha/master
* Trying 127.0.0.1 * Connected to localhost (127.0.0.1) port 7474 (#0) > GET /db/manage/server/ha/master HTTP/1.1 > Host: localhost:7474 > Accept: */* > < HTTP/1.1 200 OK < Date: Fri, 17 Feb 2017 16:38:37 GMT < Content-Type: text/plain < Access-Control-Allow-Origin: * < Transfer-Encoding: chunked < Server: Jetty(6.1.25) < * Connection #0 to host localhost left intact true
表 1. HA HTTP 端点响应
端点 | 实例状态 | 返回代码 | 主体文本 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
(如果 Neo4j 服务器启用了基本安全性,HA 状态端点也将需要身份验证凭据。如果需要身份验证,请使用 --user 开关运行 curl 命令 (curl -v localhost:7474/db/manage/server/ha/master --user
<username>:<password>)
有关 HA HTTP 端点的更多信息,请参见此处:https://neo4j.ac.cn/docs/operations-manual/current/clustering/high-availability/http-endpoints/ |
如果您正在运行因果集群 (CC) (Neo4j v3.1.x 及更高版本)
使用 CC 时,有两种方法可以获取实例角色,即过程或 HTTP 端点
1) 过程 dbms.cluster.role()
或 dbms.cluster.overview()
CALL dbms.cluster.role()
-
过程 dbms.cluster.role() 可以调用因果集群中的每个实例,以返回实例的角色。返回一个包含当前实例角色的字符串。
CALL dbms.cluster.overview()
-
过程 dbms.cluster.overview() 通过返回集群中所有实例的详细信息来提供集群拓扑的概述。返回集群实例的 ID、地址和角色(此过程只能从核心实例调用,因为它们是唯一拥有集群完整视图的实例)。
2) CC 的 HTTP 端点
与 HA 一样,我们可以使用 HTTP 端点来发现哪个实例是主节点:/db/manage/server/core/writable
。从命令行,使用 curl 是询问这些端点的常用方法。在没有参数的情况下,curl 将对提供的 URI 执行 HTTP GET 并输出主体文本(如果有)。如果您还想获取响应代码,只需添加 -v 标志以获取详细输出
$ curl -v localhost:7474/db/manage/server/core/writable
* Trying ::127.0.0.1 * Connected to localhost (127.0.0.1) port 7474 (#0) > GET /db/manage/server/core/writable HTTP/1.1 > Host: localhost:7474 > Accept: */* > < HTTP/1.1 200 OK < Date: Fri, 17 Feb 2017 16:38:37 GMT < Content-Type: text/plain < Access-Control-Allow-Origin: * < Transfer-Encoding: chunked < Server: Jetty(9.2.9 v20150224) < * Connection #0 to host localhost left intact true
表 2. CC HTTP 端点响应
端点 | 实例状态 | 返回代码 | 主体文本 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
(如果 Neo4j 服务器启用了基本安全性,CC 状态端点也将需要身份验证凭据。如果需要身份验证,请使用 --user 开关运行 curl 命令 (curl -v localhost:7474/db/manage/server/ha/master --user
<username>:<password>)
3. 在主节点上运行备份
执行完整备份:创建一个空目录(例如:/mnt/backup
)并运行备份命令
$ neo4j-backup -host <address> -to <backup-path>
$ neo4j-admin backup --backup-dir=<backup-path> --name=<graph.db-backup> [--from=<address>] [--fallback-to-full[=<true|false>]] [--check-consistency[=<true|false>]] [--cc-report-dir=<directory>] [--additional-config=<config-file-path>] [--timeout=<timeout>]
neo4j-home> mkdir /mnt/backup
neo4j-home> bin/neo4j-admin backup --from=192.168.1.34 --backup-dir=/mnt/backup --name=graph.db-backup
Doing full backup...
2017-02-01 14:09:09.510+0000 INFO [o.n.c.s.StoreCopyClient] Copying neostore.nodestore.db.labels
2017-02-01 14:09:09.537+0000 INFO [o.n.c.s.StoreCopyClient] Copied neostore.nodestore.db.labels 8.00 kB
2017-02-01 14:09:09.538+0000 INFO [o.n.c.s.StoreCopyClient] Copying neostore.nodestore.db
2017-02-01 14:09:09.540+0000 INFO [o.n.c.s.StoreCopyClient] Copied neostore.nodestore.db 16.00 kB
...
...
...
如果您对 /mnt/backup
进行目录列表,您将看到 Neo4j 的备份,名为 graph.db-backup
。
4. 将备份移动到故障从节点
要将文件从主节点复制到从节点,请在登录到主节点时
$ scp -r /path/to/neo4j/backup username@<SLAVE_ADDRESS>:/path/to/destination
6. 备份旧存储 [可选]
建议保留当前从节点存储,以便在需要时回滚操作。为此,我们只需重命名当前存储目录
$ mv $NEO4J_HOME/data/databases/graph.db $NEO4J_HOME/data/databases/graph.db-old
此页面是否有帮助?