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

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

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

由 Jing Yan 建立 (AWS)

Summary

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

此模式使用 SQL 命令來重新建立所有資料庫物件,並使用 UNLOAD命令將此資料從 Amazon Redshift 移動到來源區域中的 Amazon Simple Storage Service (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 Redshift 叢集

目標架構

AWS 雲端 diagram showing data flow between Amazon Redshift and S3 buckets across two regions.

工具

工具

  • 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 Elastic Compute Cloud (Amazon EC2) 主控台。您目前的區域會顯示在畫面頂端的導覽列中。此區域不能是中國AWS的區域。從 Amazon EC2主控台儀表板中,選擇「啟動執行個體」,然後建立和設定EC2執行個體。重要:確保您的傳入規則EC2的安全群組允許從來源機器無限制存取TCP連接埠 22。如需如何啟動和設定EC2執行個體的指示,請參閱「相關資源」一節。

DBA、開發人員

安裝 psql 工具。

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

DBA

記錄 Amazon Redshift 叢集詳細資訊。

開啟 Amazon Redshift 主控台,然後在導覽窗格中選擇「叢集」。然後從清單中選擇 Amazon Redshift 叢集名稱。在「屬性」索引標籤的「資料庫組態」區段中,記錄「資料庫名稱」和「連接埠」。開啟「連線詳細資訊」區段,並記錄「端點」,其格式為「端點:<連接埠>/<資料庫名稱>」。重要事項:確保您的 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_bucket_name” 取代為您的 S3 儲存貯體名稱。選擇「檢閱政策」,然後輸入政策的名稱和描述。選擇「建立政策」。

DBA

建立IAM角色以允許 Amazon Redshift UNLOAD的操作。

開啟 IAM 主控台,然後選擇「角色」。選擇「建立角色」,然後在「AWS選取信任實體類型」中選擇「服務」。選擇服務的「Redshift」,選擇「Redshift – Customizable」,然後選擇「下一步」。選擇您先前建立的「卸載」政策,然後選擇「下一步」。輸入「角色名稱」,然後選擇「建立角色」。

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 叢集名稱。在「屬性」索引標籤的「資料庫組態」區段中,記錄「資料庫名稱」和「連接埠」。開啟「連線詳細資訊」區段,並記錄「端點」,其格式為「端點:<連接埠>/<資料庫名稱>」。重要事項:確定傳入規則的 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_bucket_name” 取代為您的 S3 儲存貯體名稱。選擇「檢閱政策」,輸入政策的名稱和描述。選擇「建立政策」。

DBA

建立IAM角色以允許 Amazon Redshift COPY的操作。

開啟IAM主控台並選擇「角色」。選擇「建立角色」,然後在「AWS選取信任實體類型」中選擇「服務」。選擇服務的「Redshift」,選擇「Redshift – Customizable」,然後選擇「下一步」。選擇您先前建立的「複製」政策,然後選擇「下一步」。輸入「角色名稱」,然後選擇「建立角色」。

DBA

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

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

DBA
任務描述所需的技能

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

使用「其他資訊」區段中的指令碼來驗證並記錄來源 Amazon Redshift 資料表中的資料列數。請記得平均分割 UNLOAD和 COPY指令碼的資料。這將改善資料卸載和載入效率,因為每個指令碼涵蓋的資料數量將會平衡。

DBA

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

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

DBA

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

某些用於資料驗證的SQL陳述式應根據實際業務和資料情況排序。這是為了驗證匯入的資料,以確保其一致且正確顯示。

DBA
任務描述所需的技能

產生 Amazon Redshift DDL指令碼。

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

DBA

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

在中國的 AWS 區域中,使用AWS命令列界面 (AWSCLI) 執行DDL指令碼。這些指令碼會在目標區域的 Amazon Redshift 叢集中建立物件。

DBA

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

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

DBA、開發人員

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

將資料從來源區域 S3 儲存貯體傳輸到目標 S3 儲存貯體。由於無法使用「$ aws s3 同步」命令,請務必使用「相關資源」區段中的「將 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/*"] } ] }

SQL 要查詢 Amazon Redshift 的 陳述式

##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;

SQL 要產生DDL陳述式的指令碼