序列化:在Metabase实例间迁移
如何使用Metabase的序列化功能将问题、仪表板、集合、设置等从一个Metabase实例复制到新的Metabase实例。
Metabase序列化
序列化仅在商业版上可用(仅在自托管计划上)。
许多客户在迁移到本地部署的商业版时,需要上载预定义的问题或仪表板,以设置新的Metabase实例或新的数据库连接。本文将介绍如何:
- 创建一组默认的问题和仪表板。
- 导出那些仪表板。
- 将这些仪表板重新导入新实例。
具体来说,我们将使用dump
和load
Metabase中的命令序列化功能执行第2步和第3步,再加上一点手动管理导出的文件。
我们将使用Docker运行我们的Metabase环境,并使用开源PostgresSQL为了我们应用程序数据库。我们不建议使用默认值H2用于生产的数据库(H2随Metabase一起提供,因为它是一个轻量级数据库,使用Metabase很容易让用户启动和运行)
计划
我们将创建一个Metabase实例(我们的原始环境),创建一个仪表板,并将该仪表板加载到一个新的Metabase实例(我们的目标环境)中。计划如下:
- 创建一个名为metanet的专用网络.
- 启动Metabase的两个实例:origin和target.
- 在原始环境中创建仪表板和集合.
- 从源环境转储数据.
- 将源转储加载到目标环境中.
- 验证仪表板和集合是否已加载到目标环境中.
先决条件
你需要Docker安装在您的计算机上。
步骤1-创建专用网络
要创建名为“metanet”的专用网络,请从您选择的终端运行以下命令:
docker network create metanet
您可以确认网络是用以下方式创建的:
docker network ls
网络将有一个本地作用域和一个网桥驱动程序。
第2步-启动Metabase的两个实例
启动两个称为origin
和target
(尽管你可以随意命名这些环境)。请注意,我们使用--rm -d在创建这些Docker容器时,当您停止它们并在后台运行时,它们都会被移除。请随意更改这些标志以修改该行为。
Origin环境
创建Postgres数据库:
docker run --rm -d --name postgres \
-p 5433:5432 \
-e POSTGRES_USER=metabase \
-e POSTGRES_PASSWORD=knockknock \
--network metanet \
postgres:12
创建Metabase源实例,并将其连接到我们刚刚创建的Postgres数据库:
docker run --rm -d --name metabase-origin \
-p 5001:3000 \
-e MB_DB_TYPE=postgres \
-e MB_DB_DBNAME=metabase \
-e MB_DB_PORT=5432 \
-e MB_DB_USER=metabase \
-e MB_DB_PASS=knockknock \
-e MB_DB_HOST=postgres \
--network metanet \
metabase/metabase-enterprise:v1.44.6
您可以检查容器的日志以查看容器的进度:
docker logs metabase-origin
一旦看到包含“Metabase初始化完成”的行,就可以打开浏览器http://localhost:5001
查看Metabase实例。
Target环境
设置目标环境与此类似。在我们的metanet网络上,我们将设置一个Postgres数据库作为我们的应用程序数据库,然后在另一个Docker容器中启动Metabase的另一个实例。
注意以下更改:
- Postgres(5434)和Metabase服务器(5002)的端口
- 实例名称:metabase-origin和metabase-target
应用程序数据库:
docker run --rm -d --name postgres-target \
-p 5434:5432 \
-e POSTGRES_USER=metabase \
-e POSTGRES_PASSWORD=knockknock \
--network metanet postgres:12
Metabase实例:
docker run --rm -d --name metabase-target \
-p 5002:3000 \
-e MB_DB_TYPE=postgres \
-e MB_DB_DBNAME=metabase \
-e MB_DB_PORT=5432 \
-e MB_DB_USER=metabase \
-e MB_DB_PASS=knockknock \
-e MB_DB_HOST=postgres-target \
--network metanet \
metabase/metabase-enterprise:v1.44.6
在我们的Metabase实例完成初始化后,现在应该有两个Metabase环境启动并运行:
- metabase-origin 位于
http://localhost:5001
- metabase-target位于
http://localhost:5002
将用户添加到我们的metabase-origin环境
让我们向metabase-origin实例添加一个管理帐户和两个基本用户。
你可以手动将用户添加到Metabase环境(例如,在Metabase应用程序中),但下面是一个快速bash脚本,它创建一个管理用户(初始用户)和两个基本用户:
#!/bin/sh
ADMIN_EMAIL=${MB_ADMIN_EMAIL:-admin@metabase.local}
ADMIN_PASSWORD=${MB_ADMIN_PASSWORD:-Metapass123}
METABASE_HOST=${MB_HOSTNAME}
METABASE_PORT=${MB_PORT:-3000}
echo "⌚︎ Waiting for Metabase to start"
while (! curl -s -m 5 http://${METABASE_HOST}:${METABASE_PORT}/api/session/properties -o /dev/null); do sleep 5; done
echo "😎 Creating admin user"
SETUP_TOKEN=$(curl -s -m 5 -X GET \
-H "Content-Type: application/json" \
http://${METABASE_HOST}:${METABASE_PORT}/api/session/properties \
| jq -r '.["setup-token"]'
)
MB_TOKEN=$(curl -s -X POST \
-H "Content-type: application/json" \
http://${METABASE_HOST}:${METABASE_PORT}/api/setup \
-d '{
"token": "'${SETUP_TOKEN}'",
"user": {
"email": "'${ADMIN_EMAIL}'",
"first_name": "Metabase",
"last_name": "Admin",
"password": "'${ADMIN_PASSWORD}'"
},
"prefs": {
"allow_tracking": false,
"site_name": "Metawhat"
}
}' | jq -r '.id')
echo -e "\n👥 Creating some basic users: "
curl -s "http://${METABASE_HOST}:${METABASE_PORT}/api/user" \
-H 'Content-Type: application/json' \
-H "X-Metabase-Session: ${MB_TOKEN}" \
-d '{"first_name":"Basic","last_name":"User","email":"basic@somewhere.com","login_attributes":{"region_filter":"WA"},"password":"'${ADMIN_PASSWORD}'"}'
curl -s "http://${METABASE_HOST}:${METABASE_PORT}/api/user" \
-H 'Content-Type: application/json' \
-H "X-Metabase-Session: ${MB_TOKEN}" \
-d '{"first_name":"Basic 2","last_name":"User","email":"basic2@somewhere.com","login_attributes":{"region_filter":"CA"},"password":"'${ADMIN_PASSWORD}'"}'
echo -e "\n👥 Basic users created!"
你需要安装jq以处理此脚本中的JSON。将上述代码另存为create_users.sh,并使其可执行(chmod +x create_users.sh),然后运行:
MB_HOSTNAME=localhost MB_PORT=5001 ./create_users.sh
当您的 metabase-origin实例启动,并且您的用户已创建,打开http://localhost:5001
并以您创建的管理员用户身份登录。用户ID为admin@metabase.local密码是Metapass123.
您应该看到Metabase的一个新实例(图1)。
登录后,激活许可证密钥.
步骤3-在origin环境中创建仪表板和集合
我们需要一些应用程序数据来导出,所以让我们使用包括在Metabase中的示例数据库。或者,让Metabase为我们创建一些仪表板!
如图2所示,在Try These X-Rays Based On Your Data部分,单击带有黄色闪电这说明A look at your Products table。Metabase将为您生成一组问题,您可以将这些问题保存为仪表板。
单击保存此按钮,Metabase将把仪表板及其问题保存在收集有头衔的A look at your Products table.
此集合将保存到名为自动生成的仪表板
。您可以通过单击导航栏左上角的Metabase徽标返回主屏幕来找到此集合。从主页,在我们的分析部分,单击自动生成的仪表板
第节。从那里你应该可以看到收藏品A look at your Products table(图3)。
接下来,创建一个新的集合。你想叫什么都行;我们会用这个令人兴奋的名字默认集合
,并保存到我们的分析收藏。
那我们就把A look at your Products table我们新创建的系列默认集合
.
步骤4-从origin 环境Dump
这是我们实际开始使用Metabase的序列化功能的地方。
由于我们的Metabase源实例设置了一些问题,现在是时候转储这些数据并将其加载到我们的Metabase目标环境中了。这样,我们就不必在目标环境中手动重新创建默认集合。
首先在/tmp
公司
调用的目录Metabase
数据
储存垃圾:
cd /tmp
mkdir metabase_data
接下来,我们将运行dump命令。
docker run --rm --name metabase-dump \
--network metanet \
-e MB_DB_CONNECTION_URI="postgres://postgres:5432/metabase?user=metabase&password=knockknock" \
-v "/tmp/metabase_data:/target" \
metabase/metabase-enterprise:v1.44.6 "dump /target"
此命令创建一个名为metabase dump的临时Metabase实例。此临时Metabase实例将连接到Metabase源环境的Postgres应用程序数据库,并导出环境的数据。
如果一切顺利,几秒钟后您应该会看到一些输出,然后在您的终端中显示一条消息“数据迁移完成”。
为了验证垃圾堆,cd
进入您的目录:/tmp/metabase_data。您应该会看到两个目录和三个YAML文件:
- collections/
- databases/
- dependencies.yaml
- manifest.yaml
- settings.yaml
显示
清单文件包含有关环境的一些基本信息:
serialization-version: 1
metabase-version:
date: '2020-08-19'
tag: v1.36.4
branch: enterprise-release-1.36.x
hash: 0324e9c
设置
设置文件包含许多可在设置新实例时配置的选项。以下是它的内容:
enable-whitelabeling?: null
jwt-enabled: 'false'
ldap-host: null
jwt-attribute-email: null
engines: null
application-colors: '{}'
enable-embedding: 'false'
jwt-shared-secret: null
enable-xrays: 'true'
...
数据库
此目录包含所有元数据已连接数据库的设置。在本例中,我们只包含Metabase中的Sample数据库。
集合
在collections目录中,我们将找到我们设置的数据。这是我们的Default_collection.yaml文件:
description: A default collection that features our default questions.
archived: false
slug: default_collection
color: '#509EE3'
name: Default collection
namespace: null
下面是一个题为Days when Products were added:
enable_embedding: false
visualization_settings:
graph.series_labels:
- number
graph.metrics:
- count
graph.dimensions:
- CREATED_AT
graph.colors:
- '#509EE3'
graph.x_axis.title_text: Created At by day of the month
dataset_query:
type: query
database: /databases/Sample Database
query:
source-table: /databases/Sample Database/schemas/PUBLIC/tables/PRODUCTS
breakout:
- - datetime-field
- - field-id
- /databases/Sample Database/schemas/PUBLIC/tables/PRODUCTS/fields/CREATED_AT
- day-of-month
aggregation:
- - count
name: Days when Products were added
archived: false
collection_position: null
database_id: /databases/Sample Database
embedding_params: null
table_id: /databases/Sample Database/schemas/PUBLIC/tables/PRODUCTS
...
步骤5-Load到target 环境
您需要至少一个管理员帐户加载到我们的Metabase目标,以便上载转储。您可以通过应用程序登录以创建该用户,或者使用我们上面使用的脚本:只需记住更改MB_PORT
到5002
,因为这是我们分配给Metabase目标环境的端口。例如,cd
到您保存create_users.sh 目录中的脚本,然后运行:
MB_HOSTNAME=localhost MB_PORT=5002 ./create_users.sh
我们可以将所有这些设置上载到目标环境中,但是假设我们只想加载默认集合。
让我们复制我们的/tmp/metabase_data目录,以便我们可以保留原始内容并对副本进行更改。
cp -r /tmp/metabase_data /tmp/serialize_load
换上新的/tmp/serialize_load目录。我们要做两个改变:
- 因为每个Metabase实例都包含示例数据库,而且我们没有对元数据进行任何更改,所以让我们删除
databases
目录。从内部/tmp/serialize_load目录,运行rm -r databases. - 另外,我们把
自动生成的仪表板
集合,因为我们只想上传默认集合
:
cd /tmp/serialize_load/collections/root/collections && rm -r Automatically\ Generated\ Dashboards/
要验证更改,可以运行diff
要查看原始序列化的_001目录与将用于加载到Metabase目标环境中的序列化的加载目录之间的更改,请执行以下操作:
diff -r metabase_data serialize_load
您应该看到以下内容:
Only in metabase_data/collections/root/collections: Automatically Generated Dashboards
Only in metabase_data: databases
现在,我们/tmp/serialize_load目录设置后,可以运行load命令将元数据加载到out目标环境metabase-target中。
docker run --rm --name metabase-dump \
--network metanet \
-e MB_DB_CONNECTION_URI="postgres://postgres-target:5432/metabase?user=metabase&password=knockknock" \
-v "/tmp/serialize_load:/target" \
metabase/metabase-enterprise:v1.44.6 "load /target"
步骤6-在目标环境中验证仪表板和集合
现在,如果您登录到目标环境http://localhost:5002
,你应该看看我们的默认集合
准备好了,包含我们的A look at your Products table收藏。
就这样:您已经预装了一个Metabase的新实例,其中包含一个包含大量问题的仪表板的集合!
序列化限制
请注意,序列化转储不包含某些数据:
- 权限设置
- 用户帐户或设置
- 保存的问题的预警
- 个人收藏或者他们的内容
序列化的其他用例
使用序列化功能导出问题和仪表板可以打开一些很酷的可能性,包括:
- 向问题和仪表板添加版本控制。您可以将下载的元数据签入存储库,并通过版本控制软件(如git)管理对该数据的更改。
- 为Metabase设置登台环境。您可以在过渡环境中玩,直到对更改满意为止,然后导出元数据,并将其上载到生产环境。
请试用一下序列化功能,并在我们的在我们的论坛上告诉我们您是如何做到的。