使用 Docker Swarm 部署 Nebula Graph 集群

本文档介绍如何使用 Docker Swarm 部署 Nebula Graph 集群。

前提条件

部署集群前,请确保所有机器已安装 Docker 和 Docker Compose。如果需要自定义负载均衡和高可用,请安装 HAProxy 和 Keepalived。

机器准备:

IP 内存(Gb) CPU(核数) 角色
192.168.1.166 16 4 manager
192.168.1.167 16 4 worker
192.168.1.168 16 4 worker

创建 Nebula Graph 集群

初始化 Docker Swarm 集群

在机器 192.168.1.166 上执行以下命令初始化 Docker Swarm 集群:

$ docker swarm init --advertise-addr 192.168.1.166

返回以下信息:

Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
 docker swarm join \
 --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
 192.168.1.166:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

创建集群工作节点

根据 docker swarm init 命令的提示内容,创建 Swarm 集群的工作节点,分别在机器 192.168.1.167192.168.1.168 上执行以下命令:

$ docker swarm join \
 --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
 192.168.1.166:2377

返回以下信息:

This node joined a swarm as a worker.

验证集群

在 manager 节点上执行以下命令列出 Docker Swarm 节点信息:

$ docker node ls

返回以下信息:

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
h0az2wzqetpwhl9ybu76yxaen *   KF2-DATA-166        Ready               Active              Reachable           18.06.1-ce
q6jripaolxsl7xqv3cmv5pxji     KF2-DATA-167        Ready               Active              Leader              18.06.1-ce
h1iql1uvm7123h3gon9so69dy     KF2-DATA-168        Ready               Active                                  18.06.1-ce

配置 Docker Stack

在 manager 节点上执行以下命令添加 Docker Stack 配置文件:

$ vi docker-stack.yml

请根据您的 IP 地址与端口号进行配置。示例配置文件参考 docker-stack.yml

在 manager 节点上执行以下命令添加 nebula.env 配置文件:

$ vi nebula.env

nebula.env 文件中加入如下内容:

TZ=UTC
USER=root

启动集群

在 manager 节点上执行以下命令启动 Nebula Graph 集群:

$ docker stack deploy nebula -c docker-stack.yml

查看集群服务

在 manager 节点上执行以下命令查看服务状态:

$ docker service ls

返回以下信息:

ID                  NAME                MODE                REPLICAS            IMAGE                            PORTS
43abplqq0h2z        nebula_graphd1      replicated          1/1                 vesoft/nebula-graphd:nightly
jkmnyzy2772s        nebula_graphd2      replicated          1/1                 vesoft/nebula-graphd:nightly
uo79ebcp41uw        nebula_graphd3      replicated          1/1                 vesoft/nebula-graphd:nightly
p50k0l1pvth0        nebula_metad0       replicated          1/1                 vesoft/nebula-metad:nightly
oafq5jph8e65        nebula_metad1       replicated          1/1                 vesoft/nebula-metad:nightly
qr4t5a8u5vjv        nebula_metad2       replicated          1/1                 vesoft/nebula-metad:nightly
ivs5i0o69505        nebula_storaged0    replicated          1/1                 vesoft/nebula-storaged:nightly
y1xlsym8q90s        nebula_storaged1    replicated          1/1                 vesoft/nebula-storaged:nightly
xwgu2sfi2qso        nebula_storaged2    replicated          1/1                 vesoft/nebula-storaged:nightly

集群负载均衡及高可用配置(可选)

目前,Nebula Graph 的客户端(1.X)未提供负载均衡,而是随机选一个 graphd 服务连接。因此生产使用时需自行配置负载均衡和高可用。文档中的负载均衡和高可用仅为示例方案,您可以根据需要添加其他的第三方方案。

负载均衡配置

HAProxy 使用 Docker Compose 配置。分别编辑以下三个文件:

Dockerfile 文件中加入以下内容:

FROM haproxy:1.7
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
EXPOSE 3640

docker-compose.yml 文件加入以下内容:

version: "3.2"
services:
  haproxy:
    container_name: haproxy
    build: .
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
    ports:
      - 3640:3640
    restart: always
    networks:
      - app_net
networks:
  app_net:
    external: true

haproxy.cfg 文件加入以下内容:

请根据您的 IP 地址与端口号进行配置。

global
    daemon
    maxconn 30000
    log 127.0.0.1 local0 info
    log 127.0.0.1 local1 warning

defaults
    log-format %hr\ %ST\ %B\ %Ts
    log  global
    mode http
    option http-keep-alive
    timeout connect 5000ms
    timeout client 10000ms
    timeout server 50000ms
    timeout http-request 20000ms

# customize your own frontends && backends && listen conf
#CUSTOM

listen graphd-cluster
    bind *:3640
    mode tcp
    maxconn 300
    balance roundrobin
    server server1 192.168.1.166:3699 maxconn 300 check
    server server2 192.168.1.167:3699 maxconn 300 check
    server server3 192.168.1.168:3699 maxconn 300 check

listen stats
    bind *:1080
    stats refresh 30s
    stats uri /stats

启动 HAProxy

$ docker-compose up -d

高可用配置

192.168.1.166192.168.1.167192.168.1.168 进行以下操作:

安装 Keepalived

执行以下命令安装 Keepalived:

apt-get update && apt-get upgrade && apt-get install keepalived -y

配置 Keepalived

更改 Keepalived 配置文件 /etc/keepalived/keepalived.conf(三台机器中 priority 必须设置成不同值以确定优先级)。示例配置文件参考 keepalived.conf

注意:配置 Keepalived 需预先准备好虚拟 IP,在以下配置中 192.168.1.99 即为虚拟 IP。

FAQ

如何实现离线部署

将镜像更改为私有镜像库即可实现离线部署。