数据库路由

数据库路由仅在 ProEnterprise 计划(包括自托管和 Metabase Cloud)中可用。

通过数据库路由,管理员可以使用一个数据库构建一次问题,然后根据查看问题的用户,该问题将在具有相同数据结构(schema)的不同数据库上运行查询。

数据库路由很有用

  • 管理交互式嵌入式设置,其中每个客户都有自己的数据库,具有相同的架构。

    数据库路由不能与静态嵌入式一起使用,因为数据库路由要求使用嵌入式问题和仪表板的人拥有 Metabase 帐户。没有 Metabase 帐户,Metabase 无法路由查询,因为它不知道谁正在查看嵌入式内容。

  • 在开发和生产数据仓库之间切换。
  • 更改特定团队的目标数据仓库。
  • 管理与同一数据仓库的单独连接,每个连接具有单独的权限。此连接管理类似于数据库的 连接模拟,这些数据库可防止同一连接更改角色。

数据库路由限制

数据库路由 不支持 ClickHouse、Oracle、Spark SQL 和 Vertica。

不同的数据库有不同的设置,因此您可以在何种数据库之间路由(数据库、模式、数据目录等)将因您使用的数据仓库而略有不同。

  • Athena:仅支持在不同连接之间进行路由(例如,不同的存储桶、角色或目录)。
  • BigQuery:仅支持在不同项目中的数据库之间进行路由。
  • 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 生成的请求。

当您点击“添加”时,您将看到一个 POST 请求到 /mirror-database?check_connection_details=true。点击该请求以获取请求的标头和 JSON 负载。

添加新的目标数据库:使用 curl 添加 PostgreSQL 数据库的示例

这是一个 curl 命令,用于将 PostgreSQL 数据库添加为目标数据库。在此,数据库的 slugname 定义(在此情况下为 Green PostgreSQL)。

curl 'https://: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 'https://: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 的文档。

这有帮助吗?

感谢您的反馈!
想改进这些文档? 提交一个更改。
© . This site is unofficial and not affiliated with Metabase, Inc.