跨数据中心Docker部署NebulaGraph遇目录不存在错误,求部署方案
跨多服务器分布式部署NebulaGraph解决方案
一、先解决当前目录缺失错误
你遇到的Failed to read the directory "/data/meta/nebula"错误,是因为本地挂载的目录未提前创建,容器无法自动生成多级目录结构。在要运行服务的服务器上执行以下命令创建所需目录:
mkdir -p ./data/meta ./logs/meta ./data/storage ./logs/storage ./logs/graph
二、跨三台服务器分布式部署步骤
前提准备
- 三台服务器开放以下端口,确保彼此能通过公网IP通信:
- metad:9559(服务端口)、19559(HTTP端口)、19560(备用端口)
- storaged:9779(服务端口)、19779(HTTP端口)、19780(备用端口)
- graphd:9669(服务端口)、19669(HTTP端口)、19670(备用端口)
- 每台服务器安装Docker和Docker Compose
- 每台服务器创建
.env文件(修正原TZ=UTS为TZ=UTC):TZ=UTC USER=root PASSWORD=passroot SERVER1=154.13.92.23 SERVER2=154.13.92.24 SERVER3=154.13.92.25
服务器1(SERVER1=154.13.92.23):部署metad + graphd
创建docker-compose.yml:
version: '3.9' services: metad: image: vesoft/nebula-metad:v3.5.0 environment: USER: "${USER}" PASSWORD: "${PASSWORD}" TZ: "${TZ}" command: - --meta_server_addrs=${SERVER1}:9559,${SERVER2}:9559,${SERVER3}:9559 - --local_ip=${SERVER1} - --ws_ip=${SERVER1} - --port=9559 - --ws_http_port=19559 - --data_path=/data/meta - --log_dir=/logs - --v=0 - --minloglevel=0 ports: - 0.0.0.0:9559:9559 - 0.0.0.0:19559:19559 - 0.0.0.0:19560:19560 healthcheck: test: ["CMD", "curl", "-sf", "http://${SERVER1}:19559/status"] interval: 30s timeout: 10s retries: 3 start_period: 20s volumes: - ./data/meta:/data/meta - ./logs/meta:/logs restart: unless-stopped graphd: image: vesoft/nebula-graphd:v3.5.0 environment: USER: "${USER}" PASSWORD: "${PASSWORD}" TZ: "${TZ}" command: - --meta_server_addrs=${SERVER1}:9559,${SERVER2}:9559,${SERVER3}:9559 - --port=9669 - --local_ip=${SERVER1} - --ws_ip=${SERVER1} - --ws_http_port=19669 - --log_dir=/logs - --v=0 - --minloglevel=0 - --enable_authorize=true ports: - 0.0.0.0:9669:9669 - 0.0.0.0:19669:19669 - 0.0.0.0:19670:19670 healthcheck: test: ["CMD", "curl", "-sf", "http://${SERVER1}:19669/status"] interval: 30s timeout: 10s retries: 3 start_period: 20s volumes: - ./logs/graph:/logs restart: unless-stopped networks: default: name: nebula-net external: true
执行以下命令启动服务:
mkdir -p ./data/meta ./logs/meta ./logs/graph docker-compose up -d
服务器2(SERVER2=154.13.92.24):部署metad + storaged
创建docker-compose.yml:
version: '3.9' services: metad: image: vesoft/nebula-metad:v3.5.0 environment: USER: "${USER}" PASSWORD: "${PASSWORD}" TZ: "${TZ}" command: - --meta_server_addrs=${SERVER1}:9559,${SERVER2}:9559,${SERVER3}:9559 - --local_ip=${SERVER2} - --ws_ip=${SERVER2} - --port=9559 - --ws_http_port=19559 - --data_path=/data/meta - --log_dir=/logs - --v=0 - --minloglevel=0 ports: - 0.0.0.0:9559:9559 - 0.0.0.0:19559:19559 - 0.0.0.0:19560:19560 healthcheck: test: ["CMD", "curl", "-sf", "http://${SERVER2}:19559/status"] interval: 30s timeout: 10s retries: 3 start_period: 20s volumes: - ./data/meta:/data/meta - ./logs/meta:/logs restart: unless-stopped storaged: image: vesoft/nebula-storaged:v3.5.0 environment: USER: "${USER}" PASSWORD: "${PASSWORD}" TZ: "${TZ}" command: - --meta_server_addrs=${SERVER1}:9559,${SERVER2}:9559,${SERVER3}:9559 - --local_ip=${SERVER2} - --ws_ip=${SERVER2} - --port=9779 - --ws_http_port=19779 - --data_path=/data/storage - --log_dir=/logs - --v=0 - --minloglevel=0 ports: - 0.0.0.0:9779:9779 - 0.0.0.0:19779:19779 - 0.0.0.0:19780:19780 healthcheck: test: ["CMD", "curl", "-sf", "http://${SERVER2}:19779/status"] interval: 30s timeout: 10s retries: 3 start_period: 20s volumes: - ./data/storage:/data/storage - ./logs/storage:/logs restart: unless-stopped networks: default: name: nebula-net external: true
执行以下命令启动服务:
mkdir -p ./data/meta ./logs/meta ./data/storage ./logs/storage docker-compose up -d
服务器3(SERVER3=154.13.92.25):部署metad + storaged
创建docker-compose.yml:
version: '3.9' services: metad: image: vesoft/nebula-metad:v3.5.0 environment: USER: "${USER}" PASSWORD: "${PASSWORD}" TZ: "${TZ}" command: - --meta_server_addrs=${SERVER1}:9559,${SERVER2}:9559,${SERVER3}:9559 - --local_ip=${SERVER3} - --ws_ip=${SERVER3} - --port=9559 - --ws_http_port=19559 - --data_path=/data/meta - --log_dir=/logs - --v=0 - --minloglevel=0 ports: - 0.0.0.0:9559:9559 - 0.0.0.0:19559:19559 - 0.0.0.0:19560:19560 healthcheck: test: ["CMD", "curl", "-sf", "http://${SERVER3}:19559/status"] interval: 30s timeout: 10s retries: 3 start_period: 20s volumes: - ./data/meta:/data/meta - ./logs/meta:/logs restart: unless-stopped storaged: image: vesoft/nebula-storaged:v3.5.0 environment: USER: "${USER}" PASSWORD: "${PASSWORD}" TZ: "${TZ}" command: - --meta_server_addrs=${SERVER1}:9559,${SERVER2}:9559,${SERVER3}:9559 - --local_ip=${SERVER3} - --ws_ip=${SERVER3} - --port=9779 - --ws_http_port=19779 - --data_path=/data/storage - --log_dir=/logs - --v=0 - --minloglevel=0 ports: - 0.0.0.0:9779:9779 - 0.0.0.0:19779:19779 - 0.0.0.0:19780:19780 healthcheck: test: ["CMD", "curl", "-sf", "http://${SERVER3}:19779/status"] interval: 30s timeout: 10s retries: 3 start_period: 20s volumes: - ./data/storage:/data/storage - ./logs/storage:/logs restart: unless-stopped networks: default: name: nebula-net external: true
执行以下命令启动服务:
mkdir -p ./data/meta ./logs/meta ./data/storage ./logs/storage docker-compose up -d
三、关键配置修正说明
- 地址格式修正:原配置中
--meta_server_addrs里的多余引号会导致地址解析错误,需删除引号直接使用${SERVER1}:9559格式。 - IP配置修正:跨服务器部署时,
local_ip和ws_ip必须使用服务器公网IP,不能用容器名,否则其他节点无法访问。 - 角色分配:NebulaGraph要求至少3个metad节点保证高可用,storaged节点建议为奇数,graphd可按需部署在任意节点。
四、验证部署成功
登录graphd所在服务器(如SERVER1),用nebula-console连接集群:
docker run --rm -it vesoft/nebula-console:v3.5.0 -addr 154.13.92.23 -port 9669 -u root -p passroot
执行以下命令查看集群状态:
SHOW HOSTS; SHOW HOSTS STORAGE;
若能看到所有metad和storaged节点状态正常,则部署成功。
内容的提问来源于stack exchange,提问作者Pamungkas Jayuda
相关产品推荐
相关产品推荐

