设置基于 Git 的工作流

在暂存 Metabase 中创建模型、问题和仪表盘,将更改提交到存储库,并将这些更改推送到您的生产 Metabase。

序列化功能仅适用于 专业版企业版 方案(包括自托管和 Metabase 云)。

本文将介绍如何使用 Metabase 的 序列化 功能来保持暂存和生产 Metabase 的同步。

通过此设置,您可以在暂存 Metabase 中微调您的问题、模型和仪表盘。然后,当您对工作满意时,可以将这些更改提交到 Git 仓库,并将这些更改推送到您的生产 Metabase。

首先,设置您的暂存 Metabase

此设置仅适用于自托管的 Metabase,无论是暂存还是生产环境。

我们假设您已经有一个正在运行的生产 Metabase,并且您想要设置另一个 Metabase 来暂存问题、模型和仪表盘的开发。

在服务器上设置您的暂存 Metabase,无论是您的本地服务器,还是您首选的云提供商。暂存 Metabase 必须与您的生产 Metabase 版本相同。每次升级生产 Metabase 时,请记住也要升级您的暂存 Metabase。

为您的暂存 Metabase 创建 Metabase 应用程序数据库

您还需要为每个要用于暂存的 Metabase 设置一个单独的 应用程序数据库。使用 PostgreSQL 存储您的所有模型、问题、集合等。(如果您的生产 Metabase 使用 MySQL,则使用 MySQL)。

您的暂存和生产数据库必须共享相同的显示名称、数据库引擎和 schema

重申,您的暂存和生产数据库必须:

  • 是相同的类型/引擎。例如,如果一个是 Postgres,另一个也必须是 Postgres。版本相同是理想的,但通常不重要。
  • 拥有相同的 schema。
  • 在 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(s) 关闭同步

默认情况下,Metabase 会在后台运行一些查询以向您提供元数据

  • **同步**获取更新的 schema。
  • **扫描**获取列值样本以填充筛选器下拉菜单。
  • **指纹识别**对附加列值进行采样,以帮助实现智能行为,例如柱状图的自动分箱。

如果这些计划查询给您的数据库带来太大压力(通常只有在您的数据仓库非常庞大时才会出现这种情况),您可以将其关闭。有关 Metabase 如何更新元数据的更多信息,请查阅我们的文档

何时使用同步**开启**的设置

  • 您有一个暂存 Metabase。
  • 您连接的数据源很小。
  • 数据流是单向的,从开发到生产(即您不需要从生产中拉取元数据或内容)。

何时使用同步**关闭**的设置

  • 您有一个(或想要有)多个开发 Metabase。
  • 您的底层数据源很大。
  • 数据流是双向的:一个或多个暂存 Metabase 向一个生产 Metabase 进行推送和拉取。

Metabase 暂存到生产设置,同步开启

在此设置中,暂存 Metabase 已开启同步。此设置是单向的。

  • 在一个暂存 Metabase 中进行更改。
  • 以序列化格式(YAML 文件)导出这些更改。
  • 将这些 YAML 文件提交到仓库。
  • 将这些更改导入到您的生产 Metabase。

One staging Metabase (with sync on) is used to development content, which you can export, commit to a repo, then import into your production 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,则需要使用新更改更新它们。

One or more staging Metabase(s) (with sync off) is used to development content, which you can export, commit to a repo, then import into your production Metabase. To keep all of the staging Metabases up to date, you

确保您已关闭同步

使用环境变量 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 github-actions@github.com
          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 中的更改保持同步。

  1. 克隆您导出生产数据的仓库。
  2. 进入包含您的暂存 Metabase 的 Metabase jar 文件的目录。
  3. 通过运行以下命令导入表格元数据和精选集合:

    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 文件示例

Git 工作流示例,同步关闭.

下一篇:加快仪表盘速度

如何让您的仪表盘加载更快。

下一篇文章
© . All rights reserved.