数据库路由
数据库路由仅适用于 Pro 和 Enterprise 计划(包括自托管版和 Metabase 云版)。
借助数据库路由功能,管理员可以使用一个数据库构建一次问题,然后该问题将根据查看者是谁,对其查询在具有相同架构的不同数据库上运行。
数据库路由适用于
- 管理每个客户拥有相同架构的独立数据库的嵌入式设置。
- 在开发和生产数据仓库之间切换。
- 更改特定团队的目标数据仓库。
- 管理到同一数据仓库的独立连接,每个连接具有独立的权限。这种连接管理类似于对于阻止同一连接更改角色的数据库(例如 BigQuery、Athena、Databricks)的连接模拟。
数据库路由的工作原理
您像往常一样将 Metabase 连接到数据库。当您为该数据库启用数据库路由时,它将成为一个路由器数据库——这是将查询路由到目标数据库的主数据库。您将这些目标数据库添加到此路由器数据库中,每个目标数据库都与您分配给路由器数据库的用户属性值相关联。
配置好路由器数据库及其目标数据库后,管理员可以创建查询路由器数据库的问题。当其他人登录并查看这些问题时,Metabase 会将查询路由到由该人员的用户属性指定的目标数据库。
设置数据库路由
- 连接到一个数据库,该数据库具有与您所有客户数据库相同的架构。此数据库应为模拟/开发数据库,最好包含一些虚假数据。此路由器数据库使用的名称将是所有用户看到的名称,无论他们被路由到哪个目标数据库。(您可以随时更改显示名称)。
- 连接到此初始数据库(“路由器数据库”)后,转到其“数据库路由”部分,然后打开启用数据库路由。
- 输入您想要用于确定用户应路由到哪个数据库的用户属性。
- 在目标数据库部分中,点击添加,然后填写连接详情。对于每个目标数据库,您需要指定一个slug——这个 slug 是 Metabase 用于匹配您分配给路由器数据库的用户属性的值。运行时,当用户查看基于路由器数据库构建的问题时,Metabase 将检查该人员的用户属性。如果值与此 slug 匹配,则问题将改为查询此目标数据库。
用户属性和数据库路由
要使数据库路由正常工作,您的用户必须拥有 Metabase 可用于将其路由到正确目标数据库的用户属性。
您可以手动添加用户属性,也可以通过JWT或SAML通过单点登录 (SSO) 添加。
如果管理员用户缺少用户属性的值,他们将看到路由器数据库。您还可以将管理员(或任何用户)的值明确设置为 __METABASE_ROUTER__
。
如果非管理员用户账户缺少用户属性的有效值,他们将根本无法查看问题。
请参阅我们关于用户属性的文档。
测试数据库路由
要查看数据库路由是否正常工作
- 以管理员身份登录。
- 创建一个查询路由器数据库的问题。
- 创建一个用户账户,并添加与您的路由器数据库关联的用户属性。将该值设置为您的某个目标数据库的 slug。
- 在无痕/隐私模式标签页中,以该用户身份登录并查看您创建的问题。您应该看到与该人员用户属性关联的目标数据库中的数据,而不是路由器数据库中的数据。
使用 API 添加目标数据库
要以编程方式添加目标数据库,您需要一个API 密钥。
由于每个数据库引擎都有自己的设置,我们建议您在手动在 UI 中添加目标数据库时,使用浏览器开发者工具中的“网络”选项卡。这样您就可以看到 Metabase 生成的请求。
当您点击添加时,您将看到一个发送到 /mirror-database?check_connection_details=true
的 POST
请求。点击该请求以获取请求头和 JSON 有效负载。
添加新的目标数据库:通过 curl
的 PostgreSQL 示例
这是一个 curl
命令,用于将 PostgreSQL 数据库添加为目标数据库。这里的 slug
由 name
键定义(在此示例中为 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 版本的文档。