在docker 重启后,docker ip地址改变了,规则引擎已创建的资源和规则丢失了,在dashboard中看到是空的.

环境信息

  • EMQX 版本:4.3.11
  • 操作系统及版本:Docker 镜像部署 emqx:4.3.11-alpine-amd64
  • 其他

问题描述

  1. 在dashboard 中,创建一下资源和规则.
  2. 修改网络配置,重启docker 容器,让dockers emqx server node ip 地址变化,使用命令 emqx_ctl mnesia
/opt/emqx/data $ emqx_ctl mnesia
===> System info in version "4.18.1", debug level = none <===
opt_disc. Directory "/opt/emqx/data/mnesia/emqx-server@172.18.0.3" is used.
use fallback at restart = false
running db nodes   = ['emqx-server@172.18.0.3']
stopped db nodes   = []
master node tables = []
remote             = []
ram_copies         = [emqx_channel_registry,emqx_resource_type,emqx_retainer,
                      emqx_route,emqx_routing_node,emqx_rule_action,
                      emqx_shared_subscription,emqx_trie]
disc_copies        = [emqx_activated_alarm,emqx_banned,emqx_deactivated_alarm,
                      emqx_mod_delayed,emqx_resource,emqx_rule,emqx_telemetry,
                      mqtt_admin,mqtt_app,schema]
disc_only_copies   = []
[{'emqx-server@172.18.0.3',disc_copies}] = [schema,emqx_telemetry,emqx_rule,
                                            emqx_resource,emqx_mod_delayed,
                                            mqtt_app,mqtt_admin,emqx_banned,
                                            emqx_activated_alarm,
                                            emqx_deactivated_alarm]
[{'emqx-server@172.18.0.3',ram_copies}] = [emqx_rule_action,
                                           emqx_resource_type,emqx_trie,
                                           emqx_shared_subscription,
                                           emqx_routing_node,emqx_route,
                                           emqx_channel_registry,
                                           emqx_retainer]
172 transactions committed, 2 aborted, 0 restarted, 41 logged to disc
0 held locks, 0 in queue; 0 local transactions, 0 remote
0 transactions waits for other nodes: []
/opt/emqx/data $

发现 Directory “/opt/emqx/data/mnesia/emqx-server@172.18.0.3” 和 running db nodes = [‘emqx-server@172.18.0.3’] 都是依赖 ip.

  1. 在dashboard中,之前创建的数据都没了.

请确认下这个问题是不是设计如此.
如果mnesia数据库是根据ip地址存放文件,这个问题如何解决? ip地址经常变,使用起来非常不方便了.

确实是这样的。Mnesia 数据库依赖于节点名称,即配置中的 node.name = ... 而节点名称中又包含了 IP 地址,所以在IP 地址更改后就无法,重用之前的数据了(当然,你首先得把 /opt/emqx/data 的目录给挂载到外部磁盘上,避免重启过程中的数据丢失)。

解决办法:要么固定 IP, 要么使用主机名作为 emqx 的节点名称,例如 node.name = emqx@some-a-docker-contaner-hostname

参考,这里对 EMQX_HOST, EMQX_NAME, EMQX_NODE_NAME 等配置方法 Docker Hub

这是一个解决办法.
但我按照这个方法 把 /opt/emqx/data 的目录给挂载到外部磁盘上后,发现 dashboard 没启动和报 URL not found 错误. 经过排查发现是新挂载的目录下没有loaded_modules 文件, 并且文件里需要 添加如下的设置:
{emqx_dashboard, true}.
{emqx_management, true}.

这个 把 /opt/emqx/data 的目录给挂载到外部磁盘上后,导致dashboard 不能用的问题,应该是bug ,emqx_dashboard 和 emqx_management 是默认开启的,就不应该出现这个问题.