基于Git的工作流程设置
在预演环境中的Metabase创建模型、问题和仪表板,将您的更改提交到仓库,并将这些更改推送到生产环境中的Metabase。
本文将介绍如何使用Metabase的序列化功能来保持预演和生产环境中的Metabase同步。
使用此设置,您可以在预演环境中的Metabase中微调您的问题、模型和仪表板。然后,当您对您的作品满意时,您可以提交这些更改到git仓库,并将这些更改推送到生产环境中的Metabase。
首先,设置您的预演环境中的Metabase
此设置仅适用于预演和生产环境中的自托管Metabase。
我们假设您已经有一个正在运行的生产环境中的Metabase,并且您想设置另一个Metabase来预演问题、模型和仪表板的发展。
在服务器上设置您的预演Metabase,无论是在您的本地服务器上,还是通过您首选的云提供商。预演环境中的Metabase必须与生产环境中的Metabase具有相同的版本。每次您升级生产环境中的Metabase时,请记住也要升级预演环境中的Metabase。
为您的预演环境中的Metabase创建应用程序数据库
您还需要为每个要用于预演的额外Metabase设置一个单独的应用程序数据库。使用PostgreSQL来存储所有模型、问题、集合等。(或者如果您的生产环境中的Metabase使用MySQL,则可以使用MySQL)。
您的预演和生产数据库必须具有相同的显示名称、数据库引擎和模式
重复一次,您的预演和生产数据库必须
- 具有相同的类型/引擎。例如,如果一个使用Postgres,另一个也必须使用Postgres。相同的版本是理想的,但通常不是很重要。
- 具有相同的模式。
- 在Metabase中具有相同的显示名称(填写数据库连接详细信息时的显示名称字段,而不是数据库名称本身)。
一旦您输入了连接信息,您需要等待Metabase完成同步。
定义要检查到版本控制中的集合
您可以序列化所有集合,或者(最好是)指定这些集合的子集。想法是仔细考虑要包含哪些集合。在预演环境中的Metabase中拥有用于实验的集合,您可以将其排除在生产环境中,这可能很有用。
如果您只指定了几个集合,我们建议您将这些标记为官方集合。
在预演环境中要避免的事项
- 避免仪表板订阅和警报。这些项是针对个人账户的特定内容,因此Metabase将其排除在序列化之外。
- 在您的预演Metabase中避免模型缓存,因为模型缓存将与您的生产环境中的Metabase冲突。
设置您的Git仓库和CI(您的流程)
一旦您的预演和生产环境中的Metabase启动并运行,您需要创建一个仓库来存储序列化的Metabase内容,Metabase将将其作为一组YAML文件导出。
对于本文,我们将使用Github Actions来自动化在预演和生产环境中的Metabase之间拉取和推送序列化数据。您的CI工具(在这种情况下为GitHub Actions)必须具有对此应用程序数据库的读写访问权限。
您还将添加一个或多个GitHub Actions工作流程YAML文件来自动化序列化过程。可选地,您可以将分支保护打开,以在合并到您的main
分支之前要求PR批准。
有两种基本的预演到生产环境设置
这些设置是
- 预演环境中的Metabase启用同步
- 禁用同步的暂存元数据库
默认情况下,Metabase会在后台运行一些查询来为您提供元数据
- 同步会更新架构。
- 扫描会抽取列值样本以填充过滤器下拉菜单。
- 指纹识别会抽取额外的列值样本以帮助实现智能行为,例如条形图的自动分箱。
如果这些计划中的查询给您的数据库带来了太大的压力(通常只有当您的数据仓库非常大时才会发生),您可以关闭它们。有关Metabase如何更新元数据的更多信息,请参阅我们的文档。
何时使用启用同步的设置
- 您只有一个暂存Metabase。
- 您连接的数据源很小。
- 数据流是单向的,从开发到生产(也就是说,您不需要从生产中提取元数据或内容)。
何时使用禁用同步的设置
- 您拥有(或希望拥有)多个开发Metabase。
- 您的基础数据源很大。
- 数据流是双向的:一个或多个暂存Metabase将推送和拉取到一个生产Metabase。
启用同步的暂存到生产Metabase设置
在此设置中,暂存Metabase启用了同步。此设置是单向的。
- 在一个暂存Metabase中做出更改。
- 将这些更改导出为序列化格式(YAML文件)。
- 将这些YAML文件提交到存储库。
- 将这些更改导入到您的生产Metabase中。
在暂存Metabase中开发内容
在您的暂存Metabase中创建内容:您的模型、问题、仪表板、集合等。
序列化您在暂存Metabase中做出的更改
一旦您对所做的更改感到满意,您将序列化这些更改,以便您可以将其提交到存储库。
要序列化您的更改,您将运行Metabase的export
命令。
例如,如果您仅导出集合2、3和4,则可以运行
java -jar metabase.jar export repo_path --collection 2,3,4 --no-data-model --no-settings
默认情况下,Metabase会排除嵌套集合。要包含嵌套集合,您需要指定它们的ID,就像对任何顶级集合一样。
Metabase将序列化您所做的更改的暂存Metabase。您还可能希望将此命令放入一个bash脚本中,并将其提交到您的存储库,这样您就不需要每次都输入它,并且可以根据您的发展情况进行调整。
将这些更改提交到您的分支。一旦您将工作分支合并到主分支,GitHub工作流程将运行并导入这些更改到您的生产Metabase中。
创建一个GitHub Action工作流程YAML文件
您可以配置您的存储库,以便当您将序列化更改合并到主分支时,工作流程将导入这些序列化更改到您的生产Metabase中。
这里是一个启用同步的工作流程示例,或者您可以在这里跟随。
禁用同步的暂存到生产Metabase设置
在此设置中,一个或多个暂存Metabase已关闭同步。此设置是双向的。
- 导出您的生产数据以更新所有暂存Metabase。
- 将这些序列化的YAML文件更改提交到存储库。
- 将这些更改导入到一个或多个暂存Metabase中。
- 在这些暂存Metabase中开发新内容:仪表板、模型等。
- 从暂存Metabase(s)导出这些更改并提交导出的YAML文件。
- 将内容导入到生产中。
- 如果您正在运行多个Metabase,您需要使用新更改更新它们。
确保您已关闭同步
使用环境变量 MB_DISABLE_SCHEDULER=true
禁用 Metabase 调度器。
禁用调度会将 Metabase 的计划任务关闭,包括同步、指纹识别、扫描以及仪表板订阅、警报和模型缓存。
使用配置文件设置多个预发布环境
您只需要一个预发布环境进行此设置,但如果您希望有多个预发布环境,可以使用 配置文件 来设置多个预发布 Metabase。
从您的生产 Metabase 导出表元数据
由于同步已关闭,您需要从您的生产 Metabase 获取表元数据并将其导入到您的预发布 Metabase。
以下命令将导出您指定的集合,以及表元数据。
java -jar metabase.jar export --collections COLLECTIONS_TO_SYNC --no-settings
如果您想从生产 Metabase 导出所有集合,只需省略 --collections
标志及其参数。
我们建议设置一个工作流程,定期自动导出这些数据。
以下是一个示例工作流程
name: export-datamodel-from-prod
on:
workflow_dispatch:
# schedule:
# - cron: '0 */6 * * *' # Every six hours every day
env:
MB_VERSION: 1.46.4
COLLECTIONS_TO_SYNC: "2,3,4"
MB_DB_TYPE: postgres
MB_DB_DBNAME: metabase
MB_DB_HOST: $
MB_DB_USER: $
MB_DB_PASS: $
jobs:
export_data_model:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Download selected version enterprise jar
run: |
curl -OL https://downloads.metabase.com/enterprise/v$MB_VERSION/metabase.jar
stat ./metabase.jar
- name: Export datamodel and curated collections
run: |
java -jar metabase.jar export $GITHUB_WORKSPACE --collections $COLLECTIONS_TO_SYNC --no-settings
- name: Push Git commit
run: |
git config user.name github-actions
git config user.email [email protected]
git add .
if [[ $(git diff --cached --stat) != '' ]]; then
git commit -m "Automatic export of the table metadata"
git push
fi
将您生产 Metabase 中的内容导入到您的预发布 Metabase(s)
由于 Metabase 同步过程已关闭,您需要从生产环境拉取内容以“同步”您的预发布 Metabase,包括表元数据。如果您运行多个预发布 Metabase,则每次生产表元数据有任何更改,以及您将任何预发布 Metabase 的更改推送到生产 Metabase 时,都需要更新它们。
手动保持 Metabase 同步是不切实际的,所以我们建议创建一个动作,如 这个动作,每隔六小时或每天运行一次,以保持您的预发布 Metabase 与生产 Metabase 的更改同步。
- 克隆您导出生产数据的仓库。
- 切换到包含您预发布 Metabase Metabase jar 的目录。
-
通过运行以下命令导入表元数据和精选集合
java -jar metabase.jar import /PATH/TO/REPO
/PATH/TO/REPO
是您从生产 Metabase 存储序列化数据的位置。此命令将加载更新的表元数据以及该仓库的任何其他更改。您需要每次有人更新本地仓库时都运行此命令。
在您的预发布 Metabase(s) 中开发内容
登录您的预发布 Metabase 并创建您想推送到生产的任何内容:模型、问题、仪表板等。请确保将这些项目保存在您标记为导出到生产 Metabase 的官方集合中。
将您在预发布 Metabase 中所做的更改导出到生产 Metabase
例如,假设您只想导出集合 1、2、3。
java -jar metabase.jar export /PATH/TO/REPO --collection 1,2,3 --no-data-model --no-settings
将 /PATH/TO/REPO
替换为您包含序列化 Metabase 数据的仓库路径。并将 1,2,3
替换为您想导出的集合的 ID 号,每个集合 ID 用逗号分隔。
导出命令将序列化您在开发 Metabase 中所做的更改并将其保存到您的仓库中。
将您的更改提交到一个分支并将该分支合并到主分支。您设置的 GitHub 工作流程将运行并导入这些序列化的更改到生产 Metabase。
关闭同步设置的示例 YAML 工作流程文件
下一步:让仪表板加载更快
如何使您的仪表板加载更快。