第 10 章 设置跨站点复制

通过配置跨站点复制以在 Data Grid 集群间备份数据,确保通过 Data Grid Operator 的服务可用性。

10.1. 使用 Data Grid Operator 管理跨站点连接

一个数据中心的 Data Grid Operator 可以发现 Data Grid Operator 在另一个数据中心中管理的数据网格集群。此发现允许 Data Grid 自动形成跨站点视图并创建全局集群。

下图提供了一个示例,其中 Data Grid Operator 在 New York City NYC 的数据中心管理 Data Grid 集群。在伦敦的另一台数据中心,LON,Data Grid Operator 还管理一个 Data Grid 集群。

Data Grid Operator 使用 Kubernetes API 在 NYCLON 的 OpenShift Container Platform 集群间建立安全连接。然后,Data Grid Operator 会创建跨站点复制服务,以便数据可以在不同位置备份数据。

重要

每个 OpenShift 集群中的 Data Grid Operator 必须有对远程 Kubernetes API 的网络访问权限。

注意

当您配置自动连接时,Data Grid 集群不会开始运行,直到 Data Grid Operator 发现配置中的所有备份位置为止。

每个 Data Grid 集群都有一个站点 master 节点,用于协调所有备份请求。Data Grid Operator 标识站点 master 节点,以便通过跨站点复制服务的所有流量都进入站点 master。

如果当前站点 master 节点离线,则新节点变为站点 master。Data Grid Operator 会自动找到新的站点 master 节点,并更新跨站点复制服务来向它转发备份请求。

10.1.1. 创建服务帐户令牌

在每个作为备份位置的每个 OpenShift 集群上生成服务帐户令牌。集群使用这些令牌来相互进行身份验证,以便 Data Grid Operator 可以创建跨站点复制服务。

流程

  1. 登录 OpenShift 集群。
  2. 创建一个服务帐户。

    例如,在 LON 创建服务帐户:

    $ oc create sa lon
    serviceaccount/lon created
  3. 使用以下命令在服务帐户中添加 view 角色:

    $ oc policy add-role-to-user view system:serviceaccount:<namespace>:lon
  4. 如果使用节点端口服务在网络上公开 Data Grid 集群,还必须将 cluster-reader 角色添加到服务帐户中:

    $ oc adm policy add-cluster-role-to-user cluster-reader -z <service-account-name> -n <namespace>
  5. 在其他 OpenShift 集群上重复上述步骤。

10.1.2. 交换服务帐户令牌

在 OpenShift 集群中创建服务帐户令牌后,您可以将其添加到每个备份位置的 secret 中。例如,在 LON 中,您可以为 NYC 添加服务帐户令牌。在 NYC 中,您可以为 LON 添加服务帐户令牌。

先决条件

  • 从每个服务帐户获取令牌。

    使用以下命令或从 OpenShift Web 控制台获取令牌:

    $ oc sa get-token lon
    
    eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9...

流程

  1. 登录 OpenShift 集群。
  2. 使用以下命令为备份位置添加服务帐户令牌:

    $ oc create secret generic <token-name> --from-literal=token=<token>

    例如,登录到 NYC 的 OpenShift 集群,并创建一个 lon-token secret,如下所示:

    $ oc create secret generic lon-token --from-literal=token=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9...
  3. 在其他 OpenShift 集群上重复上述步骤。

10.1.3. 配置 Data Grid Operator 以处理跨站点连接

配置 Data Grid Operator,以使用 Data Grid 集群建立跨站点视图。

先决条件

  • 创建包含每个备份位置的服务帐户令牌的 secret。

流程

  1. 为每个 Data Grid 集群创建一个 Infinispan CR。
  2. 使用 spec.service.sites.local.name 指定本地站点的名称。
  3. spec.service.sites.local.expose.type 字段的值设置为 NodePortLoadBalancer
  4. (可选)使用以下字段配置端口:

    • 如果使用 NodePortspec.service.sites.local.expose.nodePort
    • 如果使用 LoadBalancer,则 spec.service.sites.local.expose.port
  5. 为每个 Data Grid 集群提供名称、URL 和 secret,它们充当 spec.service.sites.locations 的备份位置。
  6. 如果远程站点上的 Data Grid 集群名称或命名空间与本地站点不匹配,请使用 clusterNamenamespace 字段指定这些值。

    以下是 LONNYCInfinispan CR 定义示例:

    • LON

      apiVersion: infinispan.org/v1
      kind: Infinispan
      metadata:
        name: example-infinispan
      spec:
        replicas: 3
        service:
          type: DataGrid
          sites:
            local:
              name: LON
              expose:
                type: LoadBalancer
                port: 65535
            locations:
              - name: NYC
                clusterName: <nyc_cluster_name>
                namespace: <nyc_cluster_namespace>
                url: openshift://api.rhdg-nyc.openshift-aws.myhost.com:6443
                secretName: nyc-token
        logging:
          categories:
            org.jgroups.protocols.TCP: error
            org.jgroups.protocols.relay.RELAY2: error
    • NYC

      apiVersion: infinispan.org/v1
      kind: Infinispan
      metadata:
        name: nyc-cluster
      spec:
        replicas: 2
        service:
          type: DataGrid
          sites:
            local:
              name: NYC
              expose:
                type: LoadBalancer
                port: 65535
            locations:
              - name: LON
                clusterName: example-infinispan
                namespace: rhdg-namespace
                url: openshift://api.rhdg-lon.openshift-aws.myhost.com:6443
                secretName: lon-token
        logging:
          categories:
            org.jgroups.protocols.TCP: error
            org.jgroups.protocols.relay.RELAY2: error
      重要

      务必调整 Infinispan CR 中的日志类别,以减少 JGroups TCP 和 RELAY2 协议的日志级别。这可防止大量日志文件使用容器存储。

      spec:
        logging:
          categories:
            org.jgroups.protocols.TCP: error
            org.jgroups.protocols.relay.RELAY2: error
  7. 使用任何其他 Data Grid 服务资源配置 Infinispan CR,然后应用更改。
  8. 验证 Data Grid 集群是否形成跨站点视图。

    1. 检索 Infinispan CR。

      $ oc get infinispan -o yaml
    2. 检查 type: CrossSiteViewFormed 条件。

后续步骤

如果您的集群有一个跨站点视图,您可以开始向缓存添加备份位置。

10.1.4. 用于管理的跨站点连接的资源

本主题描述了 Data Grid Operator 管理的跨站点连接的资源。

spec:
  service:
    type: DataGrid
    sites:
      local:
        name: LON
        expose:
          type: LoadBalancer
      locations:
      - name: NYC
        clusterName: <nyc_cluster_name>
        namespace: <nyc_cluster_namespace>
        url: openshift://api.site-b.devcluster.openshift.com:6443
        secretName: nyc-token
字段描述

service.type: DataGrid

Data Grid 仅支持通过 Data Grid 服务集群进行跨站点复制。

service.sites.local.name

将本地站点命名为 Data Grid 集群运行的位置。

service.sites.local.expose.type

指定跨站点复制的网络服务。Data Grid 集群使用此服务来通信和执行备份操作。您可以将值设为 NodePortLoadBalancer

service.sites.local.expose.nodePort

如果您通过 NodePort 服务公开 Data Grid,请在默认范围 3000032767 中指定静态端口。如果没有指定端口,则平台会选择一个可用的端口。

service.sites.local.expose.port

如果您通过 LoadBalancer 公开 Data Grid,请为该服务指定网络端口。默认端口为 7900

service.sites.locations

为所有备份位置提供连接信息。

service.sites.locations.name

指定与 .spec.service.sites.local.name 匹配的备份位置。

service.sites.locations.url

指定备份位置的 Kubernetes API 的 URL。

service.sites.locations.secretName

指定包含备份站点的服务帐户令牌的 secret。

service.sites.locations.clusterName

如果集群名称与本地站点的集群名称不同,请在备份位置指定集群名称。

service.sites.locations.namespace

如果 Data Grid 集群的命名空间与本地站点上的命名空间不匹配,则指定位于备份位置的 Data Grid 集群的命名空间。