前言
在先前的一篇文章(EII消息总线(EII Message Bus)发布和订阅数据实操)的末尾,笔者留了问题:“当EII软件栈重启时,InfluxDB中的数据,以及Grafana模块中保存的图表数据都不见了,包括Grafana设置的用户密码也重置了。”
这个问题显然带来了不好的体验,这文章,笔者尝试提供一种解决办法。
解决方案
解决思路:我们可以将InfluxDB和Grafana模块产生的数据,挂载到容器外进行保存,这样我们就实现了InfluxDB和Grafana模块数据的持久化。
1. 修改InfluxDB模块
首先,我们来修改InfluxDB模块。
- 打开"InfluxDBConnector/docker-compose.yml"文件,我们可以发现EII已经将"/influxdata"目录(该目录即是用来保存InfluxDB数据的目录)挂载到容器外,但是它却将挂载volume设置成了"临时保存"(tmpfs)的类型。这里我们只需要将"临时保存"(tmpfs)的配置注释掉即可。修改方法参考如下:
volumes:
vol_influxdb_data:
driver: local
# driver_opts:
# type: tmpfs
# device: tmpfs
- 此处修改了volume的配置,需要将原先已生成的volume删除。
$ docker volume rm edgeinsightssoftware_vol_influxdb_data
2. 修改Grafana模块
接着,我们来修改Grafana模块。
通过查看Grafana模块的docker-compose.yml文件,我们可以发现,Grafana模块默认并没有将保存数据的目录挂载到容器外。所以我们要多做一些修改。
- 在"Grafana/Dockerfile"文件中,我们创建一个用来保存数据的目录,并修改该目录的用户属性,以及赋予它相应的权限。参考如下内容,修改"Grafana/Dockerfile"文件的第104-106行:容器内创建"/app/data"目录用于保存Grafana数据。
RUN mkdir /tmp/grafana && mkdir -p /app/data && \
chown -R ${EII_UID}:${EII_UID} /tmp/ ./Grafana/ ${CMAKE_INSTALL_PREFIX} /app/data && \
chmod -R 760 /tmp/ ./Grafana/ ${CMAKE_INSTALL_PREFIX} /app/data
- 在"Grafana/run.sh"文件中,将"GRAFANA_DATA_PATH"和"GF_PATHS_DATA"变量(这两个变量定义了Grafana数据保存的路径),修改为"/app/data"。
# 第26行:
: "${GRAFANA_DATA_PATH:=/tmp/grafana/lib/grafana}"
# 修改为:
: "${GRAFANA_DATA_PATH:=/app/data}"
# 第30行:
export GF_PATHS_DATA="/tmp/grafana/lib/grafana"
# 修改为:
export GF_PATHS_DATA="/app/data"
- 最后,在docker-compose.yml文件中,将目录"/app/data"挂载到容器外即可。修改文件"Grafana/docker-compose.yml",在第70行,添加挂载信息,参考如下(最后一行):
volumes:
- "vol_temp_grafana:/tmp"
- "vol_eii_socket:${SOCKET_DIR}"
- "../Grafana/run.sh:/app/Grafana/run.sh"
- ./Certificates/Grafana:/run/secrets/Grafana:ro
- ./Certificates/rootca/cacert.pem:/run/secrets/rootca/cacert.pem:ro
- "vol_grafana_data:/app/data"
- 然后还需要增加volume的定义。在文件"Grafana/docker-compose.yml"末尾添加"vol_grafana_data"的定义,参考如下:
volumes:
vol_temp_grafana:
driver: local
driver_opts:
type: tmpfs
device: tmpfs
vol_grafana_data:
driver: local
3. 验证解决方案
以上,我们就完成了InfluxDB和Grafana模块所有的修改,接下来,我们验证一下数据是否持久化成功了。
我们仍然通过“温度监控”案例来测试。
- 首先,查看"IEdgeInsights/tools/mqtt/publisher/docker-compose.yml"文件,确认发布的是温度数据。
command: ["--temperature", "10:30"]
- 接着,查看"IEdgeInsights/build/usecases/ts-mqtt.yml"文件,确认其中配置了如下模块:
AppContexts:
- ConfigMgrAgent
- tools/mqtt/broker
- tools/mqtt/publisher
- Telegraf
- InfluxDBConnector
- Grafana
- Kapacitor
- 完成以上确认,我们来启动EII软件栈。首先编译配置文件。
$ cd IEdgeInsights/build
$ sudo -E python3 builder.py -f usecases/ts-mqtt.yml
- 编译模块docker镜像。(InfluxDB模块我们只修改了docker-compose.yml文件,所以不用重新编译docker镜像,而Grafana模块,我们修改了其中的源码,所以需要重新编译docker镜像)
$ docker-compose -f docker-compose-build.yml build ia_grafana
- 启动EII软件栈。
$ ./eii_start.sh
按照先前文章介绍的方法,进入Grafana界面,创建一个Dashboard,并创建一个图表显示“point_classifier_results”表中的数据。最后,保存该Dashboard(起名为"temperature_monitor")。
关闭EII软件栈。
$ docker-compose down
- 等待1-2分钟,重启EII软件栈。
$ ./eii_start.sh
- 再次进入Grafana界面。
- 可以发现,之前保存的Dashboard还在。
- 进入Dashboard可以发现,1-2分钟之前的数据还保留着,且1-2分钟EII关闭期间没有数据,符合预期。
后记
以上,笔者提供了一种实现EII InfluxDB和Grafana模块数据持久化的方法。