(4)EII时序栈InfluxDB和Grafana模块数据持久化

发布于:2022-12-13 ⋅ 阅读:(720) ⋅ 点赞:(0)

前言

在先前的一篇文章(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模块数据持久化的方法。


网站公告

今日签到

点亮在社区的每一天
去签到