docker 部署时持久化无效问题

环境信息

  • EMQX 版本:4.4.3 Broker Docker 版本
  • 操作系统及版本:Centos7.9

问题描述: docker 部署的时候,持久化功能问题

  1. 由于 docker 在重启之后 容器IP 可能发生变化,导致Mnesia目录 下 重新生成了节点文件夹,之前的数据(规则、资源)就丢失了,无法找回。
    企业微信截图_16560395545278

  2. 如果是启动的时候指定容器IP,在重启docker 容器之后,容器IP 不会发生变化,但是emqx 节点 xxxx @IP 可能会发生变化,导致数据丢失。(指定容器IP 情况下,节点是否会重新生成不太确定,但是我文件夹下出现同IP 不同节点的文件夹)
    %ML17AXL4IZMO(LW(@90IY

遇到好几次了,使用中可能由于服务器等问题导致docker 重启,就有可能会出现emqx 节点名称改变的情况,Mnesia目录 下同一个容器 生成不同的节点名称,导致数据持久化没有意义,找不到之前的资源和规则数据了。
是否有办法能加载之前的数据,找回规则、资源,否则这个持久化没有意义

可以试试指定EMQX_NAME 环境变量,这样节点名就不会变了。

现有办法可以 重新加载之前的文件夹,找回数据吗?比如docker 重启后新节点变成了 9ed8e048ba14@172.17.0.3, 但是前一次节点名称是 9ed8e048ba14@172.17.0.4,可以通过启动的时候 设置 EMQX_NAME=9ed8e048ba14@172.17.0.4,去加载出这个节点的数据吗?

如果是这样的话,得保证你的容器 IP 也是 172.17.0.4 才行的

PS: 如果你要加上IP,不应该用EMQX_NAME,
要用 EMQX_NODE_NAME

NOTE: All EMQX Configuration in etc/emqx.conf could config by environment. The following list is just an example, not a complete configuration.

Options Default Mapped Description
EMQX_NAME container name none emqx node short name
EMQX_HOST container IP none emqx node host, IP or FQDN

The list is incomplete and may changed with etc/emqx.conf and plugin configuration files. But the mapping rule is similar.

If set EMQX_NAME and EMQX_HOST, and unset EMQX_NODE_NAME, EMQX_NODE_NAME=$EMQX_NAME@$EMQX_HOST.

那我暂时先停止现有 172.17.0.4 的容器,释放出IP,再次启动一个新的容器,docker run 用这三种哪种可行?
1、 指定容器IP ,指定 EMQX_NAME,这个时候会自动拼接节点名称吧?
docker run --name emqx_1 --ip 172.17.0.4 -e EMQX_NAME=9ed8e048ba14 -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 -v /data/emqx/data:/opt/emqx/data -d emqx/emqx:4.4.3
2、 指定容器IP ,指定 EMQX_NODE_NAME,
docker run --name emqx_2 --ip 172.17.0.4 -e EMQX_NODE_NAME=9ed8e048ba14@172.17.0.4 -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 -v /data/emqx/data:/opt/emqx/data -d emqx/emqx:4.4.3
3. 指定 EMQX_NODE_NAME,此时如果未指定IP 是不是有可能存在 容器IP 不是 .4 的情况,如果容器IP 不等于 172.17.0.4,能否加载出来呢?
docker run --name emqx_3 -e EMQX_NODE_NAME=9ed8e048ba14@172.17.0.4 -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 -v /data/emqx/data:/opt/emqx/data -d emqx/emqx:4.4.3

以上几种情况,先提出来咨询下,如果Mnesia目录 下的只是节点名称 和 容器IP无关的话应该是都能加载出之前的数据吧,下午在进行验证下

  • 针对IP。如你上述,设置成固定IP即可。
  • 容器ID。重启restart,容器的ID也不会变。
    也就是说设置固定IP,重启restart前后,不会丢失数据。

这个是有可能会变的,如果IP 都空闲的状态,其他容器先与emqx 启动,可能刚好就占用了之前分配给emqx的IP

这个 EMQX_NODE_NAME 是有规则的吗?我刚了新起一个容器,想试下,如果不和IP 强关联是否可行,也就是 仅设置 EMQX_NODE_NAME 的情况,不指定IP:
docker run --name emqx_4 -e EMQX_NODE_NAME=a048ba15 -p 28081:8081 -p 28083:8083 -p 28883:8883 -p 28084:8084 -p 28085:18083 -v /data/evecom/emqx/etc:/opt/emqx/etc -v /data/evecom/emqx/data:/opt/emqx/data -d emqx/emqx:4.4.3
报错:


,这是否说明emqx 容器节点还是和容器IP 强关联?

以上可以重新读取出之前的Mnesia目录下 9ed8e048ba14@172.17.0.4 的文件,规则 资源恢复正常,
但是第三种 启动的时候,由于容器实际IP 已经变了,不再是 172.17.0.4,导致 进行数据备份导出的时候出现如下错误:
企业微信截图_16560550827594

给我的感觉就是运行的 emqx 数据和 容器IP 是强关联的

你的意思是,你移除了EMQX容器,重新run EMQX项目之前,可能run其他的容器,这时候可能会占用。
但是如果你的EMQX容器一直在且设置了静态IP,只是重启与否,这时候是没有影响的。
目前我们所有的项目的IP地址都是设置的固定的,所以不会出现冲突。

应该是说 如果启动的时候指定IP,则后续重启IP 不变,但是有出现过节点名称 xxxx@IP 前半部分变的情况,为啥出现这种还不确定,所以要想持久化出来的数据不丢失,除了要指定IP 还要指定 EMQX_NODE_NAME,要两个都指定才行