將資料從 Spanner 複製到 Spanner Omni

本文說明在Google Cloud 上的代管 Spanner 與外部環境 (例如 AWS 或地端部署資料中心) 中的 Spanner Omni 之間,設定災難復原拓撲的模式、設定步驟和操作指南。

只要結合使用變更串流的交易串流,以及透過 Cross-Cloud Interconnect 的專屬網路連線,即可在雲端邊界達成低復原點目標 (RPO) 和復原時間目標 (RTO)。

架構總覽

在跨雲端災難復原拓撲中,Google Cloud 上的 Spanner 是主要資料庫,Spanner Omni 則是待命部署項目或次要災難復原站點。您可以使用變更串流,持續複製交易變更。

下表比較主要 Spanner 部署項目和 AWS 次要 Spanner Omni 部署項目的資料庫功能、角色和作業界限。

主要 Spanner 和次要 Spanner Omni 部署作業的比較
能力或維度 主要站點:Spanner 位於 Google Cloud 次要站點:AWS 上的 Spanner Omni
部署模式

Google Cloud上的全代管服務。

AWS 上的自行管理軟體,例如 Amazon Elastic Compute Cloud (Amazon EC2) 或 Amazon Elastic Kubernetes Service (Amazon EKS)。

可用性服務水準協議

多區域設定最高可達 99.999%,區域設定最高可達 99.99%。詳情請參閱 Spanner 服務水準協議。

由客戶管理,取決於您的基礎架構和拓撲。

複寫模式

跨可用區和區域的同步 Paxos 複製。

使用變更串流,以非同步、近乎即時的方式進行變更資料擷取 (CDC)。

復原點目標 (RPO)

代管執行個體幾乎不會停機。

視管道處理量和網路延遲時間而定,跨雲端邊界的時間為不到一秒到數秒。

復原時間目標 (RTO)

在副本之間立即自動容錯移轉。

取決於您的 DNS 和流量切換執行手冊。

網路傳輸層

虛擬私有雲 (VPC) 網路對等互連或 Cloud Interconnect。

Cross-Cloud Interconnect 連線至 AWS Direct Connect。

備份儲存空間目標

Google 代管的 Spanner 備份,只能還原至代管 Spanner。

Cloud Storage 或 Amazon Simple Storage Service (Amazon S3),只能還原至 Spanner Omni。

事前準備

在 Spanner 和 Spanner Omni 之間設定複製作業前,請確認環境符合下列需求條件:

  • 佈建相符的目的地容量:調整目的地 Spanner Omni 部署作業的大小,以符合主要 Spanner 執行個體的 CPU、記憶體和儲存空間 I/O 容量。如果部署規模過小,可能會導致複製延遲,並使待命叢集無法在容錯移轉期間處理工作負載。詳情請參閱「系統需求」。
  • 同步處理資料庫結構定義和基準資料:在 Spanner Omni 中建立目的地資料庫和資料表,並使用與來源 Spanner 資料庫相同的 SQL 方言 (GoogleSQL 或 PostgreSQL) 和結構定義定義。由於無法將代管 Spanner 備份還原至 Spanner Omni,請將 Spanner 中的現有資料匯出至 Cloud Storage 的 Avro 檔案,然後匯入 Spanner Omni。詳情請參閱「結構定義與資料模型」、「使用 Spanner Omni 開發」、「將資料庫從 Spanner 匯出至 Avro」和「匯入及匯出資料」。
  • 建立私人網路連線能力:在 Google Cloud 虛擬私有雲網路和外部環境之間設定私人網路轉送,讓複製工作站可以連線至 Spanner 和 Spanner Omni gRPC 端點。詳情請參閱「選擇網路連線產品」和「使用 Cross-Cloud Interconnect 加快複製速度」。

使用變更串流持續複製資料

如果應用程式需要跨雲端業務持續性,Spanner 變更串流會按照修訂版本時間戳記順序,輸出交易資料變更 (INSERT、UPDATE 和 DELETE 作業)。持續複製管道會從 Spanner on Google Cloud 讀取變更記錄,並寫入 Spanner Omni 部署項目。

使用變更串流進行跨雲端複製,可帶來下列好處:

  • 主動-被動待命:在 Spanner Omni 上維護暖副本,在您啟動容錯移轉時,隨時準備好處理工作負載。
  • 選擇性複製:您可以設定變更串流監控整個資料庫,或限制監控特定資料表和資料欄,降低跨雲端傳輸費用。
  • 方言一致性:Spanner Omni 支援與 Spanner 相同的 GoogleSQL 和 PostgreSQL 方言和結構定義語意,因此應用程式查詢在轉換後不需修改即可執行。

步驟 1:在來源資料庫建立變更串流

在來源 Spanner 資料庫建立變更串流,追蹤目標資料表的變更。例如,在 Spanner 資料庫中執行以下 DDL 陳述式:

CREATE CHANGE STREAM CHANGE_STREAM_NAME
FOR TABLE_NAMES
OPTIONS (
  retention_period = '7d',
  value_capture_type = 'NEW_ROW_AND_OLD_VALUES'
);

更改下列內容:

  • CHANGE_STREAM_NAME:異動串流的名稱,例如 CsToOmniDrStream。
  • TABLE_NAMES:以半形逗號分隔的資料表清單,例如 Customers, Orders, AccountBalances,或 ALL,用於追蹤資料庫中的所有資料表。

將 retention_period 設為 '7d',即可保留最多七天的變更串流記錄,避免複製管道長時間維護或連線中斷時遺失資料。詳情請參閱「建立及管理變更串流」。

步驟 2:部署變更資料擷取管道

如要將變更從 Spanner 串流至 Spanner Omni,請使用 Dataflow 搭配 Apache Beam 部署持續變更資料擷取 (CDC) 管道,或在 Google Kubernetes Engine (GKE) 或 Amazon EKS 上執行自訂 worker Pod。

正式環境複製管道會執行下列工作:

  • 讀取分區:使用 Spanner Change Streams API 或 Apache Beam SpannerIO 連接器,讀取動態變更串流分區中的變更記錄。詳情請參閱「變更串流分區、記錄和查詢」和「使用 Dataflow 處理變更串流記錄」。
  • 緩衝和排序異動:根據每個鍵範圍或資料表的修訂版本時間戳記 (commit_timestamp) 排序及批次處理交易,以維持交易一致性並盡可能提高寫入處理量。
  • 寫入 Spanner Omni:透過 gRPC 連線至 Spanner Omni 部署作業的私人端點,並套用批次異動。如果使用 Apache Beam SpannerIO 連接器搭配加密功能,請使用 Apache Beam 2.69.0 以上版本 (TLS),或 2.75.0 以上版本 (雙向 TLS (mTLS))。詳情請參閱「使用 Apache Beam 和 SpannerIO 連線至 Spanner Omni」和「驗證與授權」。
  • 監控複製延遲:追蹤目前時間與已處理變更記錄的 commit_timestamp 之間的差異,以便在複製延遲時發出快訊。

如果使用 Dataflow 或 Apache Beam,則必須使用 Apache Beam Java SDK,因為 Python SDK 不含變更串流連接器。如果是自訂 worker Pod,這個 Python 範例說明如何使用 TLS 加密設定 Spanner Omni 用戶端,並將一批變更串流異動套用至目的地資料庫。對於高流量工作負載,請在平行 worker 程序中,按照修訂版本時間戳記順序,將不重疊的異動排入佇列並批次處理,而不是一次修訂一筆記錄:

from google.cloud import spanner
from google.cloud.spanner_v1 import InstanceType

# Configure the Spanner Omni target client
omni_client = spanner.Client(
    client_options={"api_endpoint": "ENDPOINT"},
    instance_type=InstanceType.OMNI,
    ca_certificate="PATH_TO_CA_CERT",
)
# Spanner Omni uses "default" as the instance ID
omni_instance = omni_client.instance("default")
omni_database = omni_instance.database("DATABASE_ID")


def apply_cdc_mutations_to_omni(records):
    """Applies a batch of ordered change stream records to Spanner Omni."""

    def write_batch(transaction):
        for record in records:
            table_name = record["tableName"]
            mutation_type = record["mutationType"]  # INSERT, UPDATE, DELETE
            row_data = record.get("columnValues", {})

            if mutation_type in ("INSERT", "UPDATE"):
                transaction.insert_or_update(
                    table=table_name,
                    columns=list(row_data.keys()),
                    values=[list(row_data.values())],
                )
            elif mutation_type == "DELETE":
                key_columns = record["keyValues"]
                transaction.delete(
                    table=table_name,
                    keyset=spanner.KeySet(keys=[list(key_columns.values())]),
                )

    omni_database.run_in_transaction(write_batch)

更改下列內容:

  • ENDPOINT:Spanner Omni 執行個體的私人 gRPC 端點和通訊埠,例如 spanner-omni.internal.example.com:15000。
  • PATH_TO_CA_CERT:Spanner Omni 部署作業的憑證授權單位 (CA) 憑證檔案路徑。
  • DATABASE_ID:目的地 Spanner Omni 資料庫的 ID。

如要進一步瞭解如何設定用戶端連線,請參閱「使用 Python 用戶端程式庫連線至 Spanner Omni」。

透過 Cross-Cloud Interconnect 加快複製速度

如果 Google Cloud與其他雲端服務供應商之間,是透過公開網際網路或 IPsec VPN 通道連線,可能會發生網路抖動、封包遺失、頻寬限制和複製延遲時間不穩定的情況。如果正式環境工作負載需要低 RPO,請使用 Cross-Cloud Interconnect,在Google Cloud 和外部雲端服務供應商之間建立專屬的高速實體連線。

下表比較公開網際網路或 IPsec VPN 連線與 Cross-Cloud Interconnect 的網路特性。

跨雲端複製的網路傳輸選項比較
網路指標 公開網際網路或 IPsec VPN Cross-Cloud Interconnect
連結容量

每個通道 1.25 Gbps 至 3 Gbps。

每個連結 10 Gbps 或 100 Gbps 的專屬光纖頻寬。

網路延遲和抖動

網際網路傳輸路徑多變且無法預測。

確定性、低延遲的私人路由。

可用性服務水準協議

不提供端對端效能服務水準協議。

設定備援連線後,服務水準協議保證可用性達 99.9% 或 99.99%。

資料移轉加密

IPsec 負載和軟體密碼編譯限制。

Cloud Interconnect (IEEE 802.1AE) 加密適用的線路速率 MACsec。詳情請參閱「Cloud Interconnect 適用的 MACsec 總覽」。

資料移轉費用

標準網際網路輸出費率。

Cloud Interconnect 資料移轉費率降低。

高階網路設定工作流程

如要為複製管道設定 Cross-Cloud Interconnect,請完成下列高階步驟:

  1. 訂購 Cross-Cloud Interconnect 連線:在與遠端雲端服務供應商位置配對的主機代管機房中,訂購主要和備援 Cross-Cloud Interconnect 連接埠。例如,執行 gcloud compute interconnects create 指令:

    gcloud compute interconnects create CONNECTION_NAME \
      --interconnect-type=DEDICATED \
      --link-type=CAPACITY \
      --requested-link-count=LINK_COUNT \
      --location=GOOGLE_CLOUD_LOCATION \
      --remote-location=REMOTE_LOCATION \
      --noc-contact-email=CONTACT_EMAIL
    

    更改下列內容:

    • CONNECTION_NAME:Cross-Cloud Interconnect 連線的名稱。
    • CAPACITY:連結容量,例如 LINK_TYPE_ETHERNET_10G_LR 或 LINK_TYPE_ETHERNET_100G_LR。
    • LINK_COUNT:要要求的連結數量。
    • GOOGLE_CLOUD_LOCATION: Google Cloud 位置的邊緣可用性網域,例如 iad-zone1-1。
    • REMOTE_LOCATION:遠端雲端服務供應商位置,例如 aws-us-east-1。
    • CONTACT_EMAIL:網路營運電子郵件地址。

    詳情請參閱「選擇位置」和「訂購 AWS 連接埠」。

  2. 設定 Cloud Router 和 BGP 對接:建立 VLAN 連結,並在 Google Cloud 虛擬私有雲網路中的 Cloud Router,與遠端雲端環境中的虛擬私有閘道或直接連線閘道之間,設定邊界閘道通訊協定 (BGP) 工作階段。詳情請參閱「Cloud Router 總覽」、「設定 Google Cloud 資源」和「設定 AWS 資源」。

  3. 驗證路由傳播:確認兩個網路中的路由表都會傳播不重疊的 CIDR 區塊,確保 CDC 管道 worker 和 Spanner Omni 節點只透過私人 IP 位址通訊。詳情請參閱「驗證連線」。

如需完整的設定操作說明,請參閱 Cross-Cloud Interconnect 說明文件中的「連線至 Amazon Web Services」。

容錯移轉和執行手冊檢查清單

從Google Cloud 上的 Spanner 切換或容錯移轉至 Spanner Omni 時,請按照下列操作步驟執行:

  1. 清空傳輸中的變更:停止應用程式寫入主要 Spanner 資料庫 (如果可連線),並確認 CDC 複製管道已處理所有變更串流記錄,直到最新的修訂版本時間戳記。
  2. 重新導向應用程式連線:更新應用程式設定檔、連線字串或 Kubernetes 密鑰,連線至 Spanner Omni 端點,而非Google Cloud上的 Spanner。
  3. 更新 DNS 和流量轉送:切換 DNS 記錄或全域負載平衡器目標,將用戶端流量轉送至應用程式層,以及 Spanner Omni 部署作業前端的負載平衡器。
  4. 復原後重新同步:還原主要Google Cloud 環境後,請先反轉複製方向,再進行容錯回復。您可以使用變更串流和 Debezium 連接器,從 Spanner Omni 擷取變更,並將變更發布至 Apache Kafka,然後由取用者將變更套用至 Spanner。或者,您也可以將 Spanner Omni 資料庫匯出至 Cloud Storage 中的 Avro 檔案,然後匯入 Spanner。詳情請參閱「匯入及匯出資料」和「匯入 Spanner Avro 檔案」。

後續步驟