• 注册
    • 登录
    • 版块
    • 热门
    • Metabase官网
    • 社区汉化版
    • 达之云

    Metabase学习教程:系统管理-4 迁移

    Metabase学习教程
    1
    1
    592
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • D
      dazdata 最后由 编辑

      序列化:在Metabase实例间迁移
      如何使用Metabase的序列化功能将问题、仪表板、集合、设置等从一个Metabase实例复制到新的Metabase实例。
      Metabase序列化
      序列化仅在商业版上可用(仅在自托管计划上)。
      许多客户在迁移到本地部署的商业版时,需要上载预定义的问题或仪表板,以设置新的Metabase实例或新的数据库连接。本文将介绍如何:

      1. 创建一组默认的问题和仪表板。
      2. 导出那些仪表板。
      3. 将这些仪表板重新导入新实例。
        具体来说,我们将使用dump和loadMetabase中的命令序列化功能执行第2步和第3步,再加上一点手动管理导出的文件。
        我们将使用Docker运行我们的Metabase环境,并使用开源PostgresSQL为了我们应用程序数据库。我们不建议使用默认值H2用于生产的数据库(H2随Metabase一起提供,因为它是一个轻量级数据库,使用Metabase很容易让用户启动和运行)
        计划
        我们将创建一个Metabase实例(我们的原始环境),创建一个仪表板,并将该仪表板加载到一个新的Metabase实例(我们的目标环境)中。计划如下:
      4. 创建一个名为metanet的专用网络.
      5. 启动Metabase的两个实例:origin和target.
      6. 在原始环境中创建仪表板和集合.
      7. 从源环境转储数据.
      8. 将源转储加载到目标环境中.
      9. 验证仪表板和集合是否已加载到目标环境中.
        先决条件
        你需要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)。
      替代文字
      图1。Metabase的新实例。
      登录后,激活许可证密钥.
      步骤3-在origin环境中创建仪表板和集合
      我们需要一些应用程序数据来导出,所以让我们使用包括在Metabase中的示例数据库。或者,让Metabase为我们创建一些仪表板!
      如图2所示,在Try These X-Rays Based On Your Data部分,单击带有黄色闪电这说明A look at your Products table。Metabase将为您生成一组问题,您可以将这些问题保存为仪表板。
      替代文字
      图2。Metabase包含的示例数据库中Products表的X射线。
      单击保存此按钮,Metabase将把仪表板及其问题保存在收集有头衔的A look at your Products table.
      此集合将保存到名为自动生成的仪表板。您可以通过单击导航栏左上角的Metabase徽标返回主屏幕来找到此集合。从主页,在我们的分析部分,单击自动生成的仪表板第节。从那里你应该可以看到收藏品A look at your Products table(图3)。
      替代文字
      图3.一个名为看看你的产品表.
      接下来,创建一个新的集合。你想叫什么都行;我们会用这个令人兴奋的名字默认集合,并保存到我们的分析收藏。
      替代文字
      图4。创建一个新的集合,名为默认集合.
      那我们就把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目录。我们要做两个改变:
      1. 因为每个Metabase实例都包含示例数据库,而且我们没有对元数据进行任何更改,所以让我们删除databases目录。从内部/tmp/serialize_load目录,运行rm -r databases.
      2. 另外,我们把自动生成的仪表板集合,因为我们只想上传默认集合:
        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设置登台环境。您可以在过渡环境中玩,直到对更改满意为止,然后导出元数据,并将其上载到生产环境。
        请试用一下序列化功能,并在我们的在我们的论坛上告诉我们您是如何做到的。
      1 条回复 最后回复 回复 引用 0
      • First post
        Last post

      Powered by MetabaseCN | 提供专业Metabase培训 | QQ群:799286435 微信:MetabaseCN

      鄂ICP备20010758号