Kubernetes 環境可讓您隨著工作負載需求變化,動態調整資料庫資源。如果您使用 Helm 資訊套件部署 Spanner Omni,請使用這些擴充程序。
事前準備
擴充 Kubernetes 部署作業前,請務必完成下列事項:
下載並安裝 Spanner Omni CLI。
安裝 Helm 並建立 Helm 資訊套件設定。
最佳做法是先垂直擴充,將每個伺服器的記憶體擴充至至少 32 GB,再新增伺服器進行水平擴充。
限制
Kubernetes 的擴縮作業有下列限制:
僅限非根伺服器:系統支援非根例項的水平擴充。系統不支援根伺服器擴充。
StatefulSet 儲存空間限制:由於 Kubernetes
volumeClaimTemplates不可變更,因此您無法使用單一helm upgrade指令擴充 Pod 磁碟。如要調度儲存空間,必須手動擴充磁碟區。
垂直縮放
如要調整伺服器的 CPU 或記憶體資源,請使用 Helm 升級更新設定:
helm upgrade spanner-omni HELM_CHART_PATH \
--version VERSION \
--reuse-values \
--set resources.cpu=CPU_CORES \
--set resources.memory=MEMORY_LIMIT \
-n NAMESPACE
更改下列內容:
HELM_CHART_PATH:Helm 範本的路徑,例如oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni。VERSION:Helm 範本版本,例如0.2.0。CPU_CORES:要指派給每個伺服器 Pod 的 vCPU 核心數,例如8。MEMORY_LIMIT:每個伺服器 Pod 的 RAM 限制,例如32Gi。NAMESPACE:部署作業的 Kubernetes 命名空間,例如spanner-ns。
水平擴充
如要水平擴充,請在部署作業中新增更多伺服器。非根伺服器支援水平擴充。
新增非根伺服器
如要新增非根伺服器,請在 Helm chart 設定中增加副本數量。您可以統一調整所有可用區的規模,也可以調整特定可用區的規模。
統一縮放
如要將部署作業中的每個區域擴展至 15 部伺服器,請執行下列指令:
helm upgrade spanner-omni HELM_CHART_PATH \
--version VERSION \
--reuse-values \
--set deployment.replicasPerZone=REPLICAS \
-n NAMESPACE
更改下列內容:
HELM_CHART_PATH:Helm 範本的路徑,例如oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni。VERSION:Helm 圖表版本,例如0.2.0。REPLICAS:每個區域的伺服器副本目標數量,例如15。NAMESPACE:Kubernetes 命名空間,例如spanner-ns。
擴充特定區域
如果初始部署作業為個別區域設定不同的伺服器數量,您可以指定單一區域。舉例來說,如要將第一個位置內第一個區域的副本數增加至 15,請執行下列指令:
helm upgrade spanner-omni HELM_CHART_PATH \
--version VERSION \
--reuse-values \
--set locations[0].zones[0].replicas=REPLICAS \
-n NAMESPACE
將 REPLICAS 替換為目標區域副本計數,例如 15。
如要確認新伺服器是否已成功加入部署作業,請查詢 Spanner Omni CLI,列出部署伺服器,或查看 Grafana 資訊主頁。
spanner deployment servers list \
--zone=ZONE \
--deployment-endpoint=ENDPOINT
更改下列內容:
ZONE:要列出的區域,例如us-central1-a。ENDPOINT:部署作業的外部端點,例如${ENDPOINT}:15000。
移除非根伺服器
縮減伺服器需要額外步驟,因為系統必須安全地將資料分割區從停用伺服器移開。由於 Kubernetes StatefulSets 會依索引從高到低移除 Pod,因此您必須先移除索引最高的非根伺服器。
如要減少伺服器數量,請執行下列步驟:
列出可用區中的伺服器,找出要移除的候選項目:
spanner deployment servers list \ --zone=ZONE \ --deployment-endpoint=ENDPOINT輸出內容範例:
NAME HOST PORT_BASE ROOT STATE zones/us-central1-a/servers/spanner-a-0.pod.spanner-ns:15000 spanner-a-0.pod.spanner-ns 15000 true - zones/us-central1-a/servers/spanner-a-1.pod.spanner-ns:15000 spanner-a-1.pod.spanner-ns 15000 - -刪除已停用的非根伺服器 (索引最高者),例如
spanner-a-1.pod.spanner-ns:15000:spanner deployment servers delete SERVER_NAME \ --zone=ZONE \ --deployment-endpoint=ENDPOINT將
SERVER_NAME替換為伺服器 ID,例如spanner-a-1.pod.spanner-ns:15000。檢查伺服器清單,直到目標伺服器從清單中移除為止。 刪除後,伺服器會在系統中轉換為不健全狀態,並從有效服務路徑中移除。
執行 Helm 升級指令,將 Helm Deployment 縮減至目標副本數量。舉例來說,如要將每個區域的副本數減少至
1個 Pod,請執行下列指令:helm upgrade spanner-omni HELM_CHART_PATH \ --version VERSION \ --reuse-values \ --set deployment.replicasPerZone=REPLICAS \ -n NAMESPACE將
REPLICAS替換為更新後的副本數量,例如1。刪除與已移除 Pod 相關聯的 Kubernetes 永久磁碟區要求 (PVC)。為避免資料意外遺失,當您縮減 StatefulSet 時,Helm 和 Kubernetes 不會自動刪除 PVC。手動刪除 PVC,徹底回收儲存空間:
kubectl delete pvc LOGS_PVC DATA_PVC -n NAMESPACE舉例來說,如要刪除命名空間
spanner-ns中spanner-a-1的記錄和資料量,請執行以下指令:kubectl delete pvc logs-volume-spanner-a-1 data-volume-spanner-a-1 -n spanner-ns
新增可用區
在部署作業中新增可用區可提高可用性,並防範單一可用區服務中斷,確保資料庫正常運作。
舉例來說,下列指令會在 us 區域的 us-east1-b 可用區中,初始化 Google Kubernetes Engine (GKE) 上執行的單一可用區部署作業:
helm upgrade --install spanner-omni HELM_CHART_PATH \
--version VERSION \
--set resources.cpu=2 \
--set resources.memory=8Gi \
--set global.platform=gke \
--set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
-n NAMESPACE
執行下列步驟,將區域 us-east1-c 新增至這項設定:
執行
helm upgrade指令,並傳遞包含新位置區域的更新 JSON 區塊,在新區域中啟動 Pod:helm upgrade spanner-omni HELM_CHART_PATH \ --version VERSION \ --reuse-values \ --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"},{"name":"us-east1-c","shortName":"east-c"}]}]' \ -n NAMESPACE使用 Spanner Omni CLI 新增可用區。等待新建立的可用區中的根伺服器 Pod 進入
Running和就緒狀態。然後執行區域建立指令:spanner deployment zones create NEW_ZONE \ --location=LOCATION \ --root-servers=ROOT_SERVERS_LIST \ --deployment-endpoint=ENDPOINT更改下列內容:
NEW_ZONE:要新增的區域 ID,例如us-east1-c。LOCATION:部署位置,例如us。ROOT_SERVERS_LIST:以半形逗號分隔的新區域根伺服器端點清單,例如spanner-east-c-0.pod.spanner-ns:15000,spanner-east-c-1.pod.spanner-ns:15000,spanner-east-c-2.pod.spanner-ns:15000。ENDPOINT:外部部署端點,例如${ENDPOINT}:15000。
等待區域建立完成。將現有資料庫結構定義和資料表複製到新區域需要時間。列出部署區域,監控區域同步進度:
spanner deployment zones list --deployment-endpoint=ENDPOINT
移除區域
您可以從多區域部署作業中停用某個活動區域,藉此減少資源或配合拓撲變更。
按照下列步驟,移除上一節建立的區域 us-east1-c:
刪除可用區,並在 Spanner Omni 內啟動可用區終止程序:
spanner deployment zones delete ZONE --deployment-endpoint=ENDPOINT將
ZONE替換為要移除的可用區,例如us-east1-c。確認區域已移除。執行清單指令,然後等待輸出內容不再顯示該可用區:
spanner deployment zones list --deployment-endpoint=ENDPOINT執行 Helm 升級指令,並傳遞更新後的 locations JSON 區塊 (排除已移除的區域),從 Kubernetes 叢集移除伺服器:
helm upgrade spanner-omni HELM_CHART_PATH \ --version VERSION \ --reuse-values \ --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \ -n NAMESPACE
擴充儲存空間
由於 Kubernetes volumeClaimTemplates 不可變更,您無法直接使用 helm upgrade 指令調度 Pod 儲存空間容量。您必須改為手動擴充磁碟區。詳情請參閱
GKE StatefulSet 磁碟區擴充指南。
如要擴充磁碟儲存空間,請執行下列步驟:
在終端機中,將磁碟區擴充的參數定義為環境變數:
NEW_SIZE="NEW_SIZE" NAMESPACE="NAMESPACE" RELEASE_NAME="spanner-omni" STATEFULSET_NAMES="STATEFULSET_NAME_1 STATEFULSET_NAME_2 STATEFULSET_NAME_3" HELM_CHART_PATH="HELM_CHART_PATH" VERSION="VERSION"更改下列內容:
NEW_SIZE:目標儲存空間容量大小,例如200Gi。NAMESPACE:Kubernetes 命名空間,例如spanner-ns。STATEFULSET_NAME_1、STATEFULSET_NAME_2等:部署中的 StatefulSets 名稱,通常對應於區域的簡短名稱 (例如spanner-east-b spanner-east-c)。HELM_CHART_PATH:Helm 資訊圖表的路徑,例如oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni。VERSION:Helm 資訊套件版本,例如0.2.0。
執行指令來修補 PVC、刪除 StatefulSet (保留後端 Pod),並升級 Helm 部署作業:
# Patch all associated PVCs directly. for pvc in $(kubectl get pvc -n $NAMESPACE \ -l app.kubernetes.io/instance=$RELEASE_NAME \ -o name | grep "data-volume"); do kubectl patch $pvc -n $NAMESPACE -p "{\"spec\":{\"resources\":{\"requests\":{\"storage\":\"$NEW_SIZE\"}}}}" done # Delete the StatefulSet while leaving backend pods intact (orphan cascade). kubectl delete statefulset $STATEFULSET_NAMES -n $NAMESPACE --cascade=orphan # Run Helm upgrade to align the templates with the expanded size. helm upgrade $RELEASE_NAME $HELM_CHART_PATH \ --version $VERSION \ --reuse-values \ --set storage.data.size=$NEW_SIZE \ -n $NAMESPACE
後續步驟
- 瞭解如何維護部署作業。