本文介绍了开源 BI 工具 Metabase 的功能特点、优势与不足,并结合实际经验,演示了如何通过 Docker 快速部署测试环境、如何进行数据持久化配置,以及在生产环境下如何结合 PostgreSQL、Nginx 进行高可用、安全的部署。文章还分析了 Metabase 在 CPU、内存、磁盘等资源上的消耗,并给出了官方推荐的硬件配置和部署实践,帮助读者从入门到上线全面掌握 Metabase 的使用
Metabase 是一款非常流行的开源商业智能(BI)工具。它的核心设计理念是让数据分析变得简单、快捷。链接到你的数据库,无需任何代码,即使是非技术人员也能够轻松地从数据中获得答案。
auth_user_profiles
)重命名为易于理解的名称(如“用户信息”)。老规矩我们还是使用Docker进行部署。
直接拉取镜像并启动容器。容器默认监听3000端口。启动有点慢,稍等一会儿才能使用。
bashdocker pull metabase/metabase:latest docker run -d -p 3000:3000 --name metabase metabase/metabase
这个只适用于简单感受下Metabase的使用。最初为了简单我就直接使用的这种方法,但是每次重建容器,所有的配置参数,包括数据库,仪表盘,问题什么的就都没有了。
Metabase内置了H2数据库,它使用底层文件系统存放应用数据。由于我们并没有做数据持久化,所以每次重建容器,数据都会丢失。
可以将Metabase的数据和数据库目录进行持久化。我还创建了一个Metabase的网络,将别的应用的数据库也加入到这个网络中。因为一般数据库(容器内)不直接对外访问,通过这个专用网络,Metabase就可以链接到相应的数据库了。
yamlservices:
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
基于最简单的部署方式,实际的资源消耗如下:
Metabase 只是生成 SQL 并将查询任务发送给数据库。真正的数据计算压力主要在源数据库上
内存是影响 Metabase 性能和稳定性的最重要因素。官方建议至少需要 2GB RAM 才能比较流畅地运行。对于生产环境,4GB RAM 是一个更安全的起点。
磁盘空间通常是最不成问题的资源。Metabase不会在自己的服务器上存储业务数据。它只是一个查询和展示工具。磁盘空间的消耗主要包括,应用本身,H2数据库文件(用于存储用户信息、问题、仪表盘、设置等)以及一些日志文件。
官方建议使用单独的关系型数据库来专门作为应用数据库,官方例子都是使用PostgreSQL。
详情见 Running Metabase on Docker。
yamlservices:
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
默认Metabase的连接池设置为15个连接。Metabase为每个数据库,包括应用数据库,管理一个这样的连接池。可以通过环境变量MB_APPLICATION_DB_MAX_CONNECTION_POOL_SIZE
来更改每个连接池的数量。但是要保证有充足的内存,不然Metabase会将连接放进队列,直到有空余的内存。
Metabase建议使用负载均衡器来负载请求到不同的Metabase实例上。
如果是直接使用Metabase来作为处理HTTPS流量的话,请参考官方文档Using HTTPS with Metabase。
bashexport 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终结。
我还是Nginx来代理Metabase的请求,在内网通过端口来区分服务。一个容器网络连接到Nginx,另一个网络用来放各种数据库,包括Metabase的应用数据库。
完整的Metabase的Docker Compose文件如下:
yamlservices:
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的配置文件也很简单。
bashserver {
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数据库来测试一下,稍后再添加生产数据库。
本文作者:潘晓可
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!