部署高可用模式

此文档主要介绍了高可用模式的原理、准备工作、以及服务器的操作说明

1.原理

TuGraph 通过多机热备份来提供高可用模式(HA 模式)。在高可用模式下,对数据库的写操作会被同步到所有服务器上,这样即使有部分服务器宕机也不会影响服务的可用性。

在高可用模式下,多个 TuGraph 服务器组成一个备份组。每个备份组由三个或更多 TuGraph 服务器组成,其中某台服务器会作为leader,而其他复制组服务器则作为follower。写入请求由leader 提供服务,该leader将每个请求复制同步到follower,并在请求同步到服务器后才能响应客户端。这样,如果任何服务器发生故障,其他服务器仍将具有到目前为止已写入的所有数据。如果leader 服务器发生故障,其他服务器将自动选择出新的leader

高可用模式仅企业版可用,开源社区版不含此功能。

2.准备工作

要启用高可用模式,用户需要:

  • 三台及以上的 TuGraph 服务器实例。

  • 获得一个具有高可用的 license 文件,具体请洽我们的经销商。

  • 在启动 lgraph_server 时打开高可用模式,可以使用配置文件或者命令行将enable_ha选项设置为true

  • 设置正确的rpc_port,可通过配置文件或者命令行设置。

3.启动初始备份组

3.1.初始数据一致

当启动时所有服务器中的数据相同或没有数据时,用户可以通过 指定--conf host1:port1,host2:port2启动服务器。 这种方式可以将准备好的所有TuGraph实例一次性加入初始备份组, 由备份组中的所有服务器根据raft协议选举出leader,并将其他 服务器以follower的角色加入备份组。

启动初始备份组的命令示例如下所示:

$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090

3.2.初始数据不一致

如果第一台服务器中已有数据(以lgraph_import工具导入或从非高可用模式的服务器传输得到), 并且之前并未在高可用模式下使用,则用户应使用enable_bootstrap参数 在引导模式下启动服务器。在引导模式下,服务器在将新加入的服务器添加到备份组之前会将自己的 数据复制到新服务器中,以使每个服务器中的数据保持一致。

启动有数据服务器的命令示例如下所示:

$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --conf 172.22.224.15:9090 --enable_bootstrap true

其他无数据的服务器不需要指定enable_bootstrap参数,只需通过conf参数指定leader即可,命令示例如下所示

$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --conf 172.22.224.15:9090

4.横向扩展其他服务器

启动初始备份组后,如果想对备份组进行横向扩展,要将新服务器添加到备份组, 应使用--conf HOST:PORT选项,其中HOST可以是该备份组中已有的任何服务器的 IP 地址, 而PORT是其 RPC 端口。例如:

./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --conf 172.22.224.15:9090

此命令将启动一台高可用模式的 TuGraph 服务器,并尝试将其添加到包含服务器172.22.224.15:9090的备份组中。 请注意,加入备份组需要服务器将其数据与备份组的leader服务器同步,此过程可能需要相当长的时间,具体取决于数据的大小。

5.停止服务器

当服务器通过CTRL-C下线时,它将通知当前的leader服务器,告知其从备份组中删除该下线的服务器。如果leader服务器下线, 它将在下线前将leader身份权限传给另一台服务器。

如果服务器被终止或者与备份组中的其他服务器失去连接,则该服务器将被视为失败节点,leader服务器将在特定时限后将其从备份组中删除。

如果任何服务器离开备份组并希望重新加入,则必须从--conf HOST:PORT选项开始,其中HOST是当前备份组中的某台服务器的 IP 地址。

6.重启服务器

不建议重新启动整个备份组,因为它会中断服务。如果需要,可以关闭所有服务器。但在重新启动时, 必须保证关闭时的备份组中至少有N/2+1的服务器能正常启动,否则启动失败。 并且, 无论初始启动复制组时是否指定enable_bootstrap为true,重启服务器时都只需通过 指定--conf host1:port1,host2:port2参数一次性重启所有服务器即可,命令示例如下所示:

$ ./lgraph_server -c lgraph.json --rpc_port 9090 --enable_ha true --conf 172.22.224.15:9090,172.22.224.16:9090,172.22.224.17:9090

7.查看服务器状态

备份组的当前状态可以在 TuGraph 可视化工具、REST API 以及 Cypher 查询中获取。

在 TuGraph 可视化工具中,可以在 DBInfo 部分中找到备份组中的服务器及其角色列表。

使用 REST API 时,可以使用GET /info/peers 请求获取信息。

在 Cypher 中,使用CALL dbms.listServers()语句来查询当前备份组的状态信息。

8.高可用模式下数据同步问题

在高可用模式下,同一备份组中的不同服务器可能并不总是处于相同的状态。出于性能原因,如果请求已同步到超过一半的服务器,则leader服务器将认为该请求属于committed状态。尽管其余服务器最终将收到新请求,但服务器的状态不一致将持续一段时间。客户端也可能向刚刚重新启动的服务器发送请求,从而具有较旧的状态。

为了确保客户端看到一致连续的数据,特别是为了摆脱反向时间旅行问题(其中客户端读取比以前看到的状态更旧的状态),每个 TuGraph 服务器都会保持一个单调增加的数据版本号。备份组中数据版本号到数据库状态的映射全局一致,这意味着如果两台服务器具有相同的数据版本号,则它们必须具有相同的数据。响应请求时,服务器在响应中包含了其数据版本号。因此,客户端可以知道它看到了哪个版本。客户端收到旧版本的数据之后可以重新向Master发送请求,从而获取到最新的数据。