数据库路由
数据库路由功能仅在 Pro 和 Enterprise 方案中提供(包括自托管和 Metabase Cloud)。
通过数据库路由,管理员可以使用一个数据库构建一次问题,然后根据查看问题的用户,该问题将在具有相同数据结构(schema)的不同数据库上运行查询。
数据库路由适用于:
- 管理交互式嵌入式分析的场景,其中每个客户都有自己的数据库,且数据结构完全相同。
- 在开发和生产数据仓库之间切换。
- 为特定团队更改目标数据仓库。
- 管理到同一数据仓库的多个独立连接,每个连接具有不同的权限。这种连接管理类似于对那些不允许同一连接更改角色的数据库进行连接模拟。
数据库路由的限制
数据库路由**不支持** ClickHouse、Oracle、Spark SQL 和 Vertica。
不同的数据库有不同的设置,因此您可以在什么之间进行路由(数据库、schema、数据目录等)会根据您使用的数据仓库而略有不同。
- Athena:仅支持在不同连接之间进行路由(例如,不同的存储桶、角色或目录)。
- BigQuery:仅支持在不同项目中的数据库之间进行路由。
- Databricks:当未启用多目录时,您可以在同一主机上的目录之间进行路由。如果启用了多目录,则只能在不同主机上的数据库之间进行路由。
数据库路由如何工作
您可以像往常一样将 Metabase 连接到一个数据库。当您为该数据库启用数据库路由时,它就变成了一个**路由数据库**——即处理将查询路由到**目标数据库**的主数据库。您需要将这些目标数据库添加到此路由数据库中,每个目标数据库都与您分配给该路由数据库的用户属性的值相关联。您不需要将客户的数据库作为单独的连接进行添加。
设置好路由数据库及其目标数据库后,管理员可以创建查询路由数据库的问题。当其他人登录并查看这些问题时,Metabase 将根据用户的用户属性,将查询路由到指定的目标数据库。
设置数据库路由
- 连接到一个数据库,该数据库的*数据结构(schema)与您所有客户的数据库都相同*。这个数据库应该是一个模拟/开发数据库,最好带有一些假数据。用于此路由数据库的名称将是所有用户看到的名称,无论他们被路由到哪个目标数据库,因此请确保该名称对每个人都有意义。(您可以随时更改显示名称)。
- 连接到这个初始数据库(“路由数据库”)后,进入其“数据库路由”部分,并打开**启用数据库路由**的开关。
- 输入您想要用来确定用户应被路由到哪个数据库的用户属性。
- 在**目标数据库**部分,点击**添加**,然后填写连接详细信息。对于每个目标数据库,您需要指定一个**标识符(slug)**——这个标识符是 Metabase 用来与您分配给路由数据库的用户属性进行匹配的值。在运行时,当用户查看基于路由数据库构建的问题时,Metabase 将检查该用户的用户属性。如果值与此标识符匹配,问题将查询此目标数据库。
用户属性和数据库路由
要使数据库路由正常工作,您的用户必须具有一个用户属性,Metabase 可以使用该属性将他们路由到正确的目标数据库。
您可以手动添加用户属性,也可以通过单点登录(SSO)使用 JWT 或 SAML 添加。
如果管理员用户的用户属性没有值,他们将看到路由数据库。您也可以为管理员(或任何用户)明确设置值为 __METABASE_ROUTER__
。
如果非管理员用户帐户的用户属性没有有效值,他们将完全无法查看该问题。
请参阅我们关于用户属性的文档。
测试数据库路由
要查看数据库路由是否正常工作:
- 以管理员身份登录。
- 创建一个查询路由数据库的问题。
- 创建一个用户帐户,并添加您与路由数据库关联的用户属性。将其值设置为您的某个目标数据库的标识符。
- 在隐私/无痕模式的浏览器窗口中,以该用户身份登录并查看您创建的问题。您应该看到来自与该用户属性关联的目标数据库的数据,而不是路由数据库中的数据。
使用 API 添加目标数据库
要以编程方式添加目标数据库,您需要一个 API 密钥。
由于每个数据库引擎都有自己的设置,我们建议您在用户界面中手动添加目标数据库时,使用浏览器开发者工具中的“网络”选项卡。这样您就可以看到 Metabase 生成的请求。
当您点击**添加**时,您会看到一个向 /mirror-database?check_connection_details=true
发送的 POST
请求。点击该请求以获取其请求头和 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 的文档。