多区域部署

本主题介绍 GKE 上的 Apigee Hybrid 多区域部署、本地部署的 Anthos GKE、Microsoft® Azure Kubernetes Service (AKS)、Amazon Elastic Kubernetes Service (EKS) 和 RedHat OpenShift。在前提条件和过程中选择您的平台。

多区域部署的拓扑包括以下内容:

  • 主动-主动:您的应用部署在多个地理位置,并且您的部署需要低延迟时间 API 响应时。您可以选择在距离您客户端最近的多个地理位置部署 Hybrid。例如:美国西海岸、美国东海岸、欧洲、亚太区域。
  • 主动-被动:您拥有主要区域和故障切换或灾难恢复区域时。

多区域混合部署中的区域通过 Cassandra 通信,如下图所示:

Apigee Hybrid 多区域部署架构

前提条件

在为多个区域配置 Hybrid 之前,您必须先满足以下前提条件:

GKE

  • 在不同的网络(例如不同的云服务提供商、不同的 VPC 网络、云端和本地等)之间安装多区域 Apigee 部署时,您必须在这些不同网络之间提供内部连接,以供 Cassandra 用于在节点之间进行通信。 这可以通过 VPN 或云专用的连接解决方案来实现。
  • 如果您使用 Workload Identity 对服务账号进行身份验证,则您扩展到的每个集群还必须使用 Workload Identity。请参阅使用 Apigee Hybrid 启用 Workload Identity
  • 在多个具有不同 CIDR 块的区域中设置 Kubernetes 集群
  • 确保每个集群中都安装了 cert-manager
  • 设置跨区域通信
  • 确保所有 Cassandra pod 都能够解析自己的主机名。如果 hostNetwork 设置为 false,则主机名是 Cassandra pod 名称。如果 hostNetwork 设置为 true,则主机名是运行 Cassandra pod 的 Kubernetes 节点主机名。
  • Cassandra 多区域要求:
    • 确保 pod 网络命名空间具有跨区域的连接,包括防火墙、vpn、vpc 对等互连和 vNet 对等互连。大多数 GKE 安装都是如此。
    • 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置 cassandra.hostNetwork: true,以启用 Kubernetes hostNetwork 功能。

      如需详细了解使用 hostNetwork 的需求,请参阅下面的孤岛模式集群和 hostNetwork

    • 请先在现有集群上启用 hostNetwork,然后再将多区域配置扩展到新区域。
    • 启用 hostNetwork 后,请确保工作器节点可以执行其主机名的正向 DNS 查找。Apigee Cassandra 使用正向 DNS 查找在启动时获取主机 IP。
    • 在跨所有区域的 Kubernetes 集群之间打开 TCP 端口 7001,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口

如需了解详情,请参阅 Kubernetes 文档。

GKE On-Prem

  • 在不同的网络(例如不同的云服务提供商、不同的 VPC 网络、云端和本地等)之间安装多区域 Apigee 部署时,您必须在这些不同网络之间提供内部连接,以供 Cassandra 用于在节点之间进行通信。 这可以通过 VPN 或云专用的连接解决方案来实现。
  • 在多个具有不同 CIDR 块的区域中设置 Kubernetes 集群
  • 确保每个集群中都安装了 cert-manager
  • 设置跨区域通信
  • 确保所有 Cassandra pod 都能够解析自己的主机名。如果 hostNetwork 设置为 false,则主机名是 Cassandra pod 名称。如果 hostNetwork 设置为 true,则主机名是运行 Cassandra pod 的 Kubernetes 节点主机名。
  • Cassandra 多区域要求:
    • 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行,这是 GKE On-Prem 安装的默认情况),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置 cassandra.hostNetwork: true,以启用 Kubernetes hostNetwork 功能。

      如需详细了解使用 hostNetwork 的需求,请参阅下面的孤岛模式集群和 hostNetwork

    • 请先在现有集群上启用 hostNetwork,然后再将多区域配置扩展到新区域。
    • 启用 hostNetwork 后,请确保工作器节点可以执行其主机名的正向 DNS 查找。Apigee Cassandra 使用正向 DNS 查找在启动时获取主机 IP。
    • 在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口

如需了解详情,请参阅 Kubernetes 文档。

AKS

  • 在不同的网络(例如不同的云服务提供商、不同的 VPC 网络、云端和本地等)之间安装多区域 Apigee 部署时,您必须在这些不同网络之间提供内部连接,以供 Cassandra 用于在节点之间进行通信。 这可以通过 VPN 或云专用的连接解决方案来实现。
  • 按照混合安装指南中的说明,在移到集群设置步骤之前,先满足 Google Cloud 和组织配置等前提条件。
  • 确保每个集群中都安装了 cert-manager
  • 确保所有 Cassandra pod 都能够解析自己的主机名。如果 hostNetwork 设置为 false,则主机名是 Cassandra pod 名称。如果 hostNetwork 设置为 true,则主机名是运行 Cassandra pod 的 Kubernetes 节点主机名。
  • Cassandra 多区域要求:
    • 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行,这是 AKS 安装的默认情况),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置 cassandra.hostNetwork: true,以启用 Kubernetes hostNetwork 功能。

      如需详细了解使用 hostNetwork 的需求,请参阅下面的孤岛模式集群和 hostNetwork

    • 请先在现有集群上启用 hostNetwork,然后再将多区域配置扩展到新区域。
    • 启用 hostNetwork 后,请确保工作器节点可以执行其主机名的正向 DNS 查找。Apigee Cassandra 使用正向 DNS 查找在启动时获取主机 IP。
    • 在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口

如需了解详情,请参阅 Kubernetes 文档。

EKS

  • 在不同的网络(例如不同的云服务提供商、不同的 VPC 网络、云端和本地等)之间安装多区域 Apigee 部署时,您必须在这些不同网络之间提供内部连接,以供 Cassandra 用于在节点之间进行通信。 这可以通过 VPN 或云专用的连接解决方案来实现。
  • 按照混合安装指南中的说明,在移到集群设置步骤之前,先满足 Google Cloud 和组织配置等前提条件。
  • 确保每个集群中都安装了 cert-manager
  • 确保所有 Cassandra pod 都能够解析自己的主机名。如果 hostNetwork 设置为 false,则主机名是 Cassandra pod 名称。如果 hostNetwork 设置为 true,则主机名是运行 Cassandra pod 的 Kubernetes 节点主机名。
  • Cassandra 多区域要求:
    • 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置 cassandra.hostNetwork: true,以启用 Kubernetes hostNetwork 功能。默认情况下,Amazon EKS 使用完全集成的网络模型

      如需详细了解使用 hostNetwork 的需求,请参阅下面的孤岛模式集群和 hostNetwork

    • 请先在现有集群上启用 hostNetwork,然后再将多区域配置扩展到新区域。
    • 启用 hostNetwork 后,请确保工作器节点可以执行其主机名的正向 DNS 查找。Apigee Cassandra 使用正向 DNS 查找在启动时获取主机 IP。
    • 在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口

如需了解详情,请参阅 Kubernetes 文档。

OpenShift

  • 在不同的网络(例如不同的云服务提供商、不同的 VPC 网络、云端和本地等)之间安装多区域 Apigee 部署时,您必须在这些不同网络之间提供内部连接,以供 Cassandra 用于在节点之间进行通信。 这可以通过 VPN 或云专用的连接解决方案来实现。
  • 按照混合安装指南中的说明,在移到集群设置步骤之前,先满足 Google Cloud 和组织配置等前提条件。
  • 确保每个集群中都安装了 cert-manager
  • 确保所有 Cassandra pod 都能够解析自己的主机名。如果 hostNetwork 设置为 false,则主机名是 Cassandra pod 名称。如果 hostNetwork 设置为 true,则主机名是运行 Cassandra pod 的 Kubernetes 节点主机名。
  • Cassandra 多区域要求:
    • 如果 pod 网络命名空间在集群之间没有连接(集群以“孤岛网络模式”运行,这是 OpenShift 安装的默认情况),请在 Apigee Hybrid 多区域安装的所有区域的替换文件中设置 cassandra.hostNetwork: true,以启用 Kubernetes hostNetwork 功能。

      如需详细了解使用 hostNetwork 的需求,请参阅下面的孤岛模式集群和 hostNetwork

    • 请先在现有集群上启用 hostNetwork,然后再将多区域配置扩展到新区域。
    • 启用 hostNetwork 后,请确保工作器节点可以执行其主机名的正向 DNS 查找。Apigee Cassandra 使用正向 DNS 查找在启动时获取主机 IP。
    • 在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口

如需了解详情,请参阅 Kubernetes 文档。

孤岛模式集群和 hostNetwork

Kubernetes 集群有两种主要网络模型:完全集成(或平面)和孤岛模式。Apigee 建议尽可能使用平面网络模型,因为它可以简化多区域 Cassandra 连接。在孤岛模式下配置 Kubernetes 集群时,Pod 网络是隔离的。Pod 无法使用 Pod IP 地址与其他集群中运行的 Pod 直接通信。如需详细了解这两种网络模型之间的差异以及每种模型的示例,请参阅典型的网络模型实现

当 Apigee Hybrid 使用孤岛模式网络模型在两个或多个 Kubernetes 集群上运行时,需要通过 cassandra.hostNetwork 属性启用 Cassandra 的 hostNetwork 设置。默认情况下,Kubernetes Pod 被隔离到单独的网络命名空间中,从而阻止其使用 Kubernetes 工作器节点 IP 地址。当 hostNetwork 设置为 true 时,Pod 不会隔离在自己的网络命名空间中,而是使用 Pod 调度到的 Kubernetes 工作器节点的 IP 地址和主机名。这样,Cassandra 便能以原生方式使用 Kubernetes 工作器节点 IP 作为其 IP,使 Cassandra 能够在以孤岛模式运行的多个集群中的所有 Cassandra Pod 之间建立全网状拓扑。

Cassandra 主机名解析

虽然 Cassandra Pod 不会按主机名解析其他 Cassandra Pod,但在启动时,Cassandra 会检查其主机名是否可被 DNS 解析。由于 hostNetwork 设置为 true 时,Pod 主机名与 Kubernetes 工作器节点主机名相同,因此工作器节点主机名必须能够通过集群 DNS 服务解析为 IP 地址。如果 Kubernetes 工作器节点主机名无法解析,则 Cassandra Pod 将无法完全启动。因此,在将 hostNetwork 设置为 true 时,Kubernetes 工作器节点主机名必须能够从集群中的 Pod 进行解析。

为多区域配置 Apigee Hybrid

本部分介绍如何为多区域配置 Apigee Hybrid。

GKE

配置多区域种子主机

本部分介绍如何将现有 Cassandra 集群扩展到新区域。 此设置允许新区域引导集群并加入现有数据中心。如果没有此配置,多区域 Kubernetes 集群不会相互了解。

  1. 在检索种子名称之前,将 kubectl 上下文设置为原始集群:
    kubectl config use-context original-cluster-name
  2. 运行以下 kubectl 命令,确定当前区域中 Cassandra 的种子宿主机地址。

    种子宿主机地址允许新区域实例在第一次启动时查找原始集群,以了解集群的拓扑。种子主机地址被指定为集群中的联络点。

    kubectl get pods -o wide -n apigee -l app=apigee-cassandra --field-selector status.phase=Running
    NAME                      READY   STATUS      RESTARTS   AGE   IP          NODE                                          NOMINATED NODE
    apigee-cassandra-default-0        1/1     Running     0          5d    10.0.0.11   gke-k8s-dc-2-default-pool-a2206492-p55d
    apigee-cassandra-default-1        1/1     Running     0          5d    10.0.2.4    gke-k8s-dc-2-default-pool-e9daaab3-tjmz
    apigee-cassandra-default-2        1/1     Running     0          5d    10.0.3.5    gke-k8s-dc-2-default-pool-e589awq3-kjch
  3. 确定上一个命令返回的哪些 IP 地址将成为多区域种子宿主机。
  4. 在数据中心 2 中,在管理运行时平面组件中配置 cassandra.multiRegionSeedHostcassandra.datacenter,其中 multiRegionSeedHost 是上一个命令返回的其中一个 IP:
    cassandra:
      multiRegionSeedHost: seed_host_IP
      datacenter: data_center_name
      rack: rack_name
      hostNetwork: false
      clusterName: cluster_name # must be the same for all regions

    例如:

    cassandra:
      multiRegionSeedHost: 10.0.0.11
      datacenter: "dc-2"
      rack: "ra-1"
      hostNetwork: false
      clusterName: my-apigee-cluster
  5. 在新数据中心/区域中,安装 Hybrid 之前,在 overrides.yaml 中设置您在第一个区域中设置的相同 TLS 证书和凭据。

设置新区域

配置种子主机后,您可以设置新区域。

要设置新区域,请执行以下操作

  1. 将证书从现有集群复制到新集群。Cassandra 和其他混合组件会将新 CA 根用于 mTLS。因此,务必确保集群具有一致的证书。
    1. 将上下文设置为原始命名空间:
      kubectl config use-context original-cluster-name
    2. 将当前命名空间配置导出到文件:
      kubectl get namespace namespace -o yaml > apigee-namespace.yaml
    3. apigee-ca Secret 导出到文件:
      kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
    4. 将上下文设置为新区域的集群名称:
      kubectl config use-context new-cluster-name
    5. 将命名空间配置导入新集群。如果您在新区域中使用不同的命名空间,请务必更新文件中的“命名空间”:
      kubectl apply -f apigee-namespace.yaml
    6. 将密钥导入新集群:

      kubectl -n cert-manager apply -f apigee-ca.yaml
  2. 在新区域中安装 Hybrid。请确保 overrides-DC_name.yaml 文件包含在第一个区域中配置的相同 TLS 证书,如上一部分所述。

    执行以下两个命令以在新区域中安装 Hybrid:

    apigeectl init -f overrides/overrides-DC_name.yaml
    apigeectl apply -f overrides/overrides-DC_name.yaml
  3. 通过运行以下命令来验证 Hybrid 安装是否成功:
    apigeectl check-ready -f overrides_DC_name.yaml
  4. 通过运行以下命令来验证 Cassandra 集群设置。输出应显示现有和新的数据中心。
    kubectl exec apigee-cassandra-default-0 -n apigee  \
      -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status

    显示成功设置的示例:

    Datacenter: dc-1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address        Load       Tokens  Owns  Host ID                               Rack
    UN  10.132.87.93   68.07 GiB  256     ?     fb51465c-167a-42f7-98c9-b6eba1de34de  c
    UN  10.132.84.94   69.9 GiB   256     ?     f621a5ac-e7ee-48a9-9a14-73d69477c642  b
    UN  10.132.84.105  76.95 GiB  256     ?     0561086f-e95b-4232-ba6c-ad519ff30336  d
    
    Datacenter: dc-2
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address        Load       Tokens  Owns  Host ID                               Rack
    UN  10.132.0.8     71.61 GiB  256     ?     8894a98b-8406-45de-99e2-f404ab10b5d6  c
    UN  10.132.9.204   75.1 GiB   256     ?     afa0ffa3-630b-4f1e-b46f-fc3df988092e  a
    UN  10.132.3.133   68.08 GiB  256     ?     25ae39ab-b39e-4d4f-9cb7-de095ab873db  b
  5. 在新数据中心中的所有 pod 上设置 Cassandra。
    1. 使用以下命令从集群中获取 apigeeorg
      kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
      

      例如:

      Ex: kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
      "rg-hybrid-b7d3b9c"
      
    2. 创建 cassandra 数据复制自定义资源 (YAML) 文件。该文件可以采用任何名称。在以下示例中,该文件的名称为 datareplication.yaml

      该文件必须包含以下内容:

      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: CassandraDataReplication
      metadata:
        name: REGION_EXPANSION
        namespace: NAMESPACE
      spec:
        organizationRef: APIGEEORG_VALUE
        force: false
        source:
          region: SOURCE_REGION

      其中:

      • REGION_EXPANSION 是您为此元数据指定的名称。您可以使用任意名称。
      • NAMESPACEoverrides.yaml 中提供的同一命名空间。它通常为“apigee”。
      • APIGEEORG_VALUE 是上一步中 kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name" 命令的输出值。例如 rg-hybrid-b7d3b9c
      • SOURCE_REGION 是来源区域,它是来自来源区域 overrides.yaml 的 cassandra 部分下的数据中心值

      例如:

      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: CassandraDataReplication
      metadata:
        name: region-expansion
        namespace: apigee
      spec:
        organizationRef: rg-hybrid-b7d3b9c
        force: false
        source:
          region: "dc-1"
    3. 使用以下命令应用 CassandraDataReplication
      kubectl apply -f datareplication.yaml
    4. 使用以下命令验证重建状态。
      kubectl -n apigee get apigeeds -o json | jq ".items[].status.cassandraDataReplication"

      结果应如下所示:

      {
        "rebuildDetails": {
          "apigee-cassandra-default-0": {
            "state": "complete",
            "updated": 1623105760
          },
          "apigee-cassandra-default-1": {
            "state": "complete",
            "updated": 1623105765
          },
          "apigee-cassandra-default-2": {
            "state": "complete",
            "updated": 1623105770
          }
        },
        "state": "complete",
        "updated": 1623105770
      }
  6. 从日志中验证重建进程。此外,使用 nodetool status 命令验证数据大小。
    kubectl logs apigee-cassandra-default-0 -f -n apigee
    kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status

    以下示例显示了日志条目示例:

    INFO  01:42:24 rebuild from dc: dc-1, (All keyspaces), (All tokens)
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Executing streaming plan for Rebuild
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.432KiB), sending 0 files(0.000KiB)
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.1.45 is complete
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.693KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.4.36 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 3 files(0.720KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.5.22 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] All sessions completed
  7. 更新种子主机。从 overrides-DC_name.yaml 中移除 multiRegionSeedHost: 10.0.0.11 并重新应用。
    apigeectl apply -f overrides/overrides-DC_name.yaml

检查 Cassandra 集群状态

以下命令可用于查看该集群在两个数据中心中是否成功设置。该命令将检查两个区域的 nodetool 状态。

kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status


Datacenter: dc-1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.12.1.45  112.09 KiB  256          100.0%            3c98c816-3f4d-48f0-9717-03d0c998637f  ra-1
UN  10.12.4.36  95.27 KiB  256          100.0%            0a36383d-1d9e-41e2-924c-7b62be12d6cc  ra-1
UN  10.12.5.22  88.7 KiB   256          100.0%            3561f4fa-af3d-4ea4-93b2-79ac7e938201  ra-1
Datacenter: us-west1
====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.0.4.33   78.69 KiB  256          100.0%              a200217d-260b-45cd-b83c-182b27ff4c99  ra-1
UN  10.0.0.21   78.68 KiB  256          100.0%              9f3364b9-a7a1-409c-9356-b7d1d312e52b  ra-1
UN  10.0.1.26   15.46 KiB  256          100.0%              1666df0f-702e-4c5b-8b6e-086d0f2e47fa  ra-1

GKE On-Prem

配置多区域种子主机

本部分介绍如何将现有 Cassandra 集群扩展到新区域。 此设置允许新区域引导集群并加入现有数据中心。如果没有此配置,多区域 Kubernetes 集群不会相互了解。

  1. 在原始集群的 overrides.yaml 文件中,确保将 cassandra:hostNetwork 设置为 true。例如:
    cassandra:
      hostNetwork: true

    如需详细了解何时设置 hostNetwork: true,请参阅前提条件

  2. 如果 cassandra:hostNetwork 未设置为 true,请执行以下操作:
    1. cassandra.hostNetwork 更改为 true
    2. 使用以下命令应用 overrides.yaml 配置文件:
        apigeectl apply -f overrides.yaml --datastore
        
    3. 等待 Cassandra pod 完成滚动重启。
    4. 使用以下命令验证 Cassandra 集群的运行状况是否良好:

        kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
        
        nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
        

      确保输出中的所有 Cassandra 节点处于 UN(启动/正常)状态:

        nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD describecluster
        

      确保输出中未列出任何无法访问的节点。

  3. 在检索种子名称之前,将 kubectl 上下文设置为原始集群:
    kubectl config use-context original-cluster-name
  4. 运行以下 kubectl 命令,确定当前区域中 Cassandra 的种子宿主机地址。

    种子宿主机地址允许新区域实例在第一次启动时查找原始集群,以了解集群的拓扑。种子主机地址被指定为集群中的联络点。

    kubectl get pods -o wide -n apigee -l app=apigee-cassandra --field-selector status.phase=Running
    NAME                      READY   STATUS      RESTARTS   AGE   IP          NODE                                          NOMINATED NODE
    apigee-cassandra-default-0        1/1     Running     0          5d    10.0.0.11   gke-k8s-dc-2-default-pool-a2206492-p55d
    apigee-cassandra-default-1        1/1     Running     0          5d    10.0.2.4    gke-k8s-dc-2-default-pool-e9daaab3-tjmz
    apigee-cassandra-default-2        1/1     Running     0          5d    10.0.3.5    gke-k8s-dc-2-default-pool-e589awq3-kjch
  5. 确定上一个命令返回的哪些 IP 地址将成为多区域种子宿主机。
  6. 在数据中心 2 中,在替换文件中配置 cassandra.multiRegionSeedHost,其中 multiRegionSeedHost 是上一个命令返回的其中一个 IP:
    cassandra:
      hostNetwork: true
      multiRegionSeedHost: seed_host_IP
      datacenter: data_center_name
      rack: rack_name
        clusterName: cluster_name # must be the same for all regions
    

    例如:

    cassandra:
      hostNetwork: true
      multiRegionSeedHost: 10.0.0.11
      datacenter: "dc-2"
      rack: "ra-1"
      clusterName: my-apigee-cluster
    
  7. 在新数据中心/区域中,安装 Hybrid 之前,在 overrides.yaml 中设置您在第一个区域中设置的相同 TLS 证书和凭据。

设置新区域

配置种子主机后,您可以设置新区域。

要设置新区域,请执行以下操作

  1. 将证书从现有集群复制到新集群。Cassandra 和其他混合组件会将新 CA 根用于 mTLS。因此,务必确保集群具有一致的证书。
    1. 将上下文设置为原始命名空间:
      kubectl config use-context original-cluster-name
    2. 将当前命名空间配置导出到文件:
      kubectl get namespace namespace -o yaml > apigee-namespace.yaml
    3. apigee-ca Secret 导出到文件:
      kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
    4. 将上下文设置为新区域的集群名称:
      kubectl config use-context new-cluster-name
    5. 将命名空间配置导入新集群。如果您在新区域中使用不同的命名空间,请务必更新文件中的“命名空间”:
      kubectl apply -f apigee-namespace.yaml
    6. 将密钥导入新集群:

      kubectl -n cert-manager apply -f apigee-ca.yaml
  2. 在新区域中安装 Hybrid。请确保 overrides-DC_name.yaml 文件包含在第一个区域中配置的相同 TLS 证书,如上一部分所述。

    执行以下两个命令以在新区域中安装 Hybrid:

    apigeectl init -f overrides/overrides-DC_name.yaml
    apigeectl apply -f overrides/overrides-DC_name.yaml
  3. 通过运行以下命令来验证 Hybrid 安装是否成功:
    apigeectl check-ready -f overrides_DC_name.yaml
  4. 通过运行以下命令来验证 Cassandra 集群设置。输出应显示现有和新的数据中心。
    kubectl exec apigee-cassandra-default-0 -n apigee  \
      -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status

    显示成功设置的示例:

    Datacenter: dc-1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address        Load       Tokens  Owns  Host ID                               Rack
    UN  10.132.87.93   68.07 GiB  256     ?     fb51465c-167a-42f7-98c9-b6eba1de34de  c
    UN  10.132.84.94   69.9 GiB   256     ?     f621a5ac-e7ee-48a9-9a14-73d69477c642  b
    UN  10.132.84.105  76.95 GiB  256     ?     0561086f-e95b-4232-ba6c-ad519ff30336  d
    
    Datacenter: dc-2
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address        Load       Tokens  Owns  Host ID                               Rack
    UN  10.132.0.8     71.61 GiB  256     ?     8894a98b-8406-45de-99e2-f404ab10b5d6  c
    UN  10.132.9.204   75.1 GiB   256     ?     afa0ffa3-630b-4f1e-b46f-fc3df988092e  a
    UN  10.132.3.133   68.08 GiB  256     ?     25ae39ab-b39e-4d4f-9cb7-de095ab873db  b
  5. 在新数据中心中的所有 pod 上设置 Cassandra。
    1. 使用以下命令从集群中获取 apigeeorg
      kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
      

      例如:

      Ex: kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
      "rg-hybrid-b7d3b9c"
      
    2. 创建 cassandra 数据复制自定义资源 (YAML) 文件。该文件可以采用任何名称。在以下示例中,该文件的名称为 datareplication.yaml

      该文件必须包含以下内容:

      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: CassandraDataReplication
      metadata:
        name: REGION_EXPANSION
        namespace: NAMESPACE
      spec:
        organizationRef: APIGEEORG_VALUE
        force: false
        source:
          region: SOURCE_REGION

      其中:

      • REGION_EXPANSION 是您为此元数据指定的名称。您可以使用任意名称。
      • NAMESPACEoverrides.yaml 中提供的同一命名空间。它通常为“apigee”。
      • APIGEEORG_VALUE 是上一步中 kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name" 命令的输出值。例如 rg-hybrid-b7d3b9c
      • SOURCE_REGION 是来源区域,它是来自来源区域 overrides.yaml 的 cassandra 部分下的数据中心值

      例如:

      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: CassandraDataReplication
      metadata:
        name: region-expansion
        namespace: apigee
      spec:
        organizationRef: rg-hybrid-b7d3b9c
        force: false
        source:
          region: "dc-1"
    3. 使用以下命令应用 CassandraDataReplication
      kubectl apply -f datareplication.yaml
    4. 使用以下命令验证重建状态。
      kubectl -n apigee get apigeeds -o json | jq ".items[].status.cassandraDataReplication"

      结果应如下所示:

      {
        "rebuildDetails": {
          "apigee-cassandra-default-0": {
            "state": "complete",
            "updated": 1623105760
          },
          "apigee-cassandra-default-1": {
            "state": "complete",
            "updated": 1623105765
          },
          "apigee-cassandra-default-2": {
            "state": "complete",
            "updated": 1623105770
          }
        },
        "state": "complete",
        "updated": 1623105770
      }
  6. 从日志中验证重建进程。此外,使用 nodetool status 命令验证数据大小。
    kubectl logs apigee-cassandra-default-0 -f -n apigee
    kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status

    以下示例显示了日志条目示例:

    INFO  01:42:24 rebuild from dc: dc-1, (All keyspaces), (All tokens)
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Executing streaming plan for Rebuild
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.432KiB), sending 0 files(0.000KiB)
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.1.45 is complete
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.693KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.4.36 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 3 files(0.720KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.5.22 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] All sessions completed
  7. 更新种子主机。从 overrides-DC_name.yaml 中移除 multiRegionSeedHost: 10.0.0.11 并重新应用。
    apigeectl apply -f overrides/overrides-DC_name.yaml

检查 Cassandra 集群状态

以下命令可用于查看该集群在两个数据中心中是否成功设置。该命令将检查两个区域的 nodetool 状态。

kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status


Datacenter: dc-1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.12.1.45  112.09 KiB  256          100.0%            3c98c816-3f4d-48f0-9717-03d0c998637f  ra-1
UN  10.12.4.36  95.27 KiB  256          100.0%            0a36383d-1d9e-41e2-924c-7b62be12d6cc  ra-1
UN  10.12.5.22  88.7 KiB   256          100.0%            3561f4fa-af3d-4ea4-93b2-79ac7e938201  ra-1
Datacenter: us-west1
====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.0.4.33   78.69 KiB  256          100.0%              a200217d-260b-45cd-b83c-182b27ff4c99  ra-1
UN  10.0.0.21   78.68 KiB  256          100.0%              9f3364b9-a7a1-409c-9356-b7d1d312e52b  ra-1
UN  10.0.1.26   15.46 KiB  256          100.0%              1666df0f-702e-4c5b-8b6e-086d0f2e47fa  ra-1

AKS

在每个区域中创建虚拟网络

按照此处的 Azure 建议建立跨区域通信:VNet 到 VNet:跨不同区域连接 Azure 中的虚拟网络

创建多区域集群

在多个具有不同 CIDR 块的区域中设置 Kubernetes 集群。另请参阅“第 1 步:创建集群”。使用您之前创建的位置和虚拟网络名称。

在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口

配置多区域种子主机

本部分介绍如何将现有 Cassandra 集群扩展到新区域。 此设置允许新区域引导集群并加入现有数据中心。如果没有此配置,多区域 Kubernetes 集群不会相互了解。

  1. 在原始集群的 overrides.yaml 文件中,确保将 cassandra:hostNetwork 设置为 true。例如:
    cassandra:
      hostNetwork: true

    如需详细了解何时设置 hostNetwork: true,请参阅前提条件

  2. 如果 cassandra:hostNetwork 未设置为 true,请执行以下操作:
    1. cassandra.hostNetwork 更改为 true
    2. 使用以下命令应用 overrides.yaml 配置文件:
        apigeectl apply -f overrides.yaml --datastore
        
    3. 等待 Cassandra pod 完成滚动重启。
    4. 使用以下命令验证 Cassandra 集群的运行状况是否良好:

        kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
        
        nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
        

      确保输出中的所有 Cassandra 节点处于 UN(启动/正常)状态:

        nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD describecluster
        

      确保输出中未列出任何无法访问的节点。

  3. 在检索种子名称之前,将 kubectl 上下文设置为原始集群:
    kubectl config use-context original-cluster-name
  4. 运行以下 kubectl 命令,确定当前区域中 Cassandra 的种子宿主机地址。

    种子宿主机地址允许新区域实例在第一次启动时查找原始集群,以了解集群的拓扑。种子主机地址被指定为集群中的联络点。

    kubectl get pods -o wide -n apigee -l app=apigee-cassandra --field-selector status.phase=Running
    apigee-cassandra-default-0  1/1   Running   0   4d17h   120.38.1.9  aks-agentpool-21207753-vmss000000
    
  5. 确定上一个命令返回的哪些 IP 地址将成为多区域种子宿主机。 在本示例中,只有一个节点 Cassandra 集群正在运行时,种子宿主机为 120.38.1.9
  6. 在数据中心 2 中,将替换文件复制到名称包含集群名称的新文件。例如:overrides_your_cluster_name.yaml
  7. 在数据中心 2 中,在 overrides_your_cluster_name.yaml 中配置 cassandra.multiRegionSeedHostcassandra.datacenter,其中 multiRegionSeedHost 是上一个命令返回的其中一个 IP:
    cassandra:
         multiRegionSeedHost: seed_host_IP
         datacenter: data_center_name
         rack: rack_name
         hostNetwork: true
         clusterName: cluster_name # must be the same for all regions

    例如:

    cassandra:
      multiRegionSeedHost: 120.38.1.9
      datacenter: "centralus"
      rack: "ra-1"
      hostNetwork: true
      clusterName: my-apigee-cluster
  8. 在新数据中心/区域中,安装 Hybrid 之前,在 overrides_your_cluster_name.yaml 中设置您在第一个区域中设置的相同 TLS 证书和凭据。

设置新区域

配置种子主机后,您可以设置新区域。

要设置新区域,请执行以下操作

  1. 将证书从现有集群复制到新集群。Cassandra 和其他混合组件会将新 CA 根用于 mTLS。因此,务必确保集群具有一致的证书。
    1. 将上下文设置为原始命名空间:
      kubectl config use-context original-cluster-name
    2. 将当前命名空间配置导出到文件:
      kubectl get namespace namespace -o yaml > apigee-namespace.yaml
    3. apigee-ca Secret 导出到文件:
      kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
    4. 将上下文设置为新区域的集群名称:
      kubectl config use-context new-cluster-name
    5. 将命名空间配置导入新集群。如果您在新区域中使用不同的命名空间,请务必更新文件中的“命名空间”:
      kubectl apply -f apigee-namespace.yaml
    6. 将密钥导入新集群:

      kubectl -n cert-manager apply -f apigee-ca.yaml
  2. 在新区域中安装 Hybrid。请确保 overrides_your_cluster_name.yaml 文件包含在第一个区域中配置的相同 TLS 证书,如上一部分所述。

    执行以下两个命令以在新区域中安装 Hybrid:

    apigeectl init -f overrides_your_cluster_name.yaml
    apigeectl apply -f overrides_your_cluster_name.yaml
  3. 通过运行以下命令来验证 Hybrid 安装是否成功:
    apigeectl check-ready -f overrides_your_cluster_name.yaml
  4. 通过运行以下命令来验证 Cassandra 集群设置。输出应显示现有和新的数据中心。
    kubectl exec apigee-cassandra-default-0 -n apigee  \
      -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status

    显示成功设置的示例:

    Datacenter: dc-1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address        Load       Tokens  Owns  Host ID                               Rack
    UN  10.132.87.93   68.07 GiB  256     ?     fb51465c-167a-42f7-98c9-b6eba1de34de  c
    UN  10.132.84.94   69.9 GiB   256     ?     f621a5ac-e7ee-48a9-9a14-73d69477c642  b
    UN  10.132.84.105  76.95 GiB  256     ?     0561086f-e95b-4232-ba6c-ad519ff30336  d
    
    Datacenter: dc-2
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address        Load       Tokens  Owns  Host ID                               Rack
    UN  10.132.0.8     71.61 GiB  256     ?     8894a98b-8406-45de-99e2-f404ab10b5d6  c
    UN  10.132.9.204   75.1 GiB   256     ?     afa0ffa3-630b-4f1e-b46f-fc3df988092e  a
    UN  10.132.3.133   68.08 GiB  256     ?     25ae39ab-b39e-4d4f-9cb7-de095ab873db  b
  5. 在新数据中心中的所有 pod 上设置 Cassandra。
    1. 使用以下命令从集群中获取 apigeeorg
      kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
      

      例如:

      Ex: kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
      "rg-hybrid-b7d3b9c"
      
    2. 创建 cassandra 数据复制自定义资源 (YAML) 文件。该文件可以采用任何名称。在以下示例中,该文件的名称为 datareplication.yaml

      该文件必须包含以下内容:

      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: CassandraDataReplication
      metadata:
        name: REGION_EXPANSION
        namespace: NAMESPACE
      spec:
        organizationRef: APIGEEORG_VALUE
        force: false
        source:
          region: SOURCE_REGION

      其中:

      • REGION_EXPANSION 是您为此元数据指定的名称。您可以使用任意名称。
      • NAMESPACEoverrides.yaml 中提供的同一命名空间。它通常为“apigee”。
      • APIGEEORG_VALUE 是上一步中 kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name" 命令的输出值。例如 rg-hybrid-b7d3b9c
      • SOURCE_REGION 是来源区域,它是来自来源区域 overrides.yaml 的 cassandra 部分下的数据中心值

      例如:

      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: CassandraDataReplication
      metadata:
        name: region-expansion
        namespace: apigee
      spec:
        organizationRef: rg-hybrid-b7d3b9c
        force: false
        source:
          region: "dc-1"
    3. 使用以下命令应用 CassandraDataReplication
      kubectl apply -f datareplication.yaml
    4. 使用以下命令验证重建状态。
      kubectl -n apigee get apigeeds -o json | jq ".items[].status.cassandraDataReplication"

      结果应如下所示:

      {
        "rebuildDetails": {
          "apigee-cassandra-default-0": {
            "state": "complete",
            "updated": 1623105760
          },
          "apigee-cassandra-default-1": {
            "state": "complete",
            "updated": 1623105765
          },
          "apigee-cassandra-default-2": {
            "state": "complete",
            "updated": 1623105770
          }
        },
        "state": "complete",
        "updated": 1623105770
      }
  6. 从日志中验证重建进程。此外,使用 nodetool status 命令验证数据大小。
    kubectl logs apigee-cassandra-default-0 -f -n apigee
    kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status

    以下示例显示了日志条目示例:

    INFO  01:42:24 rebuild from dc: dc-1, (All keyspaces), (All tokens)
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Executing streaming plan for Rebuild
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.432KiB), sending 0 files(0.000KiB)
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.1.45 is complete
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.693KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.4.36 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 3 files(0.720KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.5.22 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] All sessions completed
  7. 更新种子主机。从 overrides-DC_name.yaml 中移除 multiRegionSeedHost: 10.0.0.11 并重新应用。
    apigeectl apply -f overrides/overrides-DC_name.yaml

检查 Cassandra 集群状态

以下命令可用于查看该集群在两个数据中心中是否成功设置。该命令将检查两个区域的 nodetool 状态。

kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status


Datacenter: dc-1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.12.1.45  112.09 KiB  256          100.0%            3c98c816-3f4d-48f0-9717-03d0c998637f  ra-1
UN  10.12.4.36  95.27 KiB  256          100.0%            0a36383d-1d9e-41e2-924c-7b62be12d6cc  ra-1
UN  10.12.5.22  88.7 KiB   256          100.0%            3561f4fa-af3d-4ea4-93b2-79ac7e938201  ra-1
Datacenter: us-west1
====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.0.4.33   78.69 KiB  256          100.0%              a200217d-260b-45cd-b83c-182b27ff4c99  ra-1
UN  10.0.0.21   78.68 KiB  256          100.0%              9f3364b9-a7a1-409c-9356-b7d1d312e52b  ra-1
UN  10.0.1.26   15.46 KiB  256          100.0%              1666df0f-702e-4c5b-8b6e-086d0f2e47fa  ra-1

EKS

在每个区域中创建虚拟网络

按照 AWS 建议建立跨区域通信,如什么是 VPC 对等互连?中所述。用于不同区域的 AWS 术语是“区域间 VPC 对等互连”

创建多区域集群

在多个具有不同 CIDR 块的区域中设置 Kubernetes 集群。另请参阅“第 1 步:创建集群”。使用您之前创建的位置和虚拟网络名称。

在跨所有区域的 Kubernetes 集群之间打开 Cassandra 端口,使跨区域和数据中心的工作器节点能够进行通信。如需了解 Cassandra 端口号,请参阅配置端口

配置多区域种子主机

本部分介绍如何将现有 Cassandra 集群扩展到新区域。 此设置允许新区域引导集群并加入现有数据中心。如果没有此配置,多区域 Kubernetes 集群不会相互了解。

  1. 在原始集群的 overrides.yaml 文件中,确保将 cassandra:hostNetwork 设置为 true。例如:
    cassandra:
      hostNetwork: true

    如需详细了解何时设置 hostNetwork: true,请参阅前提条件

  2. 如果 cassandra:hostNetwork 未设置为 true,请执行以下操作:
    1. cassandra.hostNetwork 更改为 true
    2. 使用以下命令应用 overrides.yaml 配置文件:
        apigeectl apply -f overrides.yaml --datastore
        
    3. 等待 Cassandra pod 完成滚动重启。
    4. 使用以下命令验证 Cassandra 集群的运行状况是否良好:

        kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
        
        nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD status
        

      确保输出中的所有 Cassandra 节点处于 UN(启动/正常)状态:

        nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD describecluster
        

      确保输出中未列出任何无法访问的节点。

  3. 在检索种子名称之前,将 kubectl 上下文设置为原始集群:
    kubectl config use-context original-cluster-name
  4. 运行以下 kubectl 命令,确定当前区域中 Cassandra 的种子宿主机地址。

    种子宿主机地址允许新区域实例在第一次启动时查找原始集群,以了解集群的拓扑。种子主机地址被指定为集群中的联络点。

    kubectl get pods -o wide -n apigee | grep apigee-cassandra
    apigee-cassandra-default-0  1/1   Running   0   4d17h   120.38.1.9  aks-agentpool-21207753-vmss000000
    
  5. 确定上一个命令返回的哪些 IP 地址将成为多区域种子宿主机。 在本示例中,只有一个节点 Cassandra 集群正在运行时,种子宿主机为 120.38.1.9
  6. 在数据中心 2 中,将替换文件复制到名称包含集群名称的新文件。例如:overrides_your_cluster_name.yaml
  7. 在数据中心 2 中,在 overrides_your_cluster_name.yaml 中配置 cassandra.multiRegionSeedHostcassandra.datacenter,其中 multiRegionSeedHost 是上一个命令返回的其中一个 IP:
    cassandra:
         multiRegionSeedHost: seed_host_IP
         datacenter: data_center_name
         rack: rack_name
         hostNetwork: true
         clusterName: cluster_name # must be the same for all regions

    例如:

    cassandra:
      multiRegionSeedHost: 120.38.1.9
      datacenter: "centralus"
      rack: "ra-1"
      hostNetwork: true
      clusterName: my-apigee-cluster
  8. 在新数据中心/区域中,安装 Hybrid 之前,在 overrides_your_cluster_name.yaml 中设置您在第一个区域中设置的相同 TLS 证书和凭据。

设置新区域

配置种子主机后,您可以设置新区域。

要设置新区域,请执行以下操作

  1. 将证书从现有集群复制到新集群。Cassandra 和其他混合组件会将新 CA 根用于 mTLS。因此,务必确保集群具有一致的证书。
    1. 将上下文设置为原始命名空间:
      kubectl config use-context original-cluster-name
    2. 将当前命名空间配置导出到文件:
      kubectl get namespace namespace -o yaml > apigee-namespace.yaml
    3. apigee-ca Secret 导出到文件:
      kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
    4. 将上下文设置为新区域的集群名称:
      kubectl config use-context new-cluster-name
    5. 将命名空间配置导入新集群。如果您在新区域中使用不同的命名空间,请务必更新文件中的“命名空间”:
      kubectl apply -f apigee-namespace.yaml
    6. 将密钥导入新集群:

      kubectl -n cert-manager apply -f apigee-ca.yaml
  2. 在新区域中安装 Hybrid。请确保 overrides_your_cluster_name.yaml 文件包含在第一个区域中配置的相同 TLS 证书,如上一部分所述。

    执行以下两个命令以在新区域中安装 Hybrid:

    apigeectl init -f overrides_your_cluster_name.yaml
    apigeectl apply -f overrides_your_cluster_name.yaml
  3. 通过运行以下命令来验证 Hybrid 安装是否成功:
    apigeectl check-ready -f overrides_your_cluster_name.yaml
  4. 通过运行以下命令来验证 Cassandra 集群设置。输出应显示现有和新的数据中心。
    kubectl exec apigee-cassandra-default-0 -n apigee  \
      -- nodetool -u JMX_user -pw JMX_password status

    显示成功设置的示例:

    Datacenter: dc-1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address        Load       Tokens  Owns  Host ID                               Rack
    UN  10.132.87.93   68.07 GiB  256     ?     fb51465c-167a-42f7-98c9-b6eba1de34de  c
    UN  10.132.84.94   69.9 GiB   256     ?     f621a5ac-e7ee-48a9-9a14-73d69477c642  b
    UN  10.132.84.105  76.95 GiB  256     ?     0561086f-e95b-4232-ba6c-ad519ff30336  d
    
    Datacenter: dc-2
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address        Load       Tokens  Owns  Host ID                               Rack
    UN  10.132.0.8     71.61 GiB  256     ?     8894a98b-8406-45de-99e2-f404ab10b5d6  c
    UN  10.132.9.204   75.1 GiB   256     ?     afa0ffa3-630b-4f1e-b46f-fc3df988092e  a
    UN  10.132.3.133   68.08 GiB  256     ?     25ae39ab-b39e-4d4f-9cb7-de095ab873db  b
  5. 在新数据中心中的所有 pod 上设置 Cassandra。
    1. 使用以下命令从集群中获取 apigeeorg
      kubectl get apigeeorg -n apigee -o json | jq .items[].metadata.name
      

      例如:

      Ex: kubectl get apigeeorg -n apigee -o json | jq .items[].metadata.name
      "rg-hybrid-b7d3b9c"
      
    2. 创建 cassandra 数据复制自定义资源 (YAML) 文件。该文件可以采用任何名称。在以下示例中,该文件的名称为 datareplication.yaml

      该文件必须包含以下内容:

      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: CassandraDataReplication
      metadata:
        name: REGION_EXPANSION
        namespace: NAMESPACE
      spec:
        organizationRef: APIGEEORG_VALUE
        force: false
        source:
          region: SOURCE_REGION

      其中:

      • REGION_EXPANSION 是您为此元数据指定的名称。您可以使用任意名称。
      • NAMESPACEoverrides.yaml 中提供的同一命名空间。它通常为“apigee”。
      • APIGEEORG_VALUE 是上一步中 kubectl get apigeeorg -n apigee -o json | jq .items[].metadata.name 命令的输出值。例如 rg-hybrid-b7d3b9c
      • SOURCE_REGION 是来源区域,它是来自来源区域 overrides.yaml 的 cassandra 部分下的数据中心值

      例如:

      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: CassandraDataReplication
      metadata:
        name: region-expansion
        namespace: apigee
      spec:
        organizationRef: rg-hybrid-b7d3b9c
        force: false
        source:
          region: "dc-1"
    3. 使用以下命令应用 CassandraDataReplication
      kubectl apply -f datareplication.yaml
    4. 使用以下命令验证重建状态。
      kubectl -n apigee get apigeeds -o json | jq .items[].status.cassandraDataReplication

      结果应如下所示:

      {
        "rebuildDetails": {
          "apigee-cassandra-default-0": {
            "state": "complete",
            "updated": 1623105760
          },
          "apigee-cassandra-default-1": {
            "state": "complete",
            "updated": 1623105765
          },
          "apigee-cassandra-default-2": {
            "state": "complete",
            "updated": 1623105770
          }
        },
        "state": "complete",
        "updated": 1623105770
      }
  6. 从日志中验证重建进程。此外,使用 nodetool status 命令验证数据大小:
    kubectl logs apigee-cassandra-default-0 -f -n apigee
    kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u JMX_user -pw JMX_password status

    以下示例显示了日志条目示例:

    INFO  01:42:24 rebuild from dc: dc-1, (All keyspaces), (All tokens)
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Executing streaming plan for Rebuild
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.432KiB), sending 0 files(0.000KiB)
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.1.45 is complete
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.693KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.4.36 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 3 files(0.720KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.5.22 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] All sessions completed
  7. 更新种子主机。从 overrides-DC_name.yaml 中移除 multiRegionSeedHost: 10.0.0.11 并重新应用。
    apigeectl apply -f overrides/overrides-DC_name.yaml

检查 Cassandra 集群状态

以下命令可用于查看该集群在两个数据中心中是否成功设置。该命令将检查两个区域的 nodetool 状态。

kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u JMX_user -pw JMX_password status


Datacenter: dc-1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.12.1.45  112.09 KiB  256          100.0%            3c98c816-3f4d-48f0-9717-03d0c998637f  ra-1
UN  10.12.4.36  95.27 KiB  256          100.0%            0a36383d-1d9e-41e2-924c-7b62be12d6cc  ra-1
UN  10.12.5.22  88.7 KiB   256          100.0%            3561f4fa-af3d-4ea4-93b2-79ac7e938201  ra-1
Datacenter: us-west1
====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.0.4.33   78.69 KiB  256          0.0%              a200217d-260b-45cd-b83c-182b27ff4c99  ra-1
UN  10.0.0.21   78.68 KiB  256          0.0%              9f3364b9-a7a1-409c-9356-b7d1d312e52b  ra-1
UN  10.0.1.26   15.46 KiB  256          0.0%              1666df0f-702e-4c5b-8b6e-086d0f2e47fa  ra-1

OpenShift

配置多区域种子主机

本部分介绍如何将现有 Cassandra 集群扩展到新区域。 此设置允许新区域引导集群并加入现有数据中心。如果没有此配置,多区域 Kubernetes 集群不会相互了解。

  1. 在原始集群的 overrides.yaml 文件中,确保将 cassandra:hostNetwork 设置为 true。例如:
    cassandra:
      hostNetwork: true

    如需详细了解何时设置 hostNetwork: true,请参阅前提条件

  2. 如果 cassandra:hostNetwork 未设置为 true,请执行以下操作:
    1. cassandra.hostNetwork 更改为 true
    2. 使用以下命令应用 overrides.yaml 配置文件:
        apigeectl apply -f overrides.yaml --datastore
        
    3. 等待 Cassandra pod 完成滚动重启。
    4. 使用以下命令验证 Cassandra 集群的运行状况是否良好:

        kubectl exec -it -n apigee apigee-cassandra-default-0 -- /bin/bash
        
        nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status
        

      确保输出中的所有 Cassandra 节点处于 UN(启动/正常)状态:

        nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD describecluster
        

      确保输出中未列出任何无法访问的节点。

  3. 在检索种子名称之前,将 kubectl 上下文设置为原始集群:
    kubectl config use-context original-cluster-name
  4. 运行以下 kubectl 命令,确定当前区域中 Cassandra 的种子宿主机地址。

    种子宿主机地址允许新区域实例在第一次启动时查找原始集群,以了解集群的拓扑。种子主机地址被指定为集群中的联络点。

    kubectl get pods -o wide -n apigee -l app=apigee-cassandra --field-selector status.phase=Running
    NAME                      READY   STATUS      RESTARTS   AGE   IP          NODE                                          NOMINATED NODE
    apigee-cassandra-default-0        1/1     Running     0          5d    10.0.0.11   gke-k8s-dc-2-default-pool-a2206492-p55d
    apigee-cassandra-default-1        1/1     Running     0          5d    10.0.2.4    gke-k8s-dc-2-default-pool-e9daaab3-tjmz
    apigee-cassandra-default-2        1/1     Running     0          5d    10.0.3.5    gke-k8s-dc-2-default-pool-e589awq3-kjch
  5. 选择要用作多区域种子主机的源 Cassandra 主机的 IP 地址。在此示例中,这是 apigee-cassandra-default-0 集群运行,种子主机为 10.0.0.11
  6. 在数据中心 2 中,将替换文件复制到名称包含集群名称的新文件。例如:overrides_your_cluster_name.yaml
  7. 在数据中心 2 中,在 overrides_your_cluster_name.yaml 中配置 cassandra.multiRegionSeedHostcassandra.datacenter,其中 multiRegionSeedHost 是上一个命令返回的其中一个 IP:
    cassandra:
         hostNetwork: true
         multiRegionSeedHost: seed_host_IP # Cassandra pod IP address from the source region.
         datacenter: data_center_name
         rack: rack_name
         clusterName: cluster_name # must be the same for all regions

    例如:

    cassandra:
      hostNetwork: true
      multiRegionSeedHost: 10.0.0.11
      datacenter: "dc-2"
      rack: "ra-1"
      clusterName: my-apigee-cluster
  8. 在新数据中心/区域中,安装 Hybrid 之前,在 overrides_your_cluster_name.yaml 中设置您在第一个区域中设置的相同 TLS 证书和凭据。

设置新区域

配置种子主机后,您可以设置新区域。

要设置新区域,请执行以下操作

  1. 将证书从现有集群复制到新集群。Cassandra 和其他混合组件会将新 CA 根用于 mTLS。因此,务必确保集群具有一致的证书。
    1. 将上下文设置为原始命名空间:
      kubectl config use-context original-cluster-name
    2. 将当前命名空间配置导出到文件:
      kubectl get namespace namespace -o yaml > apigee-namespace.yaml
    3. apigee-ca Secret 导出到文件:
      kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
    4. 将上下文设置为新区域的集群名称:
      kubectl config use-context new-cluster-name
    5. 将命名空间配置导入新集群。如果您在新区域中使用不同的命名空间,请务必更新文件中的“命名空间”:
      kubectl apply -f apigee-namespace.yaml
    6. 将密钥导入新集群:

      kubectl -n cert-manager apply -f apigee-ca.yaml
  2. 在新区域中安装 Hybrid。请确保 overrides_your_cluster_name.yaml 文件包含在第一个区域中配置的相同 TLS 证书,如上一部分所述。

    执行以下两个命令以在新区域中安装 Hybrid:

    apigeectl init -f overrides_your_cluster_name.yaml
    apigeectl apply -f overrides_your_cluster_name.yaml
  3. 通过运行以下命令来验证 Hybrid 安装是否成功:
    apigeectl check-ready -f overrides_your_cluster_name.yaml
  4. 通过运行以下命令来验证 Cassandra 集群设置。输出应显示现有和新的数据中心。
    kubectl exec apigee-cassandra-default-0 -n apigee  \
      -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status

    显示成功设置的示例:

    Datacenter: dc-1
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address        Load       Tokens  Owns  Host ID                               Rack
    UN  10.132.87.93   68.07 GiB  256     ?     fb51465c-167a-42f7-98c9-b6eba1de34de  c
    UN  10.132.84.94   69.9 GiB   256     ?     f621a5ac-e7ee-48a9-9a14-73d69477c642  b
    UN  10.132.84.105  76.95 GiB  256     ?     0561086f-e95b-4232-ba6c-ad519ff30336  d
    
    Datacenter: dc-2
    ====================
    Status=Up/Down
    |/ State=Normal/Leaving/Joining/Moving
    --  Address        Load       Tokens  Owns  Host ID                               Rack
    UN  10.132.0.8     71.61 GiB  256     ?     8894a98b-8406-45de-99e2-f404ab10b5d6  c
    UN  10.132.9.204   75.1 GiB   256     ?     afa0ffa3-630b-4f1e-b46f-fc3df988092e  a
    UN  10.132.3.133   68.08 GiB  256     ?     25ae39ab-b39e-4d4f-9cb7-de095ab873db  b
  5. 在新数据中心中的所有 pod 上设置 Cassandra。
    1. 使用以下命令从集群中获取 apigeeorg
      kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
      

      例如:

      Ex: kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name"
      "rg-hybrid-b7d3b9c"
      
    2. 创建 cassandra 数据复制自定义资源 (YAML) 文件。该文件可以采用任何名称。在以下示例中,该文件的名称为 datareplication.yaml

      该文件必须包含以下内容:

      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: CassandraDataReplication
      metadata:
        name: REGION_EXPANSION
        namespace: NAMESPACE
      spec:
        organizationRef: APIGEEORG_VALUE
        force: false
        source:
          region: SOURCE_REGION

      其中:

      • REGION_EXPANSION 是您为此元数据指定的名称。您可以使用任意名称。
      • NAMESPACEoverrides.yaml 中提供的同一命名空间。它通常为“apigee”。
      • APIGEEORG_VALUE 是上一步中 kubectl get apigeeorg -n apigee -o json | jq ".items[].metadata.name" 命令的输出值。例如 rg-hybrid-b7d3b9c
      • SOURCE_REGION 是来源区域,它是来自来源区域 overrides.yaml 的 cassandra 部分下的数据中心值

      例如:

      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: CassandraDataReplication
      metadata:
        name: region-expansion
        namespace: apigee
      spec:
        organizationRef: rg-hybrid-b7d3b9c
        force: false
        source:
          region: "dc-1"
    3. 使用以下命令应用 CassandraDataReplication
      kubectl apply -f datareplication.yaml
    4. 使用以下命令验证重建状态。
      kubectl -n apigee get apigeeds -o json | jq ".items[].status.cassandraDataReplication"

      结果应如下所示:

      {
        "rebuildDetails": {
          "apigee-cassandra-default-0": {
            "state": "complete",
            "updated": 1623105760
          },
          "apigee-cassandra-default-1": {
            "state": "complete",
            "updated": 1623105765
          },
          "apigee-cassandra-default-2": {
            "state": "complete",
            "updated": 1623105770
          }
        },
        "state": "complete",
        "updated": 1623105770
      }
  6. 从日志中验证重建进程。此外,使用 nodetool status 命令验证数据大小。
    kubectl logs apigee-cassandra-default-0 -f -n apigee
    kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status

    以下示例显示了日志条目示例:

    INFO  01:42:24 rebuild from dc: dc-1, (All keyspaces), (All tokens)
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Executing streaming plan for Rebuild
    INFO  01:42:24 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.1.45
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.432KiB), sending 0 files(0.000KiB)
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.1.45 is complete
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.4.36
    INFO  01:42:25 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Starting streaming to /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 1 files(0.693KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.4.36 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889, ID#0] Beginning stream session with /10.12.5.22
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889 ID#0] Prepare completed. Receiving 3 files(0.720KiB), sending 0 files(0.000KiB)
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] Session with /10.12.5.22 is complete
    INFO  01:42:26 [Stream #3a04e810-580d-11e9-a5aa-67071bf82889] All sessions completed
  7. 更新种子主机。从 overrides-DC_name.yaml 中移除 multiRegionSeedHost: 10.0.0.11 并重新应用。
    apigeectl apply -f overrides/overrides-DC_name.yaml

检查 Cassandra 集群状态

以下命令可用于查看该集群在两个数据中心中是否成功设置。该命令将检查两个区域的 nodetool 状态。

kubectl exec apigee-cassandra-default-0 -n apigee  -- nodetool -u APIGEE_JMX_USER -pw APIGEE_JMX_PASSWORD status


Datacenter: dc-1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.12.1.45  112.09 KiB  256          100.0%            3c98c816-3f4d-48f0-9717-03d0c998637f  ra-1
UN  10.12.4.36  95.27 KiB  256          100.0%            0a36383d-1d9e-41e2-924c-7b62be12d6cc  ra-1
UN  10.12.5.22  88.7 KiB   256          100.0%            3561f4fa-af3d-4ea4-93b2-79ac7e938201  ra-1
Datacenter: us-west1
====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.0.4.33   78.69 KiB  256          100.0%              a200217d-260b-45cd-b83c-182b27ff4c99  ra-1
UN  10.0.0.21   78.68 KiB  256          100.0%              9f3364b9-a7a1-409c-9356-b7d1d312e52b  ra-1
UN  10.0.1.26   15.46 KiB  256          100.0%              1666df0f-702e-4c5b-8b6e-086d0f2e47fa  ra-1

问题排查

请参阅 Cassandra 数据复制失败