BI工具之metabase的应用场景与生产环境下的部署

2023-11-19 11:00:34 浏览数 (2)

一.Metabase介绍

Metabase 是一个开源的数据可视化工具,其引入的question概念使得非技术人员能够轻松地创建和共享自定义数据仪表板。Metabase 同时还支持用户通过简单的拖放界面连接到任何数据源,并使用直观的图表和图表来可视化数据。Metabase 还提供了丰富的分析功能,例如聚合、过滤和分组,使数据能够更加高效便捷的展示出来,便于用户更好的了解数据。

1.Metabase的优点

  • 易用性:Metabase 使用户能够通过简单的拖放界面连接到任何数据源,并使用直观的图表和图表来可视化数据。
  • 灵活性:Metabase 支持多种数据源,包括关系数据库、NoSQL 数据库、云存储和文件系统。
  • 可扩展:Metabase 可以轻松地扩展到满足组织需求的规模。不会像部分BI工具通过付费来解锁用户数量。
  • 开源性:Metabase 是开源的,用户可以根据自身需求对平台进行自定义,且完全免费。

2.Metabase的应用

我们可以通过以下方式对连接的数据源进行查询与可视化。

2.1 question

当我们选择创建问题时,选择数据源之后,就可以通过页面拖拉拽的方式对数据完成可视化。

2.2 SQL查询

当我们需要进行复杂逻辑查询时,页面提供的分析配置可能不能满足很好的需求,此时我们可以通过编写复杂的SQL逻辑进行分析。

2.3仪表板

当我们创建分析任务之后,我们可以将这些分析任务配置在可视化看板中。

二.Metabase生产环境部署

这里我们在部署Metabase时,均采用容器化部署。容器化部署可以做到开箱即用,部署灵活,服务轻量等特点。Metabase自带了H2数据库,所以在部署后我们可以直接对Metabase进行访问。访问地址为localhost:3000。此时,当我们对Metabase服务进行初始化并配置时,数据均持久化在自带的H2数据库中。

1.Metabase容器重启后为何数据会丢失

然而容器总会因为某些原因,发生重启,此时我们持久化在H2数据库中的配置信息,BI报表信息都会丢失。此时当我们再次访问Metabase时就需要重新初始化服务,之前配置的看板,报表的等数据也需要重新配置。

原因:容器的存储空间是独立的,与宿主机的存储空间是分开的。当容器重启时,容器的存储空间会被清空,之前存储在容器中的数据就会丢失。 此时我们就需要对容器配置容器卷,将数据进行持久化。

2.Metabase生产数据库切换

2.1 metabase支持的生产数据库类型

  • postgreSQL,最低版本0.94;
  • MYSQL,最低版本5.7.7,所需设置(默认设置):utf8mb4_unicode_ci排序规则,utf8mb4字符集和innodb_large_prefix=ON
  • MariaDB,最低版本10.2.2,所需设置(默认设置):utf8mb4_unicode_ci排序规则、utf8mb4字符集和innodb_large_prefix=ON

2.2 迁移准备

这里我们选择是MYSQL数据库作为metabase的生产数据库。

数据库参数配置说明:

  1. innodb_large_prefix=ON:该参数默认值为off。在metabase服务初始化的过程中,会对MYSQL数据库进行相应的元数据表创建,并写入相应的数据,会想数据表写入长度较长的id数据等信息,而innodb默认对索引长度有限制,如果不设置此参数,会造成数据写入失败,导致metabase服务初始化失败。
  2. utf8mb4:该字符集为utf8的扩展字符集,utf8字符集无法满足metabase的使用,所以还需要设置db与数据表的字符集。

2.3开始备份迁移

1. 在MYSQL中创建名为metabase的数据库.

代码语言:sql复制
create database metabase;
ALTER DATABASE metabase CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

2. 找到metabase的进程号,并进行kill。

代码语言:shell复制
ps -aux|grep metabase
kill -9 PID

3. 在metabase容器中,找到metabase的安装目录。找到metabase H2数据库自带的数据文件对齐进行备份。

代码语言:shell复制
cp metabase.db.mv.db metabase.db

4. 指定metabase jar包从MYSQL数据库启动,并从H2数据库对数据进行导入,将H2数据导入至MYSQL。

代码语言:javascript复制
java -DMB_DB_TYPE=mysql -DMB_DB_CONNECTION_URI="jdbc:mysql://IP:3306/metabase?user=xxxx&password=xxxxx" -jar /opt/metabase/metabase.jar load-from-h2 metabase.db

启动之后我们就可以在MYSQL数据库中看到相应的metabase元数据表信息。

5.当metabase数据库在MYSQL中初始化完成之后。在dockerfile中,修改启动metabase的启动命令,指定metabase启动时读取MYSQL数据库。

此时我们就不在需要启动命令中添加load-from-h2 metabase.db。因为此时metabase的元数据已经在MYSQL中初始化完成。

代码语言:javascript复制
java -DMB_DB_TYPE=mysql -DMB_DB_CONNECTION_URI="jdbc:mysql://IP:3306/metabase?user=xxxx&password=xxxx" -jar /opt/metabase/metabase.jar

6.删除原有的容器,通过新构建的镜像对metabase服务进行启动。启动后,我们手动重启容器进行验证,发现已经不再有数据丢失的情况。

2.4代理配置

服务启动后,metabase通过IP:3000进行访问。在公网环境下直接暴露IP与端口会有安全隐患。我们可以通过配置Ingress,通过域名代理metabase后端服务地址。通过域名访问,我们还可以在路由层面进行安全验证。提高访问的安全性。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞