数据库路由
数据库路由仅在 Pro 和 Enterprise 计划(包括自托管和 Metabase Cloud)中可用。
通过数据库路由,管理员可以使用一个数据库构建一次问题,然后根据查看问题的用户,该问题将在具有相同数据结构(schema)的不同数据库上运行查询。
数据库路由很有用
-
管理交互式嵌入式设置,其中每个客户都有自己的数据库,具有相同的架构。
数据库路由不能与静态嵌入式一起使用,因为数据库路由要求使用嵌入式问题和仪表板的人拥有 Metabase 帐户。没有 Metabase 帐户,Metabase 无法路由查询,因为它不知道谁正在查看嵌入式内容。
- 在开发和生产数据仓库之间切换。
- 更改特定团队的目标数据仓库。
- 管理与同一数据仓库的单独连接,每个连接具有单独的权限。此连接管理类似于数据库的 连接模拟,这些数据库可防止同一连接更改角色。
数据库路由限制
数据库路由 不支持 ClickHouse、Oracle、Spark SQL 和 Vertica。
不同的数据库有不同的设置,因此您可以在何种数据库之间路由(数据库、模式、数据目录等)将因您使用的数据仓库而略有不同。
- Athena:仅支持在不同连接之间进行路由(例如,不同的存储桶、角色或目录)。
- BigQuery:仅支持在不同项目中的数据库之间进行路由。
- Databricks:当未启用多目录时,您可以路由同一主机上的目录。如果启用了多目录,则只能路由不同主机上的数据库。
数据库路由的工作原理
您像往常一样将 Metabase 连接到数据库。当您为该数据库启用数据库路由时,它将成为处理路由查询到 **目标数据库** 的 **路由数据库**。您将这些目标数据库添加到此路由数据库,每个目标数据库都与您分配给路由数据库的用户属性值相关联。您无需将客户数据库作为单独的连接。
在设置了目标数据库的路由数据库之后,管理员就可以创建查询路由数据库的问题。当其他人登录并查看这些问题时,Metabase 将根据用户的用户属性将查询路由到指定的目标数据库。
设置数据库路由

- 连接到数据库,该数据库具有与所有客户数据库相同的架构。此数据库应为模拟/开发数据库,最好包含一些假数据。此路由数据库的名称将是所有用户看到的名称,无论他们被路由到哪个目标数据库,因此请确保该名称对每个人都有意义。(您可以随时更改显示名称)。
- 连接到此初始数据库(“路由数据库”)后,转到其“数据库路由”部分,然后切换“启用数据库路由”。
- 输入您希望用于确定用户应被路由到哪个数据库的用户属性。
- 在“目标数据库”部分,点击“添加”,然后填写连接详细信息。对于每个目标数据库,您需要指定一个 **slug** - 这个 slug 是 Metabase 将用于与您分配给路由数据库的用户属性进行匹配的值。在运行时,当用户查看基于路由数据库的问题时,Metabase 将检查用户的用户属性。如果该值与此 slug 匹配,问题将查询此目标数据库。
用户属性和数据库路由
为了使数据库路由正常工作,您的用户必须具有 Metabase 可以用来将他们路由到正确的目标数据库的用户属性。
您可以手动添加用户属性,或通过 JWT 或 SAML 通过单点登录 (SSO) 添加。
如果管理员用户缺少用户属性的值,他们将看到路由数据库。您还可以为管理员(或任何用户)显式设置值为 __METABASE_ROUTER__。
如果非管理员用户帐户缺少有效的用户属性值,他们将根本无法查看该问题。
请参阅我们关于用户属性的文档。
测试数据库路由
要查看数据库路由是否正常工作
- 以管理员身份登录。
- 创建一个查询路由数据库的问题。
- 创建一个用户帐户,并添加您与路由数据库关联的用户属性。将值设置为您某个目标数据库的 slug。
- 在私密/隐身标签页中,以该用户身份登录并查看您创建的问题。您应该看到来自与该用户关联的目标数据库的数据,而不是路由数据库中的数据。
使用 API 添加目标数据库
要以编程方式添加目标数据库,您需要一个 API 密钥。
由于每个数据库引擎都有自己的设置,因此我们建议您在 UI 中手动添加目标数据库时使用浏览器开发者工具中的“网络”选项卡。这样您就可以看到 Metabase 生成的请求。
当您点击“添加”时,您将看到一个 POST 请求到 /mirror-database?check_connection_details=true。点击该请求以获取请求的标头和 JSON 负载。
添加新的目标数据库:使用 curl 添加 PostgreSQL 数据库的示例
这是一个 curl 命令,用于将 PostgreSQL 数据库添加为目标数据库。在此,数据库的 slug 由 name 定义(在此情况下为 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 的文档。