是否可以通过数据库(而不是集合或shardKey)实现ArangoDB分片?

时间:2018-12-13 19:38:11

标签: database arangodb sharding

我有一个带有大量数据库的大型Arango实例-每个项目一个。每个项目数据库都有很多集合和大量数据。数据库看起来像

project1
project2
project3
...
project500

我想通过分片实例来分配查询负载,以便每个项目数据库都在单独的服务器上运行,或者启动多个大型主机并让Arango自动设置。但是,似乎ArangoDB分片仅在集合级别有效(例如,通过集合中的_key记录)。

是否可以通过数据库设置分片?如果不是,是否有最佳实践来运行/编排多个Arango实例?

3 个答案:

答案 0 :(得分:6)

运行多个实例的选项之一是使用Docker Swarm。 在下面的示例中,您可以运行ArangoDB的多个实例

您需要

然后将下面的代码另存为docker-stack-arango.yml

version: '3.3'

services:
  arangodb:
    image: "${ARANGO_IMAGE}"
    environment:
      ARANGO_ROOT_PASSWORD: "${ARANGO_ROOT_PASSWORD}"
      ARANGO_STORAGE_ENGINE: "${ARANGO_STORAGE_ENGINE}"
    volumes:
      - arangodb:/var/lib/arangodb3
      - arangodb_apps:/var/lib/arangodb3-apps
    ports:
      - target: 8529
        published: $ARANGO_PUBLISHED_PORT
        protocol: tcp
        mode: ingress
    deploy:
      mode: replicated
      replicas: 1
      endpoint_mode: vip
      placement:
        constraints:
          - node.labels.group==$INSTANCE_GROUP
      resources:
        limits:
          cpus: $LIMITS_CPU
          memory: $LIMITS_MEMORY
      restart_policy:
        condition: any
        delay: 5s
        max_attempts: 3
        window: 60s
      update_config:
        parallelism: 1
        delay: 30s
    stop_grace_period: 60s

volumes:
  arangodb:
    external:
      name: ${ARANGO_VOLUME}
  arangodb_apps:
    external:
      name: ${ARANGO_APPS_VOLUME}

在shell / bash中更新并运行配置

export INSTANCE_GROUP="group1"
export INSTANCE_NAME="arango1"
export INSTANCE_PORT=8529
export INSTANCE_PASSWORD="do-not-use-this-password-in-production"

export ARANGO_IMAGE_TAG="3.4.0"
export ARANGO_IMAGE_REPO="arangodb/arangodb"
export ARANGO_IMAGE="${ARANGO_IMAGE_REPO}:${ARANGO_IMAGE_TAG}"
export ARANGO_VOLUME="arangodb-${INSTANCE_NAME}--3.4.0"
export ARANGO_APPS_VOLUME="arangodb-apps-${INSTANCE_NAME}--3.4.0"
export ARANGO_PUBLISHED_PORT=$INSTANCE_PORT
export ARANGO_STORAGE_ENGINE="rocksdb"
export ARANGO_ROOT_PASSWORD=$INSTANCE_PASSWORD
export LIMITS_CPU=1
export LIMITS_MEMORY=1024M

然后运行deploy

docker stack deploy -c ./docker-stack-arango.yml $INSTANCE_NAME

要部署第二个实例更改INSTANCE_NAMEINSTANCE_PORTINSTANCE_GROUP,然后再次运行deploy

然后您可以通过任何已配置端口的节点的ip来访问实例

答案 1 :(得分:4)

不。分片仅用于在多个数据库服务器上分发任何集合的文档的目的。这是在ArangoDB群集上实现内存以及负载平衡的一种方法。

答案 2 :(得分:4)

Arango也可以使用Kubernetes代替Docker swarm来实现(可能更好)。如果您确实愿意,甚至可以创建多个服务器独立实例。不过,无论采用哪种实施技术,我都想其他答案试图表明的是,如果您有多个独立数据库,则可以有多个ArangoDB实例(或与此相关的任何其他数据库)。您唯一要在一个实例中保留多个数据库的情况是,如果这些数据库足够小,它们将不争夺服务器资源。

划分当前实例应该很简单,因为您可以独立备份,还原和操作不同的DB。分片和其他相关概念(如分区)是在必须将所有数据保留在单个数据库中的情况下使用的。在这种情况下,需要找到一种方法将数据划分为多个服务器,同时将其保持为一个单元。在这里似乎并非如此。

如果您想了解有关如何在Kubernetes上使用ArangoDb的更多信息,可以找到文档here