Questo documento spiega come eseguire il deployment, scalare, dismettere e monitorare i worker Spanner Omni su macchine virtuali (VM) e Kubernetes.
I worker sono nodi di computing dedicati e stateless progettati per scaricare le operazioni in background e ad alta intensità di risorse dai server Spanner Omni. I worker non ospitano dati utente né partecipano a elezioni di leader, transazioni o altre attività principali del database. A differenza dei server, i worker non sono associati a una zona specifica. I lavoratori si registrano in una località e possono eseguire attività per qualsiasi zona di quella località. L'aggiunta e la rimozione di worker è semplice e istantanea perché i worker sono stateless e non richiedono spostamento o ribilanciamento dei dati.
I worker devono creare indici vettoriali su tabelle di grandi dimensioni (più di 1 milione di righe) per le query di ricerca del vicino più prossimo approssimato (ANN). Per saperne di più, consulta la panoramica della ricerca vettoriale di Spanner Omni.
I worker sono disponibili solo nella versione commerciale di Spanner Omni; la versione Developer non supporta i worker. Il calcolo dei worker viene fatturato alla stessa tariffa dei server nel deployment (per vCPU). Per ulteriori informazioni, consulta la panoramica delle edizioni di Spanner Omni.
Prima di iniziare
Prima di aggiungere worker a un deployment Spanner Omni esistente, assicurati che il tuo ambiente soddisfi i seguenti requisiti:
Deployment esistente: verifica di avere un deployment Spanner Omni in esecuzione (non un deployment a server singolo) nello stato
READY, configurato con la versione Commercial. La versione Developer non supporta i worker. Il calcolo dei worker viene fatturato alla stessa tariffa dei server nel deployment. Per ulteriori informazioni, consulta la panoramica delle edizioni di Spanner Omni. Assicurati di disporre delle seguenti informazioni:- Il nome della località di destinazione (ad esempio,
us-central1) come definito nella configurazione della distribuzione. - L'endpoint di deployment
(
HOST:PORT, ad esempiomy-spanner-deployment:15003) o un elenco di indirizzi dei server radice (ROOT_HOST_1:PORT,ROOT_HOST_2:PORT, ad esempioroot-server-1:15000,root-server-2:15000) per l'individuazione del cluster.
- Il nome della località di destinazione (ad esempio,
Risorse di sistema e hardware: assicurati che le risorse di calcolo che allochi al worker siano sufficienti per eseguire le operazioni richieste in un periodo di tempo accettabile.
Configurazione vSphere: se esegui Spanner Omni sulla piattaforma di virtualizzazione vSphere, disattiva la virtualizzazione del contatore del timestamp (TSC). Aggiungi
monitor_control.virtual_rdtsc = FALSEal file di configurazione.vmxdella macchina virtuale.Configurazione di rete e firewall: i worker utilizzano la porta
15027oltre alle porte di comunicazione del server standard (da15000a15025). Assicurati che la configurazione di rete consenta la comunicazione sulle porte da15000a15027.
Deployment dei worker sulle VM
Per eseguire il deployment dei worker su una macchina virtuale (VM), avvia il processo worker utilizzando l'endpoint di deployment o un elenco di server radice.
Opzione A: inizia a utilizzare l'endpoint di deployment
Per avviare un worker utilizzando l'endpoint di deployment, esegui il comando
spanner workers start:
spanner workers start \
--location=LOCATION_NAME \
--address=WORKER_HOSTNAME:WORKER_PORT_BASE \
--deployment=DEPLOYMENT_ENDPOINT \
--base-dir=BASE_DIR \
--license-file-path=LICENSE_FILE_PATH
Sostituisci quanto segue:
LOCATION_NAME: il nome della località di destinazione, ad esempious-central1.WORKER_HOSTNAME: Il nome host o l'indirizzo IP risolvibile della VM worker.WORKER_PORT_BASE: la porta di base su cui viene avviato il worker, ad esempio15000o20000.DEPLOYMENT_ENDPOINT: l'host e la porta dell'endpoint di deployment, ad esempiomy-spanner-deployment:15003.BASE_DIR: la directory di base per i dati e i log dei worker, ad esempio/var/spanner.LICENSE_FILE_PATH: il percorso del file di licenza Spanner Omni.
Opzione B: inizia a utilizzare un elenco di server radice
Per avviare un worker utilizzando un elenco di server radice, esegui il comando
spanner workers start:
spanner workers start \
--location=LOCATION_NAME \
--address=WORKER_HOSTNAME:WORKER_PORT_BASE \
--join-servers=ROOT_SERVER_1_HOST:ROOT_SERVER_PORT_BASE,\
ROOT_SERVER_2_HOST:ROOT_SERVER_PORT_BASE \
--base-dir=BASE_DIR \
--license-file-path=LICENSE_FILE_PATH
Sostituisci quanto segue:
LOCATION_NAME: il nome della località di destinazione, ad esempious-central1.WORKER_HOSTNAME: Il nome host o l'indirizzo IP risolvibile della VM worker.WORKER_PORT_BASE: la porta di base su cui viene avviato il worker, ad esempio15000o20000.ROOT_SERVER_1_HOST,ROOT_SERVER_2_HOST: i nomi host o gli indirizzi IP dei server radice nel tuo deployment.ROOT_SERVER_PORT_BASE: La porta di base dei server root, ad esempio15000.BASE_DIR: la directory di base per i dati e i log dei worker, ad esempio/var/spanner.LICENSE_FILE_PATH: il percorso del file di licenza Spanner Omni.
Configura la crittografia
Se il deployment di Spanner Omni utilizza la crittografia TLS o mTLS, configura la crittografia per ogni worker:
- Aggiorna il certificato server in modo da includere i nomi host dei worker, se non li hai già inclusi.
- Copia la directory dei certificati contenente
ca.crt,server.crteserver.keynella VM worker. Aggiungi il flag
--certificate-directoryquando eseguispanner workers start:spanner workers start \ --location=LOCATION_NAME \ --address=WORKER_HOSTNAME:WORKER_PORT_BASE \ --deployment=DEPLOYMENT_ENDPOINT \ --base-dir=BASE_DIR \ --certificate-directory=CERTIFICATE_DIRECTORY \ --license-file-path=LICENSE_FILE_PATHSostituisci
CERTIFICATE_DIRECTORYcon la directory contenenteca.crt,server.crteserver.key.
Per saperne di più sulla configurazione dei certificati e sui deployment sicuri, vedi Crea un deployment sicuro sulle VM.
Esegui il deployment dei worker su Kubernetes
Negli ambienti Kubernetes come Google Kubernetes Engine (GKE) o Amazon Elastic
Kubernetes Service (Amazon EKS), esegui il deployment dei worker nell'ambito della release
Helm di Spanner Omni esistente nello stesso spazio dei nomi del cluster.
Il grafico Helm esegue il deployment dei worker come StatefulSet Kubernetes con un servizio headless, fornendo a ogni pod worker un'identità di rete stabile e PersistentVolumeClaims (PVC), che consente ai server root di comunicare in modo affidabile con ogni worker.
Per impostazione predefinita, il grafico Helm pianifica i pod worker solo sui nodi etichettati
spanner-role=workers, tollera il taint spanner-role=workers:NoSchedule
ed esegue al massimo un pod worker per nodo. Prima di abilitare i worker, aggiungi un pool di nodi con questa etichetta e questo taint che abbia almeno tanti nodi quanti workers.replicas. Ogni nodo ha bisogno di CPU e memoria allocabili sufficienti per un pod worker, come impostato da workers.resources.cpu e workers.resources.memory.
Kubernetes riserva parte della capacità di ogni nodo per i componenti di sistema, quindi
scegli nodi più grandi di questi valori. Per utilizzare un'etichetta diversa, imposta
workers.nodeLabelKey e workers.nodeLabelValue. Per rimuovere il requisito
dell'etichetta, imposta workers.nodeLabelKey="". Per sostituire le regole di pianificazione
predefinite, imposta workers.affinity.
Per abilitare i worker nel deployment esistente, esegui il comando helm upgrade:
helm upgrade spanner-omni HELM_CHART_PATH \
--reuse-values \
--set workers.enabled=true \
--namespace NAMESPACE
Sostituisci quanto segue:
HELM_CHART_PATH: il percorso del grafico Helm di Spanner Omni.NAMESPACE: lo spazio dei nomi Kubernetes in cui viene eseguito il deployment del cluster Spanner Omni, ad esempiospanner-ns.
Per consentire ai worker di essere eseguiti su qualsiasi nodo con CPU e memoria allocabili sufficienti, imposta
workers.nodeLabelKey su una stringa vuota. In questo modo vengono rimossi sia il requisito dell'etichetta del nodo
sia la tolleranza del taint:
helm upgrade spanner-omni HELM_CHART_PATH \
--reuse-values \
--set workers.enabled=true \
--set workers.nodeLabelKey="" \
--namespace NAMESPACE
Le impostazioni di configurazione facoltative includono:
--set workers.replicas=WORKER_REPLICAS: il numero di repliche del worker da implementare. Il valore predefinito è1.--set workers.resources.cpu=CPU_CORES: il limite e la richiesta di CPU per ogni worker. Il valore predefinito è6.--set workers.resources.memory=MEMORY_LIMIT: il limite e la richiesta di memoria per ogni worker. Il valore predefinito è24Gi.--set workers.storage.size=STORAGE_SIZE: La capacità di archiviazione per ogni worker. Il valore predefinito è20Gi.--set workers.storage.storageClassName=STORAGE_CLASS: La classe di archiviazione da utilizzare per l'archiviazione dei worker, ad esempiohyperdisk-balanced-rwosu GKE oaws-gp3su Amazon EKS. Il valore predefinito è una stringa vuota, che eredita la classe di archiviazione predefinita del cluster.--set workers.port=WORKER_PORT: la porta di rete su cui il worker è in ascolto. Il valore predefinito èdeployment.basePort, ovvero15000.--set workers.joinServers={ROOT_HOST_1:PORT,ROOT_HOST_2:PORT}: Un elenco esplicito separato da virgole di indirizzi dei server root a cui connettersi. Il valore predefinito è un elenco vuoto ([]), che rileva tutti i server radice attivi dalla topologia di deployment.--set workers.nodeLabelKey=NODE_LABEL_KEY: la chiave di etichetta del nodo Kubernetes utilizzata per l'affinità e le tolleranze dei nodi per isolare i worker in un pool di nodi dedicato. Il valore predefinito èspanner-role. Imposta su stringa vuota""per disattivare l'affinità e le tolleranze dei nodi.--set workers.nodeLabelValue=NODE_LABEL_VALUE: il valore dell'etichetta del nodo Kubernetes utilizzato per l'affinità e le tolleranze dei nodi. Il valore predefinito èworkers.--set workers.pdbMaxUnavailable=MAX_UNAVAILABLE: il numero massimo di pod worker che possono non essere disponibili durante le interruzioni volontarie inPodDisruptionBudget. Il valore predefinito è1.workers.affinity: Regole di affinità Kubernetes personalizzate per i pod worker. Se non specificato, vengono applicate l'affinità dei nodi predefinita (utilizzandoworkers.nodeLabelKeyeworkers.nodeLabelValue) e l'anti-affinità dei pod tra i nomi host (kubernetes.io/hostname). Poiché si tratta di un oggetto nidificato, specificalo in un filevalues.yamlutilizzando il flag-f.
Verifica il deployment del worker
Per verificare che i pod worker siano in esecuzione e pronti, esegui questo comando:
kubectl get pods --namespace NAMESPACE -l app.kubernetes.io/component=spanner-worker
Scalare e dismettere i worker
I worker non archiviano dati utente né partecipano al consenso del database. Lo scaling e il ritiro dei worker sono istantanei. Puoi avviare un worker prima o dopo aver avviato la creazione dell'indice vettoriale e dismettere il worker immediatamente dopo il completamento della creazione dell'indice.
Automatizzare la scalabilità dei worker
Per automatizzare la creazione e la scalabilità dei worker, monitora la metrica
spanner_box_compute_heavy_workers_required. Quando il valore della metrica è
maggiore di 0, il deployment richiede uno o più worker per completare
le operazioni in background in attesa, ad esempio la creazione di un indice vettoriale su una tabella di grandi dimensioni.
Quando il valore della metrica torna a 0, tutte le operazioni in attesa sono completate e
puoi dismettere i worker.
Dismettere un worker VM
Per arrestare un processo worker in esecuzione su una VM, premi Controllo+C nel terminale in cui è in esecuzione il processo worker oppure arresta il processo utilizzando il relativo ID processo (PID):
kill -TERM PID
Sostituisci PID con l'ID processo del processo spanner workers. In alternativa, arresta la VM worker.
Dismettere un worker Kubernetes
Per dismettere i worker su Kubernetes, disabilitali nella release Helm o
fare lo scale down delle repliche dei worker direttamente utilizzando kubectl:
Disattiva i worker: per rimuovere il worker
StatefulSete il servizio dal cluster mantenendo il resto del deployment, esegui il comandohelm upgradeconworkers.enabled=false:helm upgrade spanner-omni HELM_CHART_PATH \ --reuse-values \ --set workers.enabled=false \ --namespace NAMESPACESostituisci quanto segue:
HELM_CHART_PATH: il percorso del grafico Helm di Spanner Omni.NAMESPACE: lo spazio dei nomi Kubernetes in cui viene eseguito il deployment del cluster Spanner Omni, ad esempiospanner-ns.
Fare lo scale down delle repliche dei worker: per fare lo scale down dei pod worker a zero repliche mantenendo attiva la configurazione dei worker nel cluster, esegui il comando
kubectl scale:kubectl scale statefulset spanner-worker \ --replicas=0 \ --namespace NAMESPACESostituisci
NAMESPACEcon lo spazio dei nomi Kubernetes in cui è stato eseguito il deployment del cluster Spanner Omni, ad esempiospanner-ns.
Monitorare e risolvere i problemi relativi ai worker
Se il deployment ha il monitoraggio abilitato, puoi monitorare i worker utilizzando le dashboard di Prometheus o Grafana. I worker espongono metriche simili ai server Spanner Omni. Le dashboard Grafana includono una dashboard Worker Insights che ti consente di monitorare l'utilizzo delle risorse di ogni worker.
I worker scrivono i file di log nella sottodirectory logs all'interno della directory di base specificata da --base-dir:
BASE_DIR/logs
Il comando spanner admin diagnostics create non raccoglie log o
diagnostica dai worker. Per esaminare i log dei worker, visualizza i file in
BASE_DIR/logs direttamente sulla macchina o sul pod worker oppure esegui
kubectl logs per i pod worker Kubernetes.
Per ulteriori informazioni sul monitoraggio e sulla configurazione delle dashboard, consulta Panoramica di Monitoring e Monitora utilizzando le dashboard Grafana.
La creazione dell'indice vettoriale non procede
Se crei un indice vettoriale su una tabella di grandi dimensioni e la creazione dell'indice rimane in attesa senza progressi, verifica che almeno un worker sia in esecuzione e connesso al deployment.
Spanner Omni ti consente di creare un indice vettoriale anche quando non sono attivi worker, in modo da poter eseguire il deployment dei worker solo quando necessario. Se nessun worker è attivo, l'operazione di creazione dell'indice viene sospesa a tempo indeterminato finché non viene deployato un worker. Una volta che un worker viene avviato e registrato con il deployment, la creazione dell'indice riprende automaticamente.