我想在arangoDB中使用分片。我已经制作了协调员,DBServers,如文档2.8.5所述。但仍然可以有人仍然详细解释它,以及如何在分片之前和之前检查我的查询的性能。
答案 0 :(得分:2)
测试您的应用程序可以with a local cluster, were all instances run on one machine - 这是您已经做过的,如果我能正确完成的话?
ArangoDB集群由协调器和dbserver节点组成。协调员在磁盘上没有自己的用户特定本地集合。它们的作用是处理客户端的I / O,解析,优化和分发查询以及用户数据到dbserver节点。 Foxx服务也将在协调员上运行。 DBServers是此设置中的存储节点,它们保留用户数据。
要比较群集和非群集模式之间的性能,请在群集实例和非群集实例上导入数据集,并比较查询结果时间。由于群集设置可以具有比单个服务器情况更多的网络通信(即,如果您进行连接),则性能可能不同。在一个 physically distributed cluster you may achieve higher throughput,因为最后集群节点是自己的机器,并且有自己的IO路径,这些路径以不同的物理硬盘结束。
在群集案例中,您使用numberOfShards
参数create collections specifying the number of shards; 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
- 节点在内的节点将部署到DB服务器。
通常较少REMOTE
/ SCATTER
- > GATHER
对意味着更少的群集通信。可以将更近的FILTER
节点部署到*CollectionNodes
以减少通过REMOTE
- 节点发送的文档数量,从而提高性能。