Kubernetes 環境可讓您根據工作負載需求變化,動態調整資料庫資源。如果您使用 Helm 圖表部署 Spanner Omni,請按照下列程序調整資源配置。
事前準備
在調度 Kubernetes 部署作業資源前,請務必完成下列事項:
下載並安裝 Spanner Omni CLI。
最佳做法是先垂直擴充,將每部伺服器的記憶體增加到至少 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 圖表版本,例如1.1.0。CPU_CORES:要指派給每個伺服器 Pod 的 vCPU 核心數量,例如8。MEMORY_LIMIT:每個伺服器 Pod 的 RAM 限制,例如32Gi。NAMESPACE:部署作業的 Kubernetes 命名空間,例如spanner-ns。
水平擴充
如要水平擴充,請在部署作業中新增更多伺服器。非根伺服器支援水平擴充。
新增非根伺服器
如要新增非根伺服器,請在 Helm 圖表設定中增加副本數量。您可以統一調度所有可用區,或調度特定可用區。
統一縮放
如要將 Deployment 中的每個可用區擴充至 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 圖表版本,例如1.1.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 StatefulSet 會從最高到最低索引移除 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 部署作業,以符合目標副本數量。舉例來說,如要將每個可用區的副本數量減少至
1個 Pod,請執行下列指令:helm upgrade spanner-omni HELM_CHART_PATH \ --version VERSION \ --reuse-values \ --set deployment.replicasPerZone=REPLICAS \ -n NAMESPACE將
REPLICAS替換為更新後的副本數量,例如1。刪除與已移除 Pod 相關聯的 Kubernetes 永久磁碟區要求 (PVC)。為避免資料意外遺失,Helm 和 Kubernetes 在縮減 StatefulSet 時不會自動刪除 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。確認區域已移除。執行 list 指令,並等待輸出內容不再顯示該可用區:
spanner deployment zones list --deployment-endpoint=ENDPOINT執行 helm 升級指令,並傳遞不含已移除可用區的更新位置 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 圖表版本,例如1.1.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
後續步驟
- 瞭解如何維護部署作業。