本文說明在Google Cloud 上的代管 Spanner 與外部環境 (例如 AWS 或地端部署資料中心) 中的 Spanner Omni 之間,設定災難復原拓撲的模式、設定步驟和操作指南。
只要結合使用變更串流的交易串流,以及透過 Cross-Cloud Interconnect 的專屬網路連線,即可在雲端邊界達成低復原點目標 (RPO) 和復原時間目標 (RTO)。
架構總覽
在跨雲端災難復原拓撲中,Google Cloud 上的 Spanner 是主要資料庫,Spanner Omni 則是待命部署項目或次要災難復原站點。您可以使用變更串流,持續複製交易變更。
下表比較主要 Spanner 部署項目和 AWS 次要 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 和流量切換執行手冊。 |
| 網路傳輸層 |
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,請完成下列高階步驟:
訂購 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 連接埠」。
設定 Cloud Router 和 BGP 對接:建立 VLAN 連結,並在 Google Cloud 虛擬私有雲網路中的 Cloud Router,與遠端雲端環境中的虛擬私有閘道或直接連線閘道之間,設定邊界閘道通訊協定 (BGP) 工作階段。詳情請參閱「Cloud Router 總覽」、「設定 Google Cloud 資源」和「設定 AWS 資源」。
驗證路由傳播:確認兩個網路中的路由表都會傳播不重疊的 CIDR 區塊,確保 CDC 管道 worker 和 Spanner Omni 節點只透過私人 IP 位址通訊。詳情請參閱「驗證連線」。
如需完整的設定操作說明,請參閱 Cross-Cloud Interconnect 說明文件中的「連線至 Amazon Web Services」。
容錯移轉和執行手冊檢查清單
從Google Cloud 上的 Spanner 切換或容錯移轉至 Spanner Omni 時,請按照下列操作步驟執行:
- 清空傳輸中的變更:停止應用程式寫入主要 Spanner 資料庫 (如果可連線),並確認 CDC 複製管道已處理所有變更串流記錄,直到最新的修訂版本時間戳記。
- 重新導向應用程式連線:更新應用程式設定檔、連線字串或 Kubernetes 密鑰,連線至 Spanner Omni 端點,而非Google Cloud上的 Spanner。
- 更新 DNS 和流量轉送:切換 DNS 記錄或全域負載平衡器目標,將用戶端流量轉送至應用程式層,以及 Spanner Omni 部署作業前端的負載平衡器。
- 復原後重新同步:還原主要Google Cloud 環境後,請先反轉複製方向,再進行容錯回復。您可以使用變更串流和 Debezium 連接器,從 Spanner Omni 擷取變更,並將變更發布至 Apache Kafka,然後由取用者將變更套用至 Spanner。或者,您也可以將 Spanner Omni 資料庫匯出至 Cloud Storage 中的 Avro 檔案,然後匯入 Spanner。詳情請參閱「匯入及匯出資料」和「匯入 Spanner Avro 檔案」。