ArangoDB如何设置集群和分片?

How to set clusters and sharding in ArangoDB?

我想在 arangoDB.I 中使用分片,如文档 2.8.5 中所述,已创建协调器和 DBServer。但是仍然有人可以详细解释它,以及我如何能够在分片前后检查查询的性能。

可以测试您的应用程序 with a local cluster, were all instances run on one machine - 如果我没看错的话,您已经这样做了?

ArangoDB 集群由协调器和数据库服务器节点组成。协调员在磁盘上没有自己的用户特定本地集合。他们的作用是处理 I/O 与客户端的关系,解析、优化查询和用户数据并将其分发到 dbserver 节点。 Foxx 服务也将 运行 放在协调器上。 DBServers 是此设置中的存储节点,它们保存用户数据。

要比较集群模式和非集群模式之间的性能,您在集群实例和非集群实例上导入数据集并比较查询结果时间。由于集群设置可以比单个服务器案例有更多的网络通信(即,如果您进行连接),性能可能会有所不同。在一个 physically distributed cluster you may achieve higher throughput,因为最终集群节点是自己的机器,并且有自己的 IO 路径,这些路径结束于单独的物理硬盘。

在群集情况下,您 create collections specifying the number of shards 使用 numberOfShards 参数; shardKeys 参数可以控制您的文档在分片中的分布。您应该选择该键,以便文档在各个分片中分布良好(即不会只在一个分片上不平衡)。 numberOfShards 可以是任意值,并且不必对应于 dbserver 节点的数量 - 它甚至可以更大,因此您可以在扩展集群时更轻松地将分片从一个 dbserver 移动到一个新的 dbserver到以后更多的节点,以适应更高的负载。

当您开发 AQL 查询时考虑到集群的使用,使用 the explain command 来检查查询在集群中的分布方式以及可以部署过滤器的位置是必不可少的:

db._create("sharded", {numberOfShards: 2})
db._explain("FOR x IN sharded RETURN x")
Query string:
 FOR x IN sharded RETURN x

Execution plan:
 Id   NodeType                  Est.   Comment
  1   SingletonNode                1   * ROOT
  2   EnumerateCollectionNode      1     - FOR x IN sharded /* full collection scan */
  6   RemoteNode                   1       - REMOTE
  7   GatherNode                   1       - GATHER
  3   ReturnNode                   1       - RETURN x

Indexes used:
 none

Optimization rules applied:
 Id   RuleName
  1   scatter-in-cluster
  2   remove-unnecessary-remote-scatter

在这个简单的查询中,RETURN & GATHER 节点在协调器上;包括 REMOTE-node 在内的节点向上部署到 DB-server.

一般而言,较少的 REMOTE / SCATTER -> GATHER 对意味着较少的集群通信。 FILTER 节点可以部署到 *CollectionNodes 越近以减少通过 REMOTE 节点发送的文档量,性能就越好。