Metabase 部署与实践:从测试环境到生产环境的完整指南

该文章已生成可运行项目,

在这里插入图片描述

本文介绍了开源 BI 工具 Metabase 的功能特点、优势与不足,并结合实际经验,演示了如何通过 Docker 快速部署测试环境、如何进行数据持久化配置,以及在生产环境下如何结合 PostgreSQL、Nginx 进行高可用、安全的部署。文章还分析了 Metabase 在 CPU、内存、磁盘等资源上的消耗,并给出了官方推荐的硬件配置和部署实践,帮助读者从入门到上线全面掌握 Metabase 的使用

1. Metabase介绍

Metabase 是一款非常流行的开源商业智能(BI)工具。它的核心设计理念是让数据分析变得简单、快捷。链接到你的数据库,无需任何代码,即使是非技术人员也能够轻松地从数据中获得答案。

1.1 核心特点

  1. 轻松提问
    • 为非技术人员设计:用户无需编写复杂的 SQL 代码,只需通过点击式的图形化界面,选择数据表、筛选条件和汇总方式,就能构建出自己想查询的问题。
    • 为技术人员提供便利:对于数据分析师或开发者,Metabase 也内置了功能强大的 SQL 编辑器,可以直接编写原生 SQL 查询,进行更复杂、更精细的数据分析。
  2. 丰富的可视化
    • 它支持将查询结果快速转换成各种图表,如折线图、柱状图、饼图、地图、漏斗图、数据表格等。
    • 用户可以轻松切换图表类型,找到最适合展示数据的形式。
  3. 仪表盘
    • 用户可以将多个“问题”(即图表)组合到一个仪表盘中,形成一个全面的数据概览。
    • 仪表盘是交互式的,可以添加筛选器(如时间范围、用户类型、国家/地区等)。当筛选器变化时,整个仪表盘的所有图表都会同步更新,非常适合用于业务监控和数据汇报。
  4. 数据模型
    • 管理员可以对数据库的原始表和字段进行“美化”,比如:
      • 将难懂的字段名(如 auth_user_profiles)重命名为易于理解的名称(如“用户信息”)。
      • 为字段添加注释说明。
      • 隐藏不需要分析的字段。
    • 可以根据现有的字段,添加新的字段,譬如对字符串的一些操作。
  5. 广泛的数据源支持
    • 关系型数据库:MySQL / MariaDB,SQL Server,PostgreSQL
    • 非关系型数据库:MongoDB

1.2 使用优势

  • 开源免费:其社区版是完全开源和免费的,也有付费的企业版,包括一些企业级的特性譬如SSO。
  • 极致易用:用户界面非常直观简洁,上手操作容易,特别适合非技术背景的业务人员。
  • 部署快速:安装和配置过程非常简单,支持容器部署,几分钟内就可以连接到数据库并开始使用。
  • 社区活跃:作为一款热门的开源项目,它拥有一个庞大的全球用户社区,遇到问题时很容易找到解决方案。

1.3 功能局限

  • 高级可视化能力有限:与 Tableau 或 Power BI 等企业级付费 BI 工具相比,Metabase 在图表的高度自定义和复杂可视化方面稍显逊色。
  • ETL 功能较弱:它主要是一个查询和展示工具,对于复杂的数据清洗、转换和整合(ETL)能力较弱。譬如使用Python将原始数据进行清洗和转换并存入到数据库中。
  • 超大规模数据性能:其性能在很大程度上依赖于底层数据库的性能。在处理极大规模数据集时,可能不如一些专门为大数据优化的商业 BI 平台。

2. 测试环境部署

老规矩我们还是使用Docker进行部署。
在这里插入图片描述

2.1 快速启动(最简单的 Docker 部署)

直接拉取镜像并启动容器。容器默认监听3000端口。启动有点慢,稍等一会儿才能使用。

docker pull metabase/metabase:latest

docker run -d -p 3000:3000 --name metabase metabase/metabase

这个只适用于简单感受下Metabase的使用。最初为了简单我就直接使用的这种方法,但是每次重建容器,所有的配置参数,包括数据库,仪表盘,问题什么的就都没有了。

Metabase内置了H2数据库,它使用底层文件系统存放应用数据。由于我们并没有做数据持久化,所以每次重建容器,数据都会丢失。

2.2 数据持久化与专用网络

可以将Metabase的数据和数据库目录进行持久化。我还创建了一个Metabase的网络,将别的应用的数据库也加入到这个网络中。因为一般数据库(容器内)不直接对外访问,通过这个专用网络,Metabase就可以链接到相应的数据库了。

services:
  metabase:
    image: metabase/metabase:latest
    container_name: metabase
    hostname: metabase
    volumes:
      - ./metabase/metabase-data:/metabase-data
      - ./metabase/metabase.db:/metabase.db
    restart: always
    ports:
      - "3000:3000"
    networks:
      - metabase_network
        
networks:
  metabase_network:
    driver: bridge

2.3 资源消耗分析

基于最简单的部署方式,实际的资源消耗如下:
在这里插入图片描述

2.3.1 CPU 占用情况

Metabase 只是生成 SQL 并将查询任务发送给数据库。真正的数据计算压力主要在源数据库上

  • 查询执行:当用户运行一个复杂的查询(尤其是有多层聚合和计算的)时,CPU 会短暂飙升。
  • 数据同步:Metabase 会定期扫描您连接的数据库,同步表结构和元数据,这个过程会消耗 CPU。
  • 仪表盘渲染:同时加载一个包含许多图表的复杂仪表盘时,CPU 会有明显占用。

2.3.2 - 内存需求

内存是影响 Metabase 性能和稳定性的最重要因素。官方建议至少需要 2GB RAM 才能比较流畅地运行。对于生产环境,4GB RAM 是一个更安全的起点。

  • 运行应用:Metabase 是一个 Java 应用程序,Java 虚拟机(JVM)本身就需要一定的基础内存来运行。在测试环境下占用了1.1G的内存。
  • 处理请求:每个用户的查询、图表加载和仪表盘刷新都会消耗内存。并发用户越多,内存需求越大。
  • 结果缓存:Metabase 会将查询结果缓存到内存中,以加快后续访问速度。缓存的图表越多、数据量越大,占用的内存就越多。

2.3.3 磁盘空间

磁盘空间通常是最不成问题的资源。Metabase不会在自己的服务器上存储业务数据。它只是一个查询和展示工具。磁盘空间的消耗主要包括,应用本身,H2数据库文件(用于存储用户信息、问题、仪表盘、设置等)以及一些日志文件。

3. 生产环境部署

官方建议使用单独的关系型数据库来专门作为应用数据库,官方例子都是使用PostgreSQL。

3.1 硬件资源推荐

  • Metabase应用服务器: 起始是1核1G的配置,每多20个并发用户增加1核2G的硬件资源。
  • Metabase应用数据库服务器:起始是1核2G的配置,以PostgreSQL为例,每多40个并发用户增加1核1G的硬件资源。

3.2 官方 Docker Compose 配置

详情见 Running Metabase on Docker

services:
  metabase:
    image: metabase/metabase:latest
    container_name: metabase
    hostname: metabase
    volumes:
      - /dev/urandom:/dev/random:ro
    ports:
      - 3000:3000
    environment:
      MB_DB_TYPE: postgres
      MB_DB_DBNAME: metabaseappdb
      MB_DB_PORT: 5432
      MB_DB_USER: metabase
      MB_DB_PASS: mysecretpassword
      MB_DB_HOST: postgres
    networks:
      - metanet1
    healthcheck:
      test: curl --fail -I http://localhost:3000/api/health || exit 1
      interval: 15s
      timeout: 5s
      retries: 5
  postgres:
    image: postgres:latest
    container_name: postgres
    hostname: postgres
    environment:
      POSTGRES_USER: metabase
      POSTGRES_DB: metabaseappdb
      POSTGRES_PASSWORD: mysecretpassword
    networks:
      - metanet1
networks:
  metanet1:
    driver: bridge

3.3 数据库连接池优化

默认Metabase的连接池设置为15个连接。Metabase为每个数据库,包括应用数据库,管理一个这样的连接池。可以通过环境变量MB_APPLICATION_DB_MAX_CONNECTION_POOL_SIZE来更改每个连接池的数量。但是要保证有充足的内存,不然Metabase会将连接放进队列,直到有空余的内存。

Metabase建议使用负载均衡器来负载请求到不同的Metabase实例上。

3.4 HTTPS 部署方式

如果是直接使用Metabase来作为处理HTTPS流量的话,请参考官方文档Using HTTPS with Metabase

export MB_JETTY_SSL="true"
export MB_JETTY_SSL_PORT="8443"
export MB_JETTY_SSL_KEYSTORE="path/to/keystore.jks" # replace this value with your own
export MB_JETTY_SSL_KEYSTORE_PASSWORD="storepass" # replace this value with your own
java --add-opens java.base/java.nio=ALL-UNNAMED -jar metabase.jar

参考Java Keytool Essentials: Working with Java Keystores 来生成Java Keystore。在Metabase容器内部是集成了keytool这个工具的。

在这里插入图片描述

我是没有使用这个方法的,因为太麻烦了。官方也不推荐这么做,官方推荐使用的是负载均衡器来做TLS终结。

3.5 使用 Nginx 作为反向代理

在这里插入图片描述

我还是Nginx来代理Metabase的请求,在内网通过端口来区分服务。一个容器网络连接到Nginx,另一个网络用来放各种数据库,包括Metabase的应用数据库。

完整的Metabase的Docker Compose文件如下:

services:
  metabase:
    image: metabase/metabase:latest
    container_name: metabase
    hostname: metabase
    volumes:
      - /dev/urandom:/dev/random:ro
    expose:
      - 3000
    environment:
      MB_DB_TYPE: postgres
      MB_DB_DBNAME: metabaseappdb
      MB_DB_PORT: 5432
      MB_DB_USER: metabase
      MB_DB_PASS: cl52JuiyUSR71kaq
      MB_DB_HOST: postgres
    networks:
      - database-pool
      - nginx-reverse-proxy
    healthcheck:
      test: curl --fail -I http://localhost:3000/api/health || exit 1
      interval: 15s
      timeout: 5s
      retries: 5

  postgres:
    image: postgres:latest
    container_name: postgres
    hostname: postgres
    environment:
      POSTGRES_USER: metabase
      POSTGRES_DB: metabaseappdb
      POSTGRES_PASSWORD: cl52JuiyUSR71kaq
    networks:
      - database-pool

networks:
  database-pool:
     external: true
  nginx-reverse-proxy:
     external: true

Nginx的配置文件也很简单。

server {
    listen 8008 ssl;
    server_name 10.10.10.10;

    ssl_certificate /etc/nginx/certs/int.crt;
    ssl_certificate_key /etc/nginx/certs/int.key;

    location / {
        proxy_pass http://metabase:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

这样我就可以通过https://10.10.10.10:8008来访问Metabase了。

在这里插入图片描述

在设置完管理员账户后,需要连接到数据库。当然也可以使用自带的demo的H2数据库来测试一下,稍后再添加生产数据库。
在这里插入图片描述

📚 延伸阅读

更多内容持续更新于我的博客:https://www.zenseek.site

本文章已经生成可运行项目
1、 metabase部署启用 (1) 在linux里用docker启用metabase(略) (2) 在Windows10里用java jar 运行Metabase 1) 下载Metabase jar,在官网下载后缀jar的文件包,建议放在D盘,后面power shell 切换到D盘方便; 2) 下载java,我安装的最新版本jdk-13_windows-x64_bin,不像老版本还需要装jre,按照默认目录一直next安装就好; 3) Window10配置java环境变量:在环境变量里的系统变量  新建变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk-13(根据自己的jdk安装目录);  新建变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar; (注意前后的符号,这句可通用,都一样);  找到系统变量里的path:分两行添加:%JAVA_HOME%\bin和%JAVA_HOME%\jre\bin(Windows10会自动区分每一个,所以不像之前的要写在一起) (3) 在cmd里输入java;javac;java -version 看是否配置成功; (4) Metabase的启动,在控制台中(例如:PowerShell),输入指令:java -jar metabase.jar,会加载一段时间,最后会出现Metabase Initialization COMPLETE;然后就可以在浏览器访问localhost:3000。 (5) 第一次启动会配置应用程序数据库,我是mysql,用的root用户和密码123456,第一个name随便起,下面会让填数据库的名字,Host:localhost;Port:3306;这两个是统一一样的。 (6) 注:第二次再用power shell 启动metabase的时候,仍把目录切换到metabase.jar所在的目录,我这里是D盘,不然直接在默认目录输入java -jar metabase.jar会报错:找不到这个metabase.jar。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值