httpd-gateway连接错误

我的Nebula版本号是v2.5.0,是用官网上的Docker Compose部署的;系统是Windows10;还有SHOW HOSTS结果:

以及httpd-gateway里的app.config文件:

image

在输入./nebula-httpd打开后端之后,我尝试用

curl -i -X POST -d ‘{“username”:“root”,“password”:“password”,“address”:“172.20.10.3”,“port”:9669}’ http://127.0.0.1:8080/api/db/connect

连接数据库,但是它给我返回的结果是
{
“code”: -1,
“data”: null,
“message”: "failed to find IP, error: lookup : no such host "
}

后端的情况:

想请教一下这里可能是哪里出问题了?

172.20.10.3 是你部署 nebula 数据库的机器 ip 吗。能否看一下 docker compose 具体配置

对的,那个是当时我跑docker-compose的ip地址

ipconfig:
image

我现在用不同的ip又跑了一遍docker-compose,但是结果还是一样的

docker-compose.yaml的内容:
version: ‘3.4’
services:
metad0:
image: vesoft/nebula-metad:v2.5.0
environment:
USER: root
TZ: “${TZ}”
command:
- --meta_server_addrs=metad0:9559,metad1:9559,metad2:9559
- --local_ip=metad0
- --ws_ip=metad0
- --port=9559
- --ws_http_port=19559
- --data_path=/data/meta
- --log_dir=/logs
- --v=0
- --minloglevel=0
healthcheck:
test: [“CMD”, “curl”, “-sf”, “http://metad0:19559/status”]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
ports:
- 9559
- 19559
- 19560
volumes:
- ./data/meta0:/data/meta
- ./logs/meta0:/logs
networks:
- nebula-net
restart: on-failure
cap_add:
- SYS_PTRACE

metad1:
image: vesoft/nebula-metad:v2.5.0
environment:
USER: root
TZ: “${TZ}”
command:
- --meta_server_addrs=metad0:9559,metad1:9559,metad2:9559
- --local_ip=metad1
- --ws_ip=metad1
- --port=9559
- --ws_http_port=19559
- --data_path=/data/meta
- --log_dir=/logs
- --v=0
- --minloglevel=0
healthcheck:
test: [“CMD”, “curl”, “-sf”, “http://metad1:19559/status”]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
ports:
- 9559
- 19559
- 19560
volumes:
- ./data/meta1:/data/meta
- ./logs/meta1:/logs
networks:
- nebula-net
restart: on-failure
cap_add:
- SYS_PTRACE

metad2:
image: vesoft/nebula-metad:v2.5.0
environment:
USER: root
TZ: “${TZ}”
command:
- --meta_server_addrs=metad0:9559,metad1:9559,metad2:9559
- --local_ip=metad2
- --ws_ip=metad2
- --port=9559
- --ws_http_port=19559
- --data_path=/data/meta
- --log_dir=/logs
- --v=0
- --minloglevel=0
healthcheck:
test: [“CMD”, “curl”, “-sf”, “http://metad2:19559/status”]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
ports:
- 9559
- 19559
- 19560
volumes:
- ./data/meta2:/data/meta
- ./logs/meta2:/logs
networks:
- nebula-net
restart: on-failure
cap_add:
- SYS_PTRACE

storaged0:
image: vesoft/nebula-storaged:v2.5.0
environment:
USER: root
TZ: “${TZ}”
command:
- --meta_server_addrs=metad0:9559,metad1:9559,metad2:9559
- --local_ip=storaged0
- --ws_ip=storaged0
- --port=9779
- --ws_http_port=19779
- --data_path=/data/storage
- --log_dir=/logs
- --v=0
- --minloglevel=0
depends_on:
- metad0
- metad1
- metad2
healthcheck:
test: [“CMD”, “curl”, “-sf”, “http://storaged0:19779/status”]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
ports:
- 9779
- 19779
- 19780
volumes:
- ./data/storage0:/data/storage
- ./logs/storage0:/logs
networks:
- nebula-net
restart: on-failure
cap_add:
- SYS_PTRACE

storaged1:
image: vesoft/nebula-storaged:v2.5.0
environment:
USER: root
TZ: “${TZ}”
command:
- --meta_server_addrs=metad0:9559,metad1:9559,metad2:9559
- --local_ip=storaged1
- --ws_ip=storaged1
- --port=9779
- --ws_http_port=19779
- --data_path=/data/storage
- --log_dir=/logs
- --v=0
- --minloglevel=0
depends_on:
- metad0
- metad1
- metad2
healthcheck:
test: [“CMD”, “curl”, “-sf”, “http://storaged1:19779/status”]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
ports:
- 9779
- 19779
- 19780
volumes:
- ./data/storage1:/data/storage
- ./logs/storage1:/logs
networks:
- nebula-net
restart: on-failure
cap_add:
- SYS_PTRACE

storaged2:
image: vesoft/nebula-storaged:v2.5.0
environment:
USER: root
TZ: “${TZ}”
command:
- --meta_server_addrs=metad0:9559,metad1:9559,metad2:9559
- --local_ip=storaged2
- --ws_ip=storaged2
- --port=9779
- --ws_http_port=19779
- --data_path=/data/storage
- --log_dir=/logs
- --v=0
- --minloglevel=0
depends_on:
- metad0
- metad1
- metad2
healthcheck:
test: [“CMD”, “curl”, “-sf”, “http://storaged2:19779/status”]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
ports:
- 9779
- 19779
- 19780
volumes:
- ./data/storage2:/data/storage
- ./logs/storage2:/logs
networks:
- nebula-net
restart: on-failure
cap_add:
- SYS_PTRACE

graphd:
image: vesoft/nebula-graphd:v2.5.0
environment:
USER: root
TZ: “${TZ}”
command:
- --meta_server_addrs=metad0:9559,metad1:9559,metad2:9559
- --port=9669
- --local_ip=graphd
- --ws_ip=graphd
- --ws_http_port=19669
- --log_dir=/logs
- --v=0
- --minloglevel=0
depends_on:
- storaged0
- storaged1
- storaged2
healthcheck:
test: [“CMD”, “curl”, “-sf”, “http://graphd:19669/status”]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
ports:
- “9669:9669”
- 19669
- 19670
volumes:
- ./logs/graph:/logs
networks:
- nebula-net
restart: on-failure
cap_add:
- SYS_PTRACE

graphd1:
image: vesoft/nebula-graphd:v2.5.0
environment:
USER: root
TZ: “${TZ}”
command:
- --meta_server_addrs=metad0:9559,metad1:9559,metad2:9559
- --port=9669
- --local_ip=graphd1
- --ws_ip=graphd1
- --ws_http_port=19669
- --log_dir=/logs
- --v=0
- --minloglevel=0
depends_on:
- storaged0
- storaged1
- storaged2
healthcheck:
test: [“CMD”, “curl”, “-sf”, “http://graphd1:19669/status”]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
ports:
- 9669
- 19669
- 19670
volumes:
- ./logs/graph1:/logs
networks:
- nebula-net
restart: on-failure
cap_add:
- SYS_PTRACE

graphd2:
image: vesoft/nebula-graphd:v2.5.0
environment:
USER: root
TZ: “${TZ}”
command:
- --meta_server_addrs=metad0:9559,metad1:9559,metad2:9559
- --port=9669
- --local_ip=graphd2
- --ws_ip=graphd2
- --ws_http_port=19669
- --log_dir=/logs
- --v=0
- --minloglevel=0
depends_on:
- storaged0
- storaged1
- storaged2
healthcheck:
test: [“CMD”, “curl”, “-sf”, “http://graphd2:19669/status”]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
ports:
- 9669
- 19669
- 19670
volumes:
- ./logs/graph2:/logs
networks:
- nebula-net
restart: on-failure
cap_add:
- SYS_PTRACE

networks:
nebula-net:

启动是以 docker-compose up 的指令启动的,还是 docker run 来启动的呢,会不会是端口号没有暴露。这个报错是 HTTP gateway 后面引用的 go client 客户端报的错。应该和 gateway 本身没有什么关系。还可以检查下防火墙有没有关闭

我每次啓动都跑了这两行
docker-compose up -d

docker run --rm -ti --network nebula-docker-compose_nebula-net --entrypoint=/bin/sh vesoft/nebula-console:v2.5.0

gateway 和 这个 nebula 是部署在同一台机器上的吗 ? 还是有用虚拟机之类的。你在 address 里填 127.0.0.1 看可不可以。以及 telnet 本机 ip + 9669 看能不能调通

嗯对是同一台机器,没有用虚拟机,我试了telnet,好像可以连上,但是在curl里面的address改成127.0.0.1了还是不行:

telnet:

image

感觉是网络没通的问题,用nebula-console连接是否正常呢?docker-compose.yml的配置有改过么?

docker-compose.yaml我没改过,nebula-console使用看起來也正常

另外api/db/disconnect连接都没问题,就是api/db/connect老是报错

您好,能 docker network ls 下么?看看您的 nebula graph 的 compose 的 docker 网络名字

嗯嗯,好的

image

我缕一下哈

  • 您是在 windows下自己编译的 http-gateway,在裸机上跑起来,配置的 0.0.0.0:8080 对么?
  • 同时,nebula 是用 docker-compose 拉起来的。

如果是这样的话,172.20.10.3 这个地址是其中一个 GraphD 所在的容器的地址,这个地址在裸机上应该是不可达的。您有两个方法:

  1. http-gateway 在一个容器里运行,并且容器跑在 --network nebula-docker-compose_nebula-net 这个容器网络里

  2. http-gateway 还在裸机\windows 上跑,address 给的需要是外部的地址

curl -i -X POST \
    -d ‘{“username”:“root”,“password”:“password”,“address”:“<host_ip>”,“port”:9669}’ \
    http://127.0.0.1:8080/api/db/connect

<host_ip> 可以在windows 下 ipconfig 看物理网卡的那个地址

我的http-gateway使用的是Nebula Graph官网提供的那个http client的github的文件夹 https://github.com/vesoft-inc/nebula-http-gateway;第二个方法我之前跑的时候结果也是报错欸,第一个方法我不太清楚怎么操作

ipconfig:

网络我现在用的不是同一个了,我又把docker-compose跑过了一遍,nebula console也能正常使用,但是还是提示我找不到host

第二个方法的结果:

后端情况:

好滴好滴,那咱们先弄第二个方法哈~~
我之前忘记了考虑 WSL 的问题。

您的 docker 是跑在 WSL1或者2 里的对么?还是 Docker Desktop ?
您的 nebula-http-gateway 编译的二进制是运行在 native windows里还是 WSL1 或者2 里呢?

这几种组合的情况会造成 docker compose 拉起来的 nebula 没有listen在物理网卡的 9669 上,需要试试 WSL 的地址,用console(非 container里的)可以更快的去试出来:

  • 如果 nebula-http-gateway 是跑在 native windows 上的话,等价的最小验证方法是去下载 windows 的 console 来模拟 address+port 访问,如果能通过的话 http-gateway应该就也能访问了
  • 如果 http-gateway 跑在 WSL 里的话,类似,也在 WSL 里用 Linux nebula console 去验证

console 二进制:https://github.com/vesoft-inc/nebula-console/releases

2 个赞

我都是打开了Docker Desktop才跑docker-compose up -d的,那个nebula-http-gateway的话我都是用git bash来啓动的

WSL我不太熟悉,我跑wsl --list --verbose的话结果是这样的

image

你说的用console来模拟address+port访问是指连接nebula console吗?nebula console的话我连接好像没问题

好的好的,windows console 可连说明从 windows 上 10.176.161.237:9669能访达 graphD 里边
现在看是在 git bash 之中的 golang 环境里启动的 http-gw 却不能访达 10.176.161.237:9669

导致

curl -i -X POST \
    -d '{"username":"root","password":"password","address":"10.176.161.237","port":9669}' \
    http://127.0.0.1:8080/api/db/connect

依然不行,可能是这几种层(git bash 是一个win上的Linux兼容层;docker desktop 也是有一个虚机和虚拟网络)混合的问题(也请先排除您这里边有全角引号),不行的话先不管他

我们试试前边提到的第一种方法:

git clone https://github.com/vesoft-inc/nebula-http-gateway
cd nebula-http-gateway/
docker build -t http-gateway-dev .

docker run --rm -d \
    --name dev-nebula-http-gateway \
    --network nebula-docker-compose_nebula-net \
    -p 8080:8080 \
    http-gateway-dev

docker ps | grep dev-nebula-http-gateway

然后验证这个容器可以 ping 通 graphd,比如我的这个是

docker exec -it dev-nebula-http-gateway ping 172.21.0.10 -c 1
PING 172.21.0.10 (172.21.0.10): 56 data bytes
64 bytes from 172.21.0.10: seq=0 ttl=64 time=0.075 ms

然后就可以试一下了

curl -i -X POST \
    -d '{"username":"root","password":"password","address":"172.21.0.10","port":9669}' \
    http://127.0.0.1:8080/api/db/connect

我的例子


$ docker ps
CONTAINER ID   IMAGE                           COMMAND                  CREATED              STATUS                PORTS                                                                                                                                                                NAMES
a825c6aeea0b   http-gateway-dev                "./nebula-http-gatew…"   About a minute ago   Up About a minute     0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                                                                                                                            dev-nebula-http-gateway


$ curl -i -X POST \
>     -d '{"username":"root","password":"password","address":"172.21.0.10","port":9669}' \
>     http://127.0.0.1:8080/api/db/connect
HTTP/1.1 200 OK
Content-Length: 100
Content-Type: application/json; charset=utf-8
Server: beegoServer:1.12.3
Set-Cookie: nsid=2c70f6556c56cf6b23bbe7bb0b3be751; Path=/; HttpOnly; SameSite
Set-Cookie: Secure=true; Path=/
Set-Cookie: SameSite=None; Path=/
Date: Thu, 23 Sep 2021 14:00:41 GMT

{
  "code": 0,
  "data": "13b2001d-3751-4d5f-b8d0-4be3b330c978",
  "message": "Login successfully"
2 个赞

我用你的方法了,这回它没有提示no such host了,但是现在提示connection refused :joy:。下面是我运行的结果,这次我是全用git bash来跑的

用172 的地址呢?在一个 docker network 里 是ok的

另外引号是英文半角的对吧?