將 Amazon 紅移叢集遷移到中國的 AWS 區域 - AWS Prescriptive Guidance

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

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

由靜妍 (AWS) 創作

R 類型 重新定位

:Convironment 生產

技能:資料庫; 移轉

工作負載:所有其他工作負載

AWS 服務:Amazon Redshift

來源:AWS Redshift

目標:AWS Redshift

Summary

此模式提供逐步方法,將 Amazon Redshift 叢集從另一個 AWS 區域遷移到中國的 AWS 區域。

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

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

先決條件和限制

先決條件

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

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

限制

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

Architecture

來源技術堆疊

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

目標技術堆疊

  • AWS 區域中的 Amazon Redshift 叢集

目標架構

Tools

工具

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

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

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

Epics

任務描述所需技能
在來源區域中啟動與設定 EC2 執行個體。

登入 AWS 管理主控台並開啟 Amazon Elastic Compute Cloud (Amazon EC2) 主控台。您目前的區域會顯示在螢幕上方的導覽列中。此區域不可為中國的 AWS 區域。從 Amazon EC2 主控台儀表板選擇 Launch Instance (啟動執行個體),然後建立和設定 EC2 執行個體。重要:確保輸入規則的 EC2 安全群組允許不受限制地從來源機器存取 TCP 連接埠 22。如需如何啟動和設定 EC2 執行個體的指示,請參閱 < 相關資源 > 一節。

DBA,開發人員
安裝 psql 工具。

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

DBA
記錄 Amazon Redshift 叢集詳細資訊。

開啟 Amazon Redshift 主控台,然後在導覽窗格中選擇 Clusters (叢集)。然後從清單中選擇 Amazon Redshift 叢集名稱。在 [內容] 索引標籤的 [資料庫組態] 區段中,記錄 [資料庫名稱] 和 [連接埠]。打開「連接詳細信息」部分並記錄「端點」,這是「端點:<port>/<databasename>」格式。重要:確保輸入規則的 Amazon Redshift 安全群組允許不受限制地從 EC2 執行個體存取 TCP 連接埠 5439。

DBA
將 psql 連接到 Amazon Redshift 叢集。

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

DBA
建立 S3 儲存貯體。

開啟 Amazon S3 主控台,然後建立 S3 儲存貯體來保存從 Amazon Redshift 匯出的檔案。如需如何建立 S3 儲存貯體的說明,請參閱 < 相關資源 > 一節。

DBA,AWS 一般
建立支援卸載資料的 IAM 政策。

開啟 AWS Identity and Access Management (IAM) 主控台,然後選擇「政策」。選擇「建立原則」,然後選擇「JSON」標籤。從「其他資訊」部分複製並貼上 IAM 政策以卸載資料。重要:將「s3 存儲桶名稱」替換為您的 S3 存儲桶的名稱。選擇「檢閱政策」,然後輸入政策的名稱和描述。選擇 Create policy (建立政策)。

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

開啟 IAM 主控台,然後選擇 Roles。選擇「建立角色」,然後在「選取信任實體類型」中選擇「AWS 服務」。為服務選擇「Redshift」,選擇「Redshift — 可自訂」,然後選擇「下一步」。選擇您剛建立的「卸載」政策,然後選擇 Next (下一步)。輸入「角色名稱」,然後選擇「建立角色」。

DBA
將 IAM 角色與 Amazon Redshift 叢集相關聯。

開啟 Amazon Redshift 主控台,然後選擇「管理 IAM 角色」。從下拉式功能表選擇「可用角色」,然後選擇您剛建立的角色。選擇 Apply changes (套用變更)。當「管理 IAM 角色」上 IAM 角色的「狀態」顯示為「同步中」時,您可以執行 UNLOAD 指令。

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

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

DBA
任務描述所需技能
在目標區域中啟動與設定 EC2 執行個體。

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

DBA
記錄 Amazon Redshift 叢集詳細資訊。

開啟 Amazon Redshift 主控台,然後在導覽窗格中選擇 Clusters (叢集)。然後從清單中選擇 Amazon Redshift 叢集名稱。在 [內容] 索引標籤的 [資料庫組態] 區段中,記錄 [資料庫名稱] 和 [連接埠]。打開「連接詳細信息」部分並記錄「端點」,這是「端點:<port>/<databasename>」格式。重要:請確保輸入規則的 Amazon Redshift 安全群組允許不受限制地從 EC2 執行個體存取 TCP 連接埠 5439。

DBA
將 psql 連接到 Amazon Redshift 叢集。

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

DBA
建立 S3 儲存貯體。

打開 Amazon S3 主控台,然後創建一個 S3 存儲桶來保存從 Amazon Redshift 導出的文件。如需說明,以及其他故事,請參閱 < 相關資源 > 一節。

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

開啟 IAM 主控台,然後選擇「政策」。選擇「建立原則」,然後選擇「JSON」標籤。從「其他資訊」部分複製並貼上 IAM 政策以複製資料。重要:將「s3 存儲桶名稱」替換為您的 S3 存儲桶的名稱。選擇「檢閱政策」,輸入政策的名稱和描述。選擇 Create policy (建立政策)。

DBA
建立 IAM 角色以允許 Amazon Redshift 的複製操作。

開啟 IAM 主控台,然後選擇 Roles。選擇「建立角色」,然後在「選取信任實體類型」中選擇「AWS 服務」。為服務選擇「Redshift」,選擇「Redshift — 可自訂」,然後選擇「下一步」。選擇您剛建立的「複製」政策,然後選擇「下一步」。輸入「角色名稱」,然後選擇「建立角色」。

DBA
將 IAM 角色與 Amazon Redshift 叢集相關聯。

開啟 Amazon Redshift 主控台,然後選擇「管理 IAM 角色」。從下拉式功能表選擇「可用角色」,然後選擇您剛建立的角色。選擇 Apply changes (套用變更)。當「管理 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) 執行 DDL 指令碼。這些指令碼將在 Amazon Redshift 叢集中為目標區域建立物件。

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

執行卸載命令,將資料從來源區域中的 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 命令檔