如何创建跨不同服务器Redshift数据库的视图 可否使用所有权链实现?
Redshift跨独立集群构建联合视图解决方案
所有权链方案可行性判断
所有权链完全无法实现该需求。Redshift的所有权链是同一集群内部的权限传递机制,仅支持同集群下不同数据库、schema、表之间的权限继承,不支持跨独立服务器(即跨不同Redshift集群)的场景。
替代高成本dump导入的优选方案
以下方案均无需做全量数据迁移,操作成本远低于dump导入方案:
- 方案1:跨集群数据共享(官方原生最优方案)
该方案是Redshift官方原生支持的跨集群访问能力,无需数据同步,访问实时性高:- 在存储GA数据的源集群上创建数据共享,将需要用到的GA相关schema、表授权给存储Facebook数据的目标集群
- 在目标集群挂载该数据共享,创建对应的外部映射数据库
- 直接在目标集群编写视图,同时关联本地Facebook表和跨集群共享的GA表即可
核心操作代码示例:
源集群(GA数据侧)执行:
目标集群(Facebook数据侧)执行:-- 创建数据共享 CREATE DATASHARE ga_data_share; -- 授权给目标集群 GRANT USAGE ON DATASHARE ga_data_share TO NAMESPACE '<目标集群命名空间ID>'; -- 添加要共享的对象 ALTER DATASHARE ga_data_share ADD SCHEMA ga_raw; ALTER DATASHARE ga_data_share ADD ALL TABLES IN SCHEMA ga_raw;
适用条件:两个Redshift集群在同一AWS区域,同账号或已完成跨账号授权配置。-- 挂载共享数据创建映射数据库 CREATE DATABASE ga_shared FROM DATASHARE ga_data_share OF NAMESPACE '<源集群命名空间ID>'; -- 构建跨源视图 CREATE VIEW ads_channel_agg_view AS SELECT COALESCE(t1.event_date, t2.report_date) AS stat_date, t1.uv, t2.impression, t2.click_cnt FROM ga_shared.ga_raw.session_daily t1 FULL OUTER JOIN fb_raw.ad_report_daily t2 ON t1.event_date = t2.report_date; - 方案2:Redshift Spectrum联合查询
若两个集群不在同一区域/账号,可将两个集群需要用到的业务表定期UNLOAD到S3对象存储,在任意一个集群上通过Redshift Spectrum创建外部表映射S3上的两份数据,再构建联合视图。该方案支持增量同步,无需全量数据迁移,存储和计算成本较低。 - 方案3:联邦查询
若仅需低频访问跨集群数据,不需要高实时性,可通过Redshift联邦查询功能直接对接另一个Redshift集群的查询接口,在视图中嵌入联邦查询语句拉取所需数据,无需做任何数据同步操作。
内容的提问来源于stack exchange,提问作者loyala
相关产品推荐
相关产品推荐

