將 Amazon Redshift 叢集遷移到中國的 AWS 區域 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將 Amazon Redshift 叢集遷移到中國的 AWS 區域

由晶燕 (AWS) 創建

R 類型:搬遷

環境:生產

技術:資料庫;移轉

工作負載:所有其他工作

AWS 服務:Amazon Redshift

資料來源:AWS Redshift

目標:AWS Redshift

Summary

此模式提供了一 step-by-step 種將 Amazon Redshift 叢集從另一個 AWS 區域遷移到中國的 AWS 區域的方法。

此模式使用 SQL 命令重新建立所有資料庫物件,並使用 UNLOAD 命令將此資料從 Amazon Redshift 移至來源區域中的亞馬遜簡單儲存服務 (Amazon S3) 儲存貯體。然後,資料會遷移到位於中國 AWS 區域的 S3 儲存貯體。COPY 命令用於從 S3 儲存貯體載入資料,並將其傳輸到目標 Amazon Redshift 叢集。

Amazon Redshift 目前不支援跨區域功能,例如快照複製到中國的 AWS 區域。此模式提供了一種解決該限制的方法。您也可以反轉此模式中的步驟,將資料從中國的 AWS 區域遷移到另一個 AWS 區域。

先決條件和限制

先決條件

  • 中國區域和中國以外 AWS 區域的有效 AWS 帳戶

  • 中國區域和中國以外的 AWS 區域中的現有 Amazon Redshift 叢集

限制

  • 這是離線遷移,這表示來源 Amazon Redshift 叢集無法在遷移期間執行寫入操作。

架構

源, 技術, 堆棧

  • 亞馬遜紅移叢集位於中國以外的 AWS 區域

目標技術堆疊

  • Amazon Redshift 叢集位於中國的 AWS 區域

目標架構

工具

工具

  • Amazon S3 — Amazon Simple Storage Service (Amazon S3) 是一種物件儲存服務,可提供可擴展性、資料可用性、安全性和效能。您可以使用 Amazon S3 存放來自 Amazon Redshift 的資料,也可以將資料從 S3 儲存貯體複製到 Amazon Redshift。

  • Amazon Redshift — Amazon Redshift 是雲端中的全受管 PB 級資料倉儲服務。 

  • psql — psql 是一個基於終端的前端到 PostgreSQL。 

史诗

任務描述所需技能

在來源區域中啟動和設定 EC2 執行個體。

登入 AWS 管理主控台並開啟亞馬遜彈性運算雲端 (Amazon EC2) 主控台。您目前的區域會顯示在畫面頂端的導覽列中。此區域不能是中國的 AWS 區域。從 Amazon EC2 主控台儀表板選擇「啟動執行個體」,然後建立和設定 EC2 執行個體。重要事項:確保輸入規則的 EC2 安全群組允許從來源機器不受限制地存取 TCP 連接埠 22。如需如何啟動和設定 EC2 執行個體的指示,請參閱「相關資源」一節。

DBA, 開發人員

安裝 psql 工具。

下載 PostgreSQL 裝 Amazon Redshift 不提供 psql 工具,它是與 PostgreSQL 一起安裝的。如需有關使用 psql 和安裝 PostgreSQL 工具的詳細資訊,請參閱 < 相關資源 > 一節。

DBA

記錄 Amazon Redshift 叢集詳細資訊。

開啟 Amazon Redshift 主控台,然後在導覽窗格中選擇「叢集」。然後從清單中選擇 Amazon Redshift 群集名稱。在「屬性」選項卡的「數據庫配置」部分中,記錄「數據庫名稱」和「端口」。打開「連接詳細信息」部分並記錄「端點」,這是「端點:<port>/<databasename>」格式。重要事項:確保針對輸入規則的 Amazon Redshift 安全群組允許從 EC2 執行個體不受限制地存取 TCP 連接埠 5439。

DBA

將 psql Connect 到 Amazon Redshift 集群。

<databasename><port>在命令提示字元中,執行「psql-h-<endpoint>U-<userid>d-p」命令來指定連線資訊。在 psql 密碼提示下,輸入「<userid>」使用者的密碼。然後,您就會連線到 Amazon Redshift 叢集,並可以互動方式輸入命令。

DBA

建立 S3 儲存貯體。

開啟 Amazon S3 主控台,然後建立 S3 儲存貯體來存放從 Amazon Redshift 匯出的檔案。如需如何建立 S3 儲存貯體的指示,請參閱「相關資源」一節。

DBA,AWS 一般資訊

建立支援卸載資料的 IAM 政策。

開啟 AWS Identity and Access Management (IAM) 主控台,然後選擇「政策」。選擇「創建策略」,然後選擇「JSON」選項卡。從「其他資訊」部分複製並貼上用於卸載資料的 IAM 政策。重要事項:將「s3_bucket_name」取代為您的 S3 儲存貯體的名稱。選擇 [檢閱原則],然後輸入原則的名稱和說明。選擇「創建策略」。

DBA

建立 IAM 角色以允許 Amazon Redshift 執行卸載操作。

開啟 IAM 主控台,然後選擇「角色」。選擇「建立角色」,然後在「選取受信任實體類型」中選擇「AWS 服務」。為服務選擇「Redshift」,選擇「Redshift-可自定義」,然後選擇「下一步」。選擇您之前創建的「卸載」策略,然後選擇「下一步」。輸入「角色名稱」,然後選擇「建立角色」。

DBA

將 IAM 角色與 Amazon Redshift 叢集建立關聯。

開啟 Amazon Redshift 主控台,然後選擇「管理 IAM 角色」。從下拉菜單中選擇「可用角色」,然後選擇您之前創建的角色。選擇「應用更改」。當「管理 IAM 角色」上 IAM 角色的「狀態」顯示為「同步」時,您可以執行 UNLOAD 命令。

DBA

停止對 Amazon Redshift 叢集的寫入操作。

您必須記住停止對來源 Amazon Redshift 叢集的所有寫入操作,直到遷移完成為止。

DBA
任務描述所需技能

在目標區域中啟動和設定 EC2 執行個體。

登入中國北京或寧夏區域的 AWS 管理主控台。從 Amazon EC2 主控台選擇「啟動執行個體」,然後建立和設定 EC2 執行個體。重要事項:請確保 Amazon EC2 輸入規則的安全群組允許從來源機器不受限制地存取 TCP 連接埠 22。如需如何啟動和設定 EC2 執行個體的進一步指示,請參閱「相關資源」一節。

DBA

記錄 Amazon Redshift 叢集詳細資訊。

開啟 Amazon Redshift 主控台,然後在導覽窗格中選擇「叢集」。然後從清單中選擇 Amazon Redshift 群集名稱。在「屬性」選項卡的「數據庫配置」部分中,記錄「數據庫名稱」和「端口」。打開「連接詳細信息」部分並記錄「端點」,這是「端點:<port>/<databasename>」格式。重要事項:請確定傳入規則的 Amazon Redshift 安全群組允許從 EC2 執行個體不受限制地存取 TCP 連接埠 5439。

DBA

將 psql Connect 到 Amazon Redshift 集群。

<databasename><port>在命令提示字元中,執行「psql-h-<endpoint>U-<userid>d-p」命令來指定連線資訊。在 psql 密碼提示下,輸入「<userid>」使用者的密碼。然後,您就會連線到 Amazon Redshift 叢集,並可以互動方式輸入命令。

DBA

建立 S3 儲存貯體。

開啟 Amazon S3 主控台,然後建立 S3 儲存貯體以保存從 Amazon Redshift 匯出的檔案。如需此和其他故事的說明,請參閱「相關資源」一節。

DBA

建立支援複製資料的 IAM 政策。

開啟 IAM 主控台,然後選擇「政策」。選擇「創建策略」,然後選擇「JSON」選項卡。從「其他資訊」區段複製並貼上用於複製資料的 IAM 政策。重要事項:將「s3_bucket_name」取代為您的 S3 儲存貯體的名稱。選擇 [檢閱策略],輸入策略的名稱和說明。選擇「創建策略」。

DBA

建立 IAM 角色以允許 Amazon Redshift 執行複製操作。

開啟 IAM 主控台,然後選擇「角色」。選擇「建立角色」,然後在「選取受信任實體類型」中選擇「AWS 服務」。為服務選擇「Redshift」,選擇「Redshift-可自定義」,然後選擇「下一步」。選擇您之前創建的「複製」策略,然後選擇「下一步」。輸入「角色名稱」,然後選擇「建立角色」。

DBA

將 IAM 角色與 Amazon Redshift 叢集建立關聯。

開啟 Amazon Redshift 主控台,然後選擇「管理 IAM 角色」。從下拉菜單中選擇「可用角色」,然後選擇您之前創建的角色。選擇「應用更改」。當「管理 IAM 角色」上 IAM 角色的「狀態」顯示為「同步」時,您可以執行「COPY」命令。

DBA
任務描述所需技能

驗證來源 Amazon Redshift 資料表中的資料列。

使用「其他資訊」區段中的指令碼來驗證和記錄來源 Amazon Redshift 表格中的列數。請記住要平均分割卸載和 COPY 腳本的數據。這將提高數據卸載和加載效率,因為每個腳本覆蓋的數據量將是平衡的。

DBA

驗證來源 Amazon Redshift 叢集中的資料庫物件數目。

使用「其他資訊」區段中的指令碼來驗證和記錄來源 Amazon Redshift 叢集中的資料庫、使用者、結構描述、表格、檢視和使用者定義函數 (UDF) 的數量。

DBA

在移轉之前驗證 SQL 陳述式結果。

一些用於數據驗證的 SQL 語句應根據實際的業務和數據情況進行排序。這是為了驗證導入的數據,以確保其一致並正確顯示。

DBA
任務描述所需技能

產生 Amazon Redshift DDL 指令碼。

使用「其他資訊」一節中「查詢 Amazon Redshift 的 SQL 陳述式」區段中的連結,產生資料定義語言 (DDL) 指令碼。這些 DDL 指令碼應包括「建立使用者」、「建立結構描述」、「使用者的結構描述權限」、「建立資料表/檢視」、「使用者的物件權限」和「建立函數」查詢。

DBA

在 Amazon Redshift 叢集中為目標區域建立物件。

在中國的 AWS 區域使用 AWS Command Line Interface (AWS CLI) (AWS CLI) 執行 DDL 指令碼。這些指令碼會在目標區域的 Amazon Redshift 叢集中建立物件。

DBA

將來源 Amazon Redshift 叢集資料卸載到 S3 儲存貯體。

執行 UNLOAD 命令,將來源區域中的 Amazon Redshift 叢集中的資料卸載到 S3 儲存貯體。

DBA, 開發人員

將來源區域 S3 儲存貯體資料傳輸到目標區域 S3 儲存貯體。

將資料從來源區域 S3 儲存貯體傳輸到目標 S3 儲存貯體。由於無法使用「$ aws s3 sync」命令,請確保您使用「相關資源」一節中「將 Amazon S3 資料從 AWS 區域傳輸到中國的 AWS 區域」一文中概述的程序。

開發人員

將資料載入目標 Amazon Redshift 叢集。

在目標區域的 psql 工具中,執行 COPY 命令,將資料從 S3 儲存貯體載入目標 Amazon Redshift 叢集。

DBA
任務描述所需技能

驗證並比較來源和目標資料表中的資料列數目。

驗證並比較來源和目標區域中的表格資料列數,以確保所有資料列都已移轉。

DBA

驗證並比較來源和目標資料庫物件的數目。

驗證並比較來源和目標區域中的所有資料庫物件,以確保所有資料庫物件都已移轉。

DBA

驗證並比較來源和目標區域中的 SQL 命令檔結果。

執行移轉前準備好的 SQL 指令碼。驗證並比較資料,以確保 SQL 結果正確無誤。

DBA

重設目標 Amazon Redshift 叢集中所有使用者的密碼。

遷移完成並驗證所有資料後,您應該重設中國 AWS 區域中 Amazon Redshift 叢集的所有使用者密碼。

DBA

相關資源

其他資訊

卸載資料的 IAM 政策

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::s3_bucket_name"] }, { "Effect": "Allow", "Action": ["s3:GetObject", "s3:DeleteObject"], "Resource": ["arn:aws:s3:::s3_bucket_name/*"] } ] }

複製資料的 IAM 政策

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::s3_bucket_name"] }, { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": ["arn:aws:s3:::s3_bucket_name/*"] } ] }

用於查詢 Amazon Redshift 的 SQL 語句

##Database select * from pg_database where datdba>1; ##User select * from pg_user where usesysid>1; ##Schema SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner" FROM pg_catalog.pg_namespace n WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema' ORDER BY 1; ##Table select count(*) from pg_tables where schemaname not in ('pg_catalog','information_schema'); select schemaname,count(*) from pg_tables where schemaname not in ('pg_catalog','information_schema') group by schemaname order by 1; ##View SELECT n.nspname AS schemaname,c.relname AS viewname,pg_catalog.pg_get_userbyid(c.relowner) as "Owner" FROM pg_catalog.pg_class AS c INNER JOIN pg_catalog.pg_namespace AS n ON c.relnamespace = n.oid WHERE relkind = 'v' and n.nspname not in ('information_schema','pg_catalog'); ##UDF SELECT n.nspname AS schemaname, p.proname AS proname, pg_catalog.pg_get_userbyid(p.proowner) as "Owner" FROM pg_proc p LEFT JOIN pg_namespace n on n.oid = p.pronamespace WHERE p.proowner != 1;

用來產生 DDL 陳述式的 SQL 指令碼