docker部署方式,storage服务配置关于数据存储路径问题

  • nebula 版本:v2-ga
  • 部署方式(分布式 / 单机 / Docker / DBaaS):docker swarm
  • 硬件信息
    • 磁盘( 推荐使用 SSD)SSD
  • 问题的具体描述

docker swarm 部署,docker-stack.yaml直接改的v1的例子,meta/storage/graph的port依然是45500,44500,3699,只把image换成了v2

有以下几个问题:

  1. 在初次启动时,是否有用到.conf文件?docker-stack.yaml和conf文件里的参数值完全不一样

docker-stack.yaml:

nebula-storaged.conf:

  1. 将其改为–local_config=true后,是否需要调整为与docker-stack.yaml里的参数值一致?

  2. 将要在实验用的服务器上装两块ssd作为数据盘,请问要如何更改配置文件中的–data_path参数?
    这里的data_path是容器内的路径还是宿主机目录?/disk1/path, /disk2/path 该怎么改?

我的理解是在编写docker-stack.yaml时,
storaged的volume:
- [宿主机目录1]:/data/storage
- [宿主机目录2]:/data/storage

[宿主机目录]为ssd的mount point的绝对路径(相对路径会自动挂到系统盘/var/lib/docker/volumes/ 下), 假设两块ssd挂载点不一样.

nebula-storaged.conf: --data_path仍为默认值data/storage

  1. 会用到 conf 文件,docker-stack.yaml 里的配置,会覆盖 conf。
  2. 哪个文件的 –local_config?
  3. nebula-storaged.conf 为两个地址 --data_path=/data/storage1,/data/storage2, 然后在 volume 配置:
- [宿主机目录1]:/data/storage1
- [宿主机目录2]:/data/storage2

只会覆盖不会overwrite conf文件对么。所以针对第二个问题,设置local_config=true后需要根据docker-stack.yaml来改conf文件

storaged的配置文件

可能我没说明白,覆盖某个 key
比如你的 conf 是 local_config=false,然后 docker-stack.yaml 里 local_config=true。
那实际启动后,是 true 的配置。但是你进入到容器里,看到的 local_config 文件还是 false。

其实是相当于
bin/nebula-storaged --flagfile xxx/nebula-storaged.conf --local_config=true

覆盖某个key的问题我已经理解了,谢谢。

不好意思,我之前也没有说明白。
我是打算修改配置文件commit成新的image。在配置文件中加入–local-conf=true,把ip之类的的所有参数都改好。

比如,我已经生成了新的镜像nebula-storaged:local-conf
在新的docker-stack.yml里:
image:nebula-storaged:local-conf
env_file:
- ./nebula.env
command:
<由于已经改了conf,这里可以不写参数值了>

请问我这个操作是合理的吗

不太合理,这样以为这如果升级的话,你每次都要重新编译镜像,或者哪天换了其他机器,你也要更新镜像。

比较合理的是,你镜像就用官方的,然后把配置写在 docker-stack.yml,或者把配置写成一个文件,然后 挂到容器里。

这种方法要如何指定以该文件作为启动时的配置文件呢?
假设外部文件挂到/usr/local/nebula/etc/目录下,外部文件叫nebula-storaged.conf.local

在docker-stack.yml中的command: -bin/nebula-storaged --flagfile etc/nebula-storaged.conf.local这样吗?

可以直接挂成 nebula-storaged.conf 不需要 nebula-storaged.conf.local 的呀

docekrfile 里写好了 ENTRYPOINT,如果指定 nebula-storaged.conf.local 要改 enterpoint ,不是特别好

我将外部文件夹挂到etc目录

  storaged0:
    image: vesoft/nebula-storaged:v2-nightly
    env_file:
      - ./nebula.env
#    command:
#      - --meta_server_addrs=192.168.5.100:45500
#      - --local_ip=192.168.5.100
#      - --ws_ip=192.168.5.100
#      - --port=44500
#      - --ws_http_port=12000
#      - --data_path=/data/storage
#      - --log_dir=/logs
#      - --v=0
#      - --minloglevel=0
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
      placement:
        constraints:
          - node.hostname == java-env
    depends_on:
      - metad0
    healthcheck:
      test: ["CMD", "curl", "-f", "http://192.168.5.100:12000/status"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 20s
    ports:
      - target: 12000
        published: 12000
        protocol: tcp
        mode: host
      - target: 12002
        published: 12002
        protocol: tcp
        mode: host
    volumes:
      - data-storaged0:/data/storage
      - logs-storaged0:/logs
      - config-file:/usr/local/nebula/etc
    networks:
      - nebula-net

这是已经修改好的conf (特地将民loglevel改为2,以便后面通过show configs验证是否生效)

启动后容器内看到的conf文件

在console中查看,发现minloglevel依旧是0

你看到容器内的 conf 文件是 minloglevel=2 了,说明已经改成功了。

  • 如果你设置了 local_config, 那这台 storage 的日志级别就是你设置的 2
  • 如果你没设置,那还是用的 meta 里的默认。

不管你那种方式,show configs 看到的就是 meta 的级别,是不会显示 2 的,除非用 update configs 来改。


如果你只是想验证 conf 的配置生效没,可以换一个 --log_dir 的路径,然后验证好了以后,再改回来。(其实你这个配置文件已经是改成功了的,只是 log 级别和 show configs 这个地方不太友好)