部署和管理 worker

本文档介绍了如何在虚拟机 (VM) 和 Kubernetes 上部署、扩缩、退役和监控 Spanner Omni 工作器。

工作器是专用无状态计算节点,旨在将后台和资源密集型操作从 Spanner Omni 服务器分流。工作节点不托管用户数据,也不参与领导者选举、事务或其他核心数据库活动。与服务器不同,工作器不与特定可用区相关联。相反,工作器会注册一个位置,并且可以运行该位置中任何可用区的任务。添加和移除工作器的过程非常轻便且即时,因为工作器是无状态的,不需要进行数据移动或重新平衡。

需要工作器才能在大型表(超过 100 万行)上构建向量索引,以用于近似最近邻 (ANN) 搜索查询。如需了解详情,请参阅 Spanner Omni 向量搜索概览。

工作器仅在 Spanner Omni 的商业版中提供;开发者版不支持工作器。 工作器的计算资源按部署中服务器的相同费率(每 vCPU)计费。如需了解详情,请参阅 Spanner Omni 版本概览。

准备工作

在将工作节点添加到现有 Spanner Omni 部署之前,请确保您的环境满足以下要求:

  • 下载并设置 Spanner Omni 二进制文件。

  • 现有部署:验证您是否已部署一个处于 READY 状态且配置为商业版的 Spanner Omni 部署(而非单服务器部署)。开发者版不支持 worker。工作器的计算费用与部署中的服务器费用相同。如需了解详情,请参阅 Spanner Omni 版本概览。 请确保您拥有以下信息:

    • 部署配置中定义的目标位置名称(例如 us-central1)。
    • 部署端点(HOST:PORT,例如 my-spanner-deployment:15003)或根服务器地址列表(ROOT_HOST_1:PORT、ROOT_HOST_2:PORT,例如 root-server-1:15000、root-server-2:15000),用于集群发现。
  • 系统和硬件资源:确保您分配给工作线程的计算资源足以在可接受的时间内执行所需的操作。

  • vSphere 配置:如果您在 vSphere 虚拟化平台上运行 Spanner Omni,请停用时间戳计数器 (TSC) 的虚拟化。将 monitor_control.virtual_rdtsc = FALSE 添加到虚拟机的 .vmx 配置文件中。

  • 网络和防火墙配置:除了标准服务器通信端口(15000 到 15025)之外,工作器还使用端口 15027。请确保您的网络配置允许通过端口 15000 到 15027 进行通信。

在虚拟机上部署工作节点

如需在虚拟机 (VM) 上部署工作器,请使用部署端点或根服务器列表启动工作器进程。

方法 A:开始使用部署端点

如需使用部署端点启动工作器,请运行 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

替换以下内容:

  • LOCATION_NAME:目标位置名称,例如 us-central1。
  • WORKER_HOSTNAME:工作器虚拟机的可解析主机名或 IP 地址。
  • WORKER_PORT_BASE:工作器启动时所用的基本端口,例如 15000 或 20000。
  • DEPLOYMENT_ENDPOINT:部署端点的主机和端口,例如 my-spanner-deployment:15003。
  • BASE_DIR:工作器数据和日志的基本目录,例如 /var/spanner。
  • LICENSE_FILE_PATH:Spanner Omni 许可文件的路径。

方法 B:从根服务器列表开始使用

如需使用根服务器列表启动工作器,请运行 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

替换以下内容:

  • LOCATION_NAME:目标位置名称,例如 us-central1。
  • WORKER_HOSTNAME:工作器虚拟机的可解析主机名或 IP 地址。
  • WORKER_PORT_BASE:工作器启动时所用的基本端口,例如 15000 或 20000。
  • ROOT_SERVER_1_HOST、ROOT_SERVER_2_HOST:部署中根服务器的主机名或 IP 地址。
  • ROOT_SERVER_PORT_BASE:根服务器的基本端口,例如 15000。
  • BASE_DIR:工作器数据和日志的基本目录,例如 /var/spanner。
  • LICENSE_FILE_PATH:Spanner Omni 许可文件的路径。

配置加密

如果您的 Spanner Omni 部署使用 TLS 或 mTLS 加密,请为每个工作器配置加密:

  1. 更新服务器证书,以包含工作器主机名(如果尚未包含)。
  2. 将包含 ca.crt、server.crt 和 server.key 的证书目录复制到工作器虚拟机。
  3. 运行 spanner workers start 时添加 --certificate-directory 标志:

    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_PATH
    

    将 CERTIFICATE_DIRECTORY 替换为包含 ca.crt、server.crt 和 server.key 的目录。

如需详细了解如何配置证书和安全部署,请参阅在虚拟机上创建安全部署。

在 Kubernetes 上部署工作器

在 Google Kubernetes Engine (GKE) 或 Amazon Elastic Kubernetes Service (Amazon EKS) 等 Kubernetes 环境中,您可以将工作器部署为现有 Spanner Omni Helm 版本的一部分,并与集群位于同一命名空间中。Helm 图表将工作器部署为 Kubernetes StatefulSet,并使用无头服务,从而为每个工作器 pod 提供稳定的网络身份和 PersistentVolumeClaims (PVC),使根服务器能够可靠地与每个工作器通信。

默认情况下,Helm 图表仅在标记为 spanner-role=workers 的节点上调度工作器 pod,容忍 spanner-role=workers:NoSchedule 污点,并且每个节点最多运行一个工作器 pod。在启用工作器之前,请添加具有此标签和污点的节点池,该节点池的节点数至少为 workers.replicas。每个节点都需要有足够的 CPU 和内存可分配给一个工作器 pod,如 workers.resources.cpu 和 workers.resources.memory 所设置。 Kubernetes 会为系统组件预留每个节点的部分容量,因此请选择大于这些值的节点。如需使用其他标签,请设置 workers.nodeLabelKey 和 workers.nodeLabelValue。如需移除标签要求,请设置 workers.nodeLabelKey=""。如需替换默认的调度规则,请设置 workers.affinity。

如需在现有部署中启用工作器,请运行 helm upgrade 命令:

helm upgrade spanner-omni HELM_CHART_PATH \
  --reuse-values \
  --set workers.enabled=true \
  --namespace NAMESPACE

替换以下内容:

  • HELM_CHART_PATH:Spanner Omni Helm 图表的路径。
  • NAMESPACE:部署 Spanner Omni 集群的 Kubernetes 命名空间,例如 spanner-ns。

如需让工作器在任何具有足够可分配 CPU 和内存的节点上运行,请将 workers.nodeLabelKey 设置为空字符串。此操作会同时移除节点标签要求和污点容忍度:

helm upgrade spanner-omni HELM_CHART_PATH \
  --reuse-values \
  --set workers.enabled=true \
  --set workers.nodeLabelKey="" \
  --namespace NAMESPACE

可选配置设置包括:

  • --set workers.replicas=WORKER_REPLICAS:要部署的工作器副本数量。默认值为 1。

  • --set workers.resources.cpu=CPU_CORES:每个工作器的 CPU 限制和请求。默认值为 6。

  • --set workers.resources.memory=MEMORY_LIMIT:每个工作器的内存限制和请求。默认值为 24Gi。

  • --set workers.storage.size=STORAGE_SIZE:每个工作器的存储容量。默认值为 20Gi。

  • --set workers.storage.storageClassName=STORAGE_CLASS:用于工作器存储空间的存储类别,例如 GKE 上的 hyperdisk-balanced-rwo 或 Amazon EKS 上的 aws-gp3。默认值为空字符串,表示继承集群的默认存储类。

  • --set workers.port=WORKER_PORT:工作器监听的网络端口。默认值为 deployment.basePort,即 15000。

  • --set workers.joinServers={ROOT_HOST_1:PORT,ROOT_HOST_2:PORT}:要加入的根服务器地址的明确逗号分隔列表。默认值为一个空列表 ([]),用于从部署拓扑中发现所有活跃的根服务器。

  • --set workers.nodeLabelKey=NODE_LABEL_KEY:用于节点亲和性和容忍设置的 Kubernetes 节点标签键,用于将工作器隔离到专用节点池。默认值为 spanner-role。 设置为空字符串 "" 可停用节点亲和性和容忍度。

  • --set workers.nodeLabelValue=NODE_LABEL_VALUE:用于节点亲和性和容忍度的 Kubernetes 节点标签值。默认值为 workers。

  • --set workers.pdbMaxUnavailable=MAX_UNAVAILABLE:在 PodDisruptionBudget 中自愿中断期间,可以不可用的工作器 pod 数上限。默认值为 1。

  • workers.affinity:工作器 pod 的自定义 Kubernetes 亲和性规则。如果未指定,则应用默认节点亲和性(使用 workers.nodeLabelKey 和 workers.nodeLabelValue)以及跨主机名的 pod 反亲和性 (kubernetes.io/hostname)。由于这是一个嵌套对象,因此请使用 -f 标志在 values.yaml 文件中指定它。

验证 worker 部署

如需验证工作器 pod 是否正在运行且已准备就绪,请运行以下命令:

kubectl get pods --namespace NAMESPACE -l app.kubernetes.io/component=spanner-worker

扩缩和停用工作器

工作器不存储用户数据,也不参与数据库共识。工作器的扩缩和停用是即时完成的。您可以在启动向量索引创建之前或之后启动工作器,并在索引创建完成后立即停用工作器。

自动伸缩工作器

如需自动创建和伸缩工作器,请监控 spanner_box_compute_heavy_workers_required 指标。当指标值大于 0 时,部署需要一个或多个工作线程来完成待处理的后台操作,例如在大表上构建向量索引。当指标值恢复为 0 时,所有待处理的操作都已完成,您可以停用工作器。

停用虚拟机工作器

如需停止在虚拟机上运行的工作进程,请在运行工作进程的终端中按 Control+C,或使用进程 ID (PID) 停止该进程:

kill -TERM PID

将 PID 替换为 spanner workers 进程的进程 ID。或者,关停工作器虚拟机。

退役 Kubernetes 工作器

如需在 Kubernetes 上退役工作器,请在 Helm 版本中停用工作器,或使用 kubectl 直接缩容工作器副本:

  • 停用工作器:如需从集群中移除工作器 StatefulSet 和服务,同时保留部署的其余部分,请运行带有 workers.enabled=false 的 helm upgrade 命令:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --reuse-values \
      --set workers.enabled=false \
      --namespace NAMESPACE
    

    替换以下内容:

    • HELM_CHART_PATH:Spanner Omni Helm 图表的路径。
    • NAMESPACE:部署 Spanner Omni 集群的 Kubernetes 命名空间,例如 spanner-ns。
  • 缩容工作器副本:如需将工作器 pod 缩减为零个副本,同时保持工作器配置在集群中处于有效状态,请运行 kubectl scale 命令:

    kubectl scale statefulset spanner-worker \
      --replicas=0 \
      --namespace NAMESPACE
    

    将 NAMESPACE 替换为部署 Spanner Omni 集群的 Kubernetes 命名空间,例如 spanner-ns。

监控和排查 worker 问题

如果您的部署已启用监控,则可以使用 Prometheus 或 Grafana 信息中心监控工作器。工作器会公开与 Spanner Omni 服务器类似的指标。Grafana 信息中心包含一个工作器洞见信息中心,可用于监控每个工作器的资源利用率。

Worker 会将日志文件写入由 --base-dir 指定的基本目录中的 logs 子目录:

BASE_DIR/logs

spanner admin diagnostics create 命令不会从工作器收集日志或诊断信息。如需检查工作器日志,请直接在工作器机器或 pod 上查看 BASE_DIR/logs 中的文件,或者针对 Kubernetes 工作器 pod 运行 kubectl logs。

如需详细了解如何监控和配置信息中心,请参阅监控概览和使用 Grafana 信息中心进行监控。

向量索引创建未取得进展

如果您在大型表上创建向量索引,并且索引创建一直处于待处理状态而没有进展,请验证是否至少有一个工作器正在运行并已连接到部署。

借助 Spanner Omni,即使没有活跃的工作人员,您也可以创建向量索引,这样您就可以仅在需要时部署工作人员。如果没有活跃的工作人员,索引创建操作会无限期暂停,直到部署工作人员为止。当工作器启动并向部署注册后,索引创建会自动恢复。