数据库路由

数据库路由仅适用于 ProEnterprise 计划(包括自托管版和 Metabase 云版)。

借助数据库路由功能,管理员可以使用一个数据库构建一次问题,然后该问题将根据查看者是谁,对其查询在具有相同架构的不同数据库上运行。

数据库路由适用于

  • 管理每个客户拥有相同架构的独立数据库的嵌入式设置。
  • 在开发和生产数据仓库之间切换。
  • 更改特定团队的目标数据仓库。
  • 管理到同一数据仓库的独立连接,每个连接具有独立的权限。这种连接管理类似于对于阻止同一连接更改角色的数据库(例如 BigQuery、Athena、Databricks)的连接模拟

数据库路由的工作原理

您像往常一样将 Metabase 连接到数据库。当您为该数据库启用数据库路由时,它将成为一个路由器数据库——这是将查询路由到目标数据库的主数据库。您将这些目标数据库添加到此路由器数据库中,每个目标数据库都与您分配给路由器数据库的用户属性值相关联。

配置好路由器数据库及其目标数据库后,管理员可以创建查询路由器数据库的问题。当其他人登录并查看这些问题时,Metabase 会将查询路由到由该人员的用户属性指定的目标数据库。

设置数据库路由

Database routing

  1. 连接到一个数据库,该数据库具有与您所有客户数据库相同的架构。此数据库应为模拟/开发数据库,最好包含一些虚假数据。此路由器数据库使用的名称将是所有用户看到的名称,无论他们被路由到哪个目标数据库。(您可以随时更改显示名称)。
  2. 连接到此初始数据库(“路由器数据库”)后,转到其“数据库路由”部分,然后打开启用数据库路由
  3. 输入您想要用于确定用户应路由到哪个数据库的用户属性。
  4. 目标数据库部分中,点击添加,然后填写连接详情。对于每个目标数据库,您需要指定一个slug——这个 slug 是 Metabase 用于匹配您分配给路由器数据库的用户属性的值。运行时,当用户查看基于路由器数据库构建的问题时,Metabase 将检查该人员的用户属性。如果值与此 slug 匹配,则问题将改为查询此目标数据库。

用户属性和数据库路由

要使数据库路由正常工作,您的用户必须拥有 Metabase 可用于将其路由到正确目标数据库的用户属性。

您可以手动添加用户属性,也可以通过JWTSAML通过单点登录 (SSO) 添加。

如果管理员用户缺少用户属性的值,他们将看到路由器数据库。您还可以将管理员(或任何用户)的值明确设置为 __METABASE_ROUTER__

如果非管理员用户账户缺少用户属性的有效值,他们将根本无法查看问题。

请参阅我们关于用户属性的文档。

测试数据库路由

要查看数据库路由是否正常工作

  1. 以管理员身份登录。
  2. 创建一个查询路由器数据库的问题。
  3. 创建一个用户账户,并添加与您的路由器数据库关联的用户属性。将该值设置为您的某个目标数据库的 slug。
  4. 在无痕/隐私模式标签页中,以该用户身份登录并查看您创建的问题。您应该看到与该人员用户属性关联的目标数据库中的数据,而不是路由器数据库中的数据。

使用 API 添加目标数据库

要以编程方式添加目标数据库,您需要一个API 密钥

由于每个数据库引擎都有自己的设置,我们建议您在手动在 UI 中添加目标数据库时,使用浏览器开发者工具中的“网络”选项卡。这样您就可以看到 Metabase 生成的请求。

当您点击添加时,您将看到一个发送到 /mirror-database?check_connection_details=truePOST 请求。点击该请求以获取请求头和 JSON 有效负载。

添加新的目标数据库:通过 curl 的 PostgreSQL 示例

这是一个 curl 命令,用于将 PostgreSQL 数据库添加为目标数据库。这里的 slugname 键定义(在此示例中为 Green PostgreSQL)。

curl 'http://localhost:3000/api/ee/database-routing/mirror-database?check_connection_details=true' \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'X-Api-Key: mb_CpkoZHvSB5R+P+WsuXWRbdT3WbVphFv/rgMX9UGux/4=' \
  --data '{
  "router_database_id": 2,
  "mirrors": [
    {
     "details": {
        "host": "red-postgres",
        "port": 5432,
        "dbname": "sample",
        "user": "metabase",
        "use-auth-provider": false,
        "password": "metasample123",
        "schema-filters-type": "all",
        "ssl": false,
        "tunnel-enabled": false,
        "destination-database": true
      },
      "name": "Green PostgreSQL",
      "engine": "postgres"
    }
  ]
}'

details 对象将根据数据库的不同而具有不同的键集。

如果您从浏览器“网络”选项卡中获取有效负载,可能会看到其他非必需设置

curl 'http://localhost:3000/api/ee/database-routing/mirror-database?check_connection_details=true' \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'X-Api-Key: mb_CpkoZHvSB5R+P+WsuXWRbdT3WbVphFv/rgMX9UGux/4=' \
  --data '{
  "router_database_id": 2,
  "mirrors": [
    {
      "is_on_demand": false,
      "is_full_sync": true,
      "is_sample": false,
      "cache_ttl": null,
      "refingerprint": null,
      "auto_run_queries": true,
      "schedules": {
        "metadata_sync": {
          "schedule_minute": 14,
          "schedule_day": null,
          "schedule_frame": null,
          "schedule_hour": null,
          "schedule_type": "hourly"
        },
        "cache_field_values": {
          "schedule_minute": 0,
          "schedule_day": null,
          "schedule_frame": null,
          "schedule_hour": 18,
          "schedule_type": "daily"
        }
      },
      "details": {
        "host": "red-postgres",
        "port": 5432,
        "dbname": "sample",
        "user": "metabase",
        "use-auth-provider": false,
        "password": "metasample123",
        "schema-filters-type": "all",
        "ssl": false,
        "tunnel-enabled": false,
        "destination-database": true
      },
      "name": "Red PostgreSQL",
      "engine": "postgres"
    }
  ]
}'

阅读其他Metabase 版本的文档。

© . All rights reserved.