一.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的生产数据库。
数据库参数配置说明:
- innodb_large_prefix=ON:该参数默认值为off。在metabase服务初始化的过程中,会对MYSQL数据库进行相应的元数据表创建,并写入相应的数据,会想数据表写入长度较长的id数据等信息,而innodb默认对索引长度有限制,如果不设置此参数,会造成数据写入失败,导致metabase服务初始化失败。
- 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中初始化完成。
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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!