数据中心跨站点复制


Red Hat Data Grid 8.3

在 Data Grid 集群间备份数据

Red Hat Customer Content Services

摘要

Data Grid 可以组成全局集群,以便在地理位置间复制数据。本指南介绍了如何为缓存配置备份位置并执行跨站点操作。

Red Hat Data Grid

Data Grid 是一个高性能分布式内存数据存储。

无架构数据结构
将不同对象存储为键值对的灵活性。
基于网格的数据存储
旨在在集群中分发和复制数据。
弹性扩展
动态调整节点数量,以便在不中断服务的情况下满足需求。
数据互操作性
从不同端点在网格中存储、检索和查询数据。

Data Grid 文档

红帽客户门户网站中提供了 Data Grid 的文档。

Data Grid 下载

访问 红帽客户门户上的 Data Grid 软件下载。

注意

您必须有一个红帽帐户才能访问和下载数据中心软件。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息

第 1 章 跨站点复制

本节介绍数据中心跨站点复制功能,包括有关远程缓存的中继节点、状态传输和客户端连接的详细信息。

1.1. 跨站点复制

数据中心可以在地理分散数据中心和跨不同云供应商中运行的集群间备份数据。跨站点复制为 Data Grid 提供了一个全局集群视图,并:

  • 在停机或灾难时保证服务连续性。
  • 为客户端应用程序提供对全局分布式缓存中数据的单一访问点。

图 1.1. 跨站点复制

1.2. 转发节点

转发节点是 Data Grid 集群中的节点,负责从备份位置发送和接收请求。

如果节点不是中继节点,则必须将备份请求转发到本地中继节点。只有中继节点才能向备份位置发送请求。

为获得最佳性能,您应该将所有节点配置为中继节点。这会增加备份请求的速度,因为集群中的每个节点可以直接备份到远程站点,而无需将备份请求转发到本地中继节点。

注意

本文档中的图表演示了一个中继节点的 Data Grid 集群,因为这是 JGroups RELAY2 协议的默认值。同样,单个中继节点更容易说明,因为集群中的每个中继节点与远程集群中的每个中继节点通信。

注意

JGroups 配置将节点作为"站点 master"节点转发。Data Grid 使用中继节点,因为它更为描述性,并为用户提供了更直观的选择。

1.3. Data Grid 缓存备份

Data Grid 缓存包含一个 备份 配置,可让您将远程站点命名为备份位置。

例如,下图显示了三个缓存:"customers"、"eu-orders" 和 "us-orders":

  • LON 中,"customers" 名称 NYC 作为备份位置。
  • NYC 中,"customers" 名称 LON 作为备份位置。
  • "eu-orders"和"us-orders"没有备份,且对于对应的集群是本地的。

1.4. 备份策略

数据中心会在集群之间复制写入缓存的数据。例如,如果客户端将 "k1" 写入 LON,Data Grid 将 "k1" 同时备份到 NYC

要将数据备份到不同的集群,Data Grid 可以使用同步或异步策略。

同步策略

当 Data Grid 将数据复制到备份位置时,它会同时写入本地集群中的缓存和远程集群中的缓存。使用同步策略时,Data Grid 会在返回前等待两个写操作完成。

如果备份操作失败,您可以控制 Data Grid 处理在本地集群中的缓存写入的方式。Data Grid 可以执行以下操作:

  • 忽略失败的备份,并静默继续写入本地集群。
  • 记录警告消息或抛出异常并继续写入本地集群。
  • 使用自定义逻辑处理失败的备份操作。

同步备份还支持带参与选择事务的缓存的两阶段提交。备份的第一个阶段获取锁定。第二阶段提交修改。

重要

与跨站点复制的两阶段提交具有显著的性能影响,因为它需要通过网络进行两个往返。

异步策略

当 Data Grid 将数据复制到备份位置时,在写入本地缓存前,它不会等待操作完成。

异步备份操作并写入本地缓存相互独立。如果备份操作失败,对本地缓存的写操作将继续,且不会发生异常。当发生这种情况时,Data Grid 也重试写入操作,直到远程集群与跨站点视图断开连接。

同步与异步备份

同步备份提供了最佳保证站点之间的数据一致性。如果 strategy=sync,当 cache.put () 调用返回时,您知道该值是本地缓存中和备份位置的最新。

这种一致性的权衡是性能。与异步备份相比,同步备份具有更高的延迟。

另一方面,异步备份不会为客户端请求添加延迟,因此它们不会影响性能。但是,如果 strategy=async,当 cache.put () 调用返回时,您无法确保备份位置中的值与本地缓存中的值相同。

1.5. 备份位置的自动离线参数

在集群间复制数据的操作是使用过量 RAM 和 CPU 的资源密集型。为了避免资源数据中心在特定时间段内停止接受请求时,可以使备份位置离线。

Data Grid 根据失败的顺序请求数以及从第一次失败以来的时间间隔,使远程站点离线。当目标集群在跨站点视图(JGroups 网桥)中没有节点时,或者目标集群确认请求确认请求前过期超时时,请求将失败。

备份超时

备份配置包括用于在集群之间复制数据的超时值。如果在超时时间过期前操作没有完成,Data Grid 会将它们记录为失败。

在以下示例中,如果数据复制到 NYC,则在 10 秒后没有完成,则将其作为失败:

XML

<distributed-cache>
  <backups>
    <backup site="NYC"
            strategy="ASYNC"
            timeout="10000" />
  </backups>
</distributed-cache>
Copy to Clipboard Toggle word wrap

JSON

{
  "distributed-cache": {
    "backups": {
      "NYC" : {
        "backup" : {
          "strategy" : "ASYNC",
          "timeout" : "10000"
        }
      }
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

distributedCache:
  backups:
    NYC:
      backup:
        strategy: "ASYNC"
        timeout: "10000"
Copy to Clipboard Toggle word wrap

失败次数

您可以指定备份位置离线前可能发生的 连续 故障数量。

在以下示例中,如果集群尝试将数据复制到 NYC,5 个连续操作会失败,NYC 会自动离线:

XML

<distributed-cache>
  <backups>
    <backup site="NYC"
            strategy="ASYNC"
            timeout="10000">
      <take-offline after-failures="5"/>
    </backup>
  </backups>
</distributed-cache>
Copy to Clipboard Toggle word wrap

JSON

{
  "distributed-cache": {
    "backups": {
      "NYC" : {
        "backup" : {
          "strategy" : "ASYNC",
          "timeout" : "10000",
          "take-offline" : {
            "after-failures" : "5"
          }
        }
      }
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

distributedCache:
  backups:
    NYC:
      backup:
        strategy: "ASYNC"
        timeout: "10000"
        takeOffline:
          afterFailures: "5"
Copy to Clipboard Toggle word wrap

等待的时间

您还可以在备份操作失败时指定在让站点离线前等待的时间。如果在等待超时前备份请求成功,Data Grid 不会使站点离线。

一两分钟通常是在自动使备份位置离线前等待的时间。如果等待周期太短,则备份位置会很快离线。然后,您需要让集群重新在线,并执行状态传输操作,以确保集群间数据保持同步。

失败数的负值或零的值等于 1。Data Grid 只使用最少的时间在失败后等待备份位置离线,例如:

<take-offline after-failures="-1"
              min-wait="10000"/>
Copy to Clipboard Toggle word wrap

在以下示例中,如果集群试图将数据复制到 NYC,且在第一次失败操作后有 5 个连续故障和 15 秒,则 NYC 会自动离线:

XML

<distributed-cache>
  <backups>
    <backup site="NYC"
            strategy="ASYNC"
            timeout="10000">
      <take-offline after-failures="5" min-wait="15000"/>
    </backup>
  </backups>
</distributed-cache>
Copy to Clipboard Toggle word wrap

JSON

{
  "distributed-cache": {
    "backups": {
      "NYC" : {
        "backup" : {
          "strategy" : "ASYNC",
          "timeout" : "10000",
          "take-offline" : {
            "after-failures" : "5",
            "min-wait" : "15000"
          }
        }
      }
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

distributedCache:
  backups:
    NYC:
      backup:
        strategy: "ASYNC"
        timeout: "10000"
        takeOffline:
          afterFailures: "5"
          minWait: "15000"
Copy to Clipboard Toggle word wrap

1.6. 状态传输

State transfer 是一个管理操作,用于在站点之间同步数据。

例如,LON 离线,NYC 开始处理客户端请求。当您重新上线 LON 时,LON 中的 Data Grid 集群没有与 NYC 中的集群相同的数据。

为确保数据在 LONNYC 之间一致,您可以将状态从 NYC 推送到 LON

  • 状态传输是双向的。例如,您可以将状态从 NYC 推送到 LON,或者从 LON 推送到 NYC
  • 将状态推送到离线站点可重新在线。
  • State transfer 仅覆盖两个站点、原始站点和接收站点中存在的数据。Data Grid 不会删除数据。

    例如,LON 存在"k2",而 LON 离线时, NYC . "k2" 会从 NYC 中删除。当您重新上线 LON 时,"k2"仍存在于该位置。如果您将状态从 NYC 推送到 LON,则传输不会影响 LON 上的"k2"。

提示

为确保缓存的内容在状态传输后相同,请在推送状态前从接收站点的缓存中删除所有数据。

通过 CLI 使用 clear () 方法或 clearcache 命令。

  • 状态传输不会覆盖启动推送后发生的数据的更新。

    例如,LONNYC 中存在 "k1,v1"。LON 离线,以便您可以将状态传输从 NYC 推送到 LON,从而使 LON 重新上线。在状态传输完成前,客户端会将"k1,v2"放在 LON 上。

    在这种情况下,来自 NYC 的状态传输不会覆盖 "k1,v2",因为在启动推送后发生了修改。

自动状态传输

默认情况下,您必须使用 CLI 或 JMX 或 REST 手动执行跨站点状态传输操作。

但是,在使用异步备份策略时,Data Grid 可以自动执行跨站点状态传输操作。当它检测到备份位置恢复在线且网络连接稳定时,Data Grid 会在备份位置之间启动双向状态传输。例如,Data Grid 同时将状态从 LON 传送到 NYCNYCLON

注意

为了避免临时网络断开连接触发状态传输操作,备份位置必须满足的两个条件才能离线。备份位置的状态必须离线,且不得包含在带有 JGroups RELAY2 的跨站点视图中。

1.7. 站点间的客户端连接

客户端可以在 Active/Passive 或 Active/Active 配置中写入 Data Grid 集群。

Active/Passive

下图演示了,Data Grid 只处理来自一个站点的客户端请求:

在前面的镜像中:

  1. 客户端连接到 LON 的 Data Grid 集群。
  2. 客户端将 "k1" 写入缓存。
  3. LON "n1" 的中继节点将"k1""发送到位于 NYC, "nA" 的中继节点。

使用主动/被动时,NYC 提供数据冗余。如果 LON 的 Data Grid 集群因为某种原因离线,客户端就可以开始向 NYC 发送请求。当您重新上线 LON 时,您可以将数据与 NYC 同步,然后将客户端切回到 LON

Active/Active

下图演示了 Active/Active,其中 Data Grid 在两个站点处理客户端请求:

在前面的镜像中:

  1. 客户端 A 连接到 LON 的 Data Grid 集群。
  2. 客户端 A 将 "k1" 写入缓存。
  3. 客户端 B 连接到位于 NYC 的 Data Grid 集群。
  4. 客户端 B 将 "k2" 写入缓存。
  5. LONNYC 转发节点发送请求,使 "k1" 复制到 NYC,"k2" 复制到 LON

使用 Active/Active 时 NYCLON 将数据复制到远程缓存,同时处理客户端请求。如果 NYCLON 离线,客户端就可以开始向在线站点发送请求。然后,您可以使离线站点重新在线、推送状态以同步数据,并根据需要切换客户端。

备份策略和客户端连接
重要

建议在 Active/Active 配置中使用异步备份策略(policy=async)。

如果多个客户端尝试同时写入同一条目,并且备份策略是同步的(strategy=sync),则会出现死锁。但是,如果两个站点都访问不同的数据集,则可以使用带有 Active/Passive 配置的同步备份策略,在这种情况下,并发写入的死锁不会有风险。

1.7.1. 并发写入和冲突条目

如果客户端同时写入同一条目,但在不同站点上写入同一条目,则 Active/Active 站点配置可能会发生冲突条目。

例如,当客户端 B 写入 NYC 中的 "k1" 时,客户端 A 会同时写入 "k1" in LON。在这种情况下,"k1" 在 LON 中具有不同的值,而不是在 NYC 中。发生复制后,不能保证存在 "k1" 的哪个值。

为确保数据一致性,Data Grid 使用向量时钟算法在备份操作过程中检测冲突条目,如下例所示:

            LON       NYC

k1=(n/a)    0,0       0,0

k1=2        1,0  -->  1,0   k1=2

k1=3        1,1  <--  1,1   k1=3

k1=5        2,1       1,2   k1=8

                 -->  2,1 (conflict)
(conflict)  1,2  <--
Copy to Clipboard Toggle word wrap

向量时钟是每次写入条目时递增的时间戳元数据。在上例中,0 代表 "k1" 上向量时钟的初始值。

客户端将"k1=2"放在 LON 中,向量时钟为 1,0,其数据仓库将其复制到 NYC。然后,客户端会将"k1=3"放在 NYC 中,将向量时钟更新放在 1,1,后者的数据仓库复制到 LON

但是,如果客户端同时将 "k1=5" 放置到 LON 中,客户端会在 NYC 中放置 "k1=8",因为"k1" 的向量值在 LONNYC 之间不严格或更小。

当找到冲突条目时,Data Grid 使用 Java compareTo (String anotherString) 方法来比较站点名称。要确定哪个键具有优先权,Data Grid 选择比另一个键小的站点名称。名为 AAA 的站点的密钥优先于名为 AAB 的站点的密钥,以此类推。

遵循同一示例,为了解决 "k1" 的冲突,Data Grid 使用来自 LON 的 "k1" 的值。这会在 Data Grid 解决冲突并复制值后,在 LONNYC 中产生 "k1=5"。

提示

使用数字作为简单方法添加站点名称,以表示解决冲突条目的优先级顺序;例如,1LON2NYC

备份策略

Data Grid 仅使用异步备份策略(strategy=async)执行冲突解析。

您不应该将同步备份策略与 Active/Active 配置一起使用。在这个配置并发写入中,会导致死锁并丢失数据。但是,如果两个站点都访问不同的数据集,则可以使用带有 Active/Active 配置的同步备份策略,在这种情况下,并发写入的死锁不会有风险。

跨站点合并策略

除了将 Data Grid 配置为执行以下操作的跨站点合并策略外,数据中心还提供 XSiteEntryMergePolicy SPI:

  • 始终删除冲突条目。
  • 在进行 write/remove 冲突时应用写入操作。
  • 当发生 write/remove 冲突时删除条目。

1.8. 跨站点复制过期

过期会根据时间删除缓存条目。Data Grid 提供了为条目配置过期的方法:

Lifespan

lifespan 属性设置条目可以存在的最大时间长度。当您使用跨站点复制设置生命周期时,Data Grid 集群会独立于远程站点过期条目。

最大闲置数

max-idle 属性根据给定时间段内的读取或写入操作来指定条目可以存在多久。当您使用跨站点复制设置 max-idle 时,Data Grid 集群会发送 touch 命令,以使用远程站点协调闲置超时值。

注意

在跨站点部署中使用最大空闲过期可能会影响性能,因为额外的处理可以保持同步的最大 空闲 值,这意味着一些操作需要更长的时间完成。

第 2 章 配置数据中心跨站点复制

设置集群传输,以便 Data Grid 集群可以发现彼此,转发节点可以发送信息以进行跨站点复制。然后,您可以在 Data Grid 缓存中添加备份位置。

2.1. 为跨站点复制配置集群传输

在您的传输层中添加 JGroups RELAY2,以便数据仓库可以将缓存复制到备份位置。

流程

  1. 打开您的 Data Grid 配置进行编辑。
  2. 将 RELAY2 协议添加到 JGroups 堆栈。
  3. 使用传输配置的 stack 属性指定堆栈名称,以便 Data Grid 集群使用它。
  4. 保存并关闭您的数据仓库配置。
JGroups RELAY2 堆栈

以下配置显示了以下的 JGroups RELAY2 堆栈:

  • 使用默认 JGroups UDP 堆栈进行集群传输,这指的是本地站点节点之间的通信。
  • 将默认 JGroups TCP 堆栈用于跨站点复制流量。
  • 将本地站点命名为 LON
  • 指定集群中最多可发送跨站点复制请求的 1000 个节点。
  • 指定参与跨站点复制的所有备份位置的名称。
<infinispan>
  <jgroups>
    <stack name="xsite" extends="udp">
      <relay.RELAY2 xmlns="urn:org:jgroups"
                    site="LON"
                    max_site_masters="1000"/>
      <remote-sites default-stack="tcp">
        <remote-site name="LON"/>
        <remote-site name="NYC"/>
      </remote-sites>
    </stack>
  </jgroups>
  <cache-container>
    <transport cluster="${cluster.name}" stack="xsite"/>
  </cache-container>
</infinispan>
Copy to Clipboard Toggle word wrap

2.1.1. Custom JGroups RELAY2 堆栈

您可以将自定义 JGroups RELAY2 堆栈添加到 Data Grid 集群,以使用不同的传输属性进行跨站点复制。例如,以下配置使用 TCPPING 而不是 MPING 进行发现并扩展默认的 TCP 堆栈:

<infinispan>
  <jgroups>
    <stack name="relay-global" extends="tcp">
      <TCPPING initial_hosts="192.0.2.0[7800]"
               stack.combine="REPLACE"
               stack.position="MPING"/>
    </stack>
    <stack name="xsite" extends="udp">
      <relay.RELAY2 site="LON" xmlns="urn:org:jgroups"
                    max_site_masters="10"
                    can_become_site_master="true"/>
      <remote-sites default-stack="relay-global">
        <remote-site name="LON"/>
        <remote-site name="NYC"/>
      </remote-sites>
    </stack>
  </jgroups>
</infinispan>
Copy to Clipboard Toggle word wrap

2.2. 在缓存中添加备份位置

指定远程站点的名称,以便数据平面可以将数据复制到这些集群上的缓存中。

流程

  1. 打开您的 Data Grid 配置进行编辑。
  2. backup 元素添加到您的缓存配置中。
  3. 指定远程站点的名称作为备份位置。
    例如,在 LON 配置中,将 NYC 指定为备份。
  4. 在每个集群中重复前面的步骤,以便每个站点都是其他站点的备份。
    例如,如果您添加 LON 作为 NYC 的备份,您也应添加 NYC 作为 LON 的备份。
  5. 保存并关闭您的数据仓库配置。
备份配置

以下示例显示了 LON 集群的"客户"缓存配置:

XML

<replicated-cache name="customers">
  <backups>
    <backup site="NYC"
            strategy="ASYNC" />
  </backups>
</replicated-cache>
Copy to Clipboard Toggle word wrap

JSON

{
  "replicated-cache": {
    "name": "customers",
    "backups": {
      "NYC": {
        "backup" : {
          "strategy" : "ASYNC"
        }
      }
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

replicatedCache:
  name: "customers"
  backups:
    NYC:
      backup:
        strategy: "ASYNC"
Copy to Clipboard Toggle word wrap

以下示例显示了 NYC 集群的"客户"缓存配置:

XML

<distributed-cache name="customers">
  <backups>
    <backup site="LON"
            strategy="ASYNC" />
  </backups>
</distributed-cache>
Copy to Clipboard Toggle word wrap

JSON

{
  "distributed-cache": {
    "name": "customers",
    "backups": {
      "LON": {
        "backup": {
          "strategy": "ASYNC"
        }
      }
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

distributedCache:
  name: "customers"
  backups:
    LON:
      backup:
        strategy: "ASYNC"
Copy to Clipboard Toggle word wrap

2.3. 使用不同名称备份到缓存

数据源默认在缓存之间复制同名的数据。如果您希望 Data Grid 在具有不同名称的缓存之间复制,您可以明确声明每个缓存的备份。

流程

  1. 打开您的 Data Grid 配置进行编辑。
  2. 使用 backup-forbackupFor 将远程站点中的数据复制到本地站点上具有不同名称的缓存中。
  3. 保存并关闭您的数据仓库配置。
配置备份

以下示例将"eu-customers"缓存配置为从 LON 集群上的"客户"缓存中接收更新:

XML

<distributed-cache name="eu-customers">
  <backups>
    <backup site="LON"
            strategy="ASYNC" />
  </backups>
  <backup-for remote-cache="customers"
              remote-site="LON" />
</distributed-cache>
Copy to Clipboard Toggle word wrap

JSON

{
  "distributed-cache": {
    "name": "eu-customers",
    "backups": {
      "LON": {
        "backup": {
          "strategy": "ASYNC"
        }
      }
    },
    "backup-for" : {
      "remote-cache" : "customers",
      "remote-site" : "LON"
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

distributedCache:
  name: "eu-customers"
  backups:
    LON:
      backup:
        strategy: "ASYNC"
  backupFor:
    remoteCache: "customers"
    remoteSite: "LON"
Copy to Clipboard Toggle word wrap

2.4. 配置跨站点状态传输

更改跨站点状态传输设置,以优化性能,并指定操作是手动还是自动的操作。

流程

  1. 打开您的 Data Grid 配置进行编辑。
  2. 根据需要配置状态传输操作。

    1. 使用 chunk-sizechunkSize 指定每个状态传输操作中包含的条目数。
    2. 以毫秒为单位指定通过 超时 完成状态传输操作的时间。
    3. 设置 Data Grid 使用 max-retriesmaxRetries 重试失败状态传输的最大尝试次数。
    4. 指定通过 wait-timewaitTime 重试尝试之间等待的时间(毫秒)。
    5. 指定状态传输操作是否自动发生,或使用 模式 手动进行。
  3. 打开您的 Data Grid 配置进行编辑。
状态传输配置

XML

<distributed-cache name="eu-customers">
  <backups>
    <backup site="LON"
            strategy="ASYNC">
      <state-transfer chunk-size="600"
                      timeout="2400000"
                      max-retries="30"
                      wait-time="2000"
                      mode="AUTO"/>
    </backup>
  </backups>
</distributed-cache>
Copy to Clipboard Toggle word wrap

JSON

{
  "distributed-cache": {
    "name": "eu-customers",
    "backups": {
      "LON": {
        "backup": {
          "strategy": "ASYNC",
          "state-transfer": {
            "chunk-size": "600",
            "timeout": "2400000",
            "max-retries": "30",
            "wait-time": "2000",
            "mode": "AUTO"
          }
        }
      }
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

distributedCache:
  name: "eu-customers"
  backups:
    LON:
      backup:
        strategy: "ASYNC"
        stateTransfer:
          chunkSize: "600"
          timeout: "2400000"
          maxRetries: "30"
          waitTime: "2000"
          mode: "AUTO"
Copy to Clipboard Toggle word wrap

2.5. 配置冲突解析算法

将 Data Grid 配置为使用不同的算法来解析备份位置间的冲突条目。

流程

  1. 打开您的 Data Grid 配置进行编辑。
  2. 指定 Data Grid 算法或自定义实现之一作为合并策略,以解决冲突条目。
  3. 保存并关闭您的数据仓库配置进行编辑。
Data Grid 算法
提示

org.infinispan.xsite.spi.XSiteMergePolicy enum 中找到所有 Data Grid 算法及其描述。

以下示例配置使用 ALWAYS_REMOVE 算法从两个站点中删除冲突条目:

XML

<distributed-cache>
   <backups merge-policy="ALWAYS_REMOVE">
      <backup site="LON" strategy="ASYNC"/>
   </backups>
</distributed-cache>
Copy to Clipboard Toggle word wrap

JSON

{
  "distributed-cache": {
    "backups": {
      "merge-policy": "ALWAYS_REMOVE",
      "LON": {
        "backup": {
          "strategy": "ASYNC"
        }
      }
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

distributedCache:
  backups:
    mergePolicy: "ALWAYS_REMOVE"
    LON:
      backup:
        strategy: "ASYNC"
Copy to Clipboard Toggle word wrap

自定义冲突解析算法

如果创建自定义 XSiteEntryMergePolicy 实现,您可以将完全限定类名称指定为合并策略。

XML

<distributed-cache>
   <backups merge-policy="org.mycompany.MyCustomXSiteEntryMergePolicy">
      <backup site="LON" strategy="ASYNC"/>
   </backups>
</distributed-cache>
Copy to Clipboard Toggle word wrap

JSON

{
  "distributed-cache": {
    "backups": {
      "merge-policy": "org.mycompany.MyCustomXSiteEntryMergePolicy",
      "LON": {
        "backup": {
          "strategy": "ASYNC"
        }
      }
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

distributedCache:
  backups:
    mergePolicy: "org.mycompany.MyCustomXSiteEntryMergePolicy"
    LON:
      backup:
        strategy: "ASYNC"
Copy to Clipboard Toggle word wrap

2.6. 为异步备份清理 tombstones

使用异步备份策略 Data Grid 存储元数据(称为 tombstones),当它删除密钥时。Data Grid 定期运行一个任务来删除这些 tombstones,并在备份位置不再需要元数据时减少过量内存用量。您可以通过为 tombstone 映射定义目标大小以及任务运行之间的最大延迟来配置此任务的频率。

流程

  1. 打开您的 Data Grid 配置进行编辑。
  2. 使用 tombstone-map-size 属性指定要存储的 tombstones 数量。

    如果 tombstones 数量超过这个数字,则 Data Grid 会更频繁地运行清理任务。同样,如果 tombstones 数量小于这个数字,那么 Data Grid 不会经常运行清理任务。

  3. 添加 max-cleanup-delay 属性,并指定 tombstone 清理任务之间的最大延迟(以毫秒为单位)。
  4. 保存对配置的更改。
tombstone 清理任务配置

XML

<distributed-cache>
   <backups tombstone-map-size="512000" max-cleanup-delay="30000">
      <backup site="LON" strategy="ASYNC"/>
   </backups>
</distributed-cache>
Copy to Clipboard Toggle word wrap

JSON

{
  "distributed-cache": {
    "backups": {
      "tombstone-map-size": 512000,
      "max-cleanup-delay": 30000,
      "LON": {
        "backup": {
          "strategy": "ASYNC"
        }
      }
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

distributedCache:
  backups:
    tombstoneMapSize: 512000
    maxCleanupDelay: 30000
    LON:
      backup:
        strategy: "ASYNC"
Copy to Clipboard Toggle word wrap

2.7. 验证跨站点视图

当您将 Data Grid 设置为执行跨站点复制时,您应该检查日志文件,以确保 Data Grid 集群已成功形成跨站点视图。

流程

  1. 使用任何适当的编辑器打开 Data Grid 日志文件。
  2. 检查 ISPN000439: Received new x-site view 消息。

例如,如果 LON 中的 Data Grid 集群形成了跨站点视图,在 NYC 中有一个 Data Grid 集群,日志包括以下信息:

INFO  [org.infinispan.XSITE] (jgroups-5,<server-hostname>) ISPN000439: Received new x-site view: [NYC]
INFO  [org.infinispan.XSITE] (jgroups-7,<server-hostname>) ISPN000439: Received new x-site view: [LON, NYC]
Copy to Clipboard Toggle word wrap

2.8. 为跨站点复制配置 Hot Rod 客户端

将 Hot Rod 客户端配置为在不同站点上使用 Data Grid 集群。

hotrod-client.properties

# Servers at the active site
infinispan.client.hotrod.server_list = LON_host1:11222,LON_host2:11222,LON_host3:11222

# Servers at the backup site
infinispan.client.hotrod.cluster.NYC = NYC_hostA:11222,NYC_hostB:11222,NYC_hostC:11222,NYC_hostD:11222
Copy to Clipboard Toggle word wrap

ConfigurationBuilder

ConfigurationBuilder builder = new ConfigurationBuilder();
builder.addServers("LON_host1:11222;LON_host2:11222;LON_host3:11222")
       .addCluster("NYC")
       .addClusterNodes("NYC_hostA:11222;NYC_hostB:11222;NYC_hostC:11222;NYC_hostD:11222")
Copy to Clipboard Toggle word wrap

提示

使用以下方法将 Hot Rod 客户端切换到默认集群或位于不同站点的集群:

  • RemoteCacheManager.switchToDefaultCluster()
  • RemoteCacheManager.switchToCluster(${site.name})

第 3 章 使用 CLI 执行跨站点操作

使用 Data Grid 命令行界面(CLI)连接到 Data Grid Server 集群,管理站点,并将状态传输推送到备份位置。

3.1. 使备份位置离线和在线

手动使备份位置离线,并使其重新在线。

先决条件

  • 创建与 Data Grid 的 CLI 连接。

流程

  1. 使用 site status 命令检查备份位置是否在线或离线:

    site status --cache=cacheName --site=NYC
    Copy to Clipboard Toggle word wrap
    注意

    --site 是一个可选参数。如果没有设置,CLI 会返回所有备份位置。

    提示

    使用 --all-caches 选项获取所有缓存的备份位置状态。

  2. 管理备份位置,如下所示:

    • 使用 put -online 命令在线 进行备份位置:

      site bring-online --cache=customers --site=NYC
      Copy to Clipboard Toggle word wrap
    • 使用 take-offline 命令离线备份位置:

      site take-offline --cache=customers --site=NYC
      Copy to Clipboard Toggle word wrap
提示

使用 --all-caches 选项使备份位置在线,或者对所有缓存进行备份位置离线。

如需更多信息和示例,请运行 help site 命令。

3.2. 配置跨站点状态传输模式

当 Data Grid 检测到备份位置上线时,您可以将跨站点状态传输操作配置为自动进行。或者,您可以使用默认模式,这是手动执行状态传输。

先决条件

  • 创建与 Data Grid 的 CLI 连接。

流程

  1. 使用 site 命令配置状态传输模式,如下例所示:

    • 检索当前状态传输模式。

      site state-transfer-mode get --cache=cacheName --site=NYC
      Copy to Clipboard Toggle word wrap
    • 为缓存和备份位置配置自动状态传输操作。

      site state-transfer-mode set --cache=cacheName --site=NYC --mode=AUTO
      Copy to Clipboard Toggle word wrap
提示

运行 help site 命令以了解更多信息和示例。

3.3. 将状态推送到备份位置

将缓存状态传送到备份位置。

先决条件

  • 创建与 Data Grid 的 CLI 连接。

流程

  • 使用 site push-site-state 命令来推送状态传输,如下例所示:

    site push-site-state --cache=cacheName --site=NYC
    Copy to Clipboard Toggle word wrap
提示

使用 --all-caches 选项为所有缓存推送状态传输。

如需更多信息和示例,请运行 help site 命令。

第 4 章 使用 REST API 执行跨站点操作

Data Grid Server 提供了一个 REST 端点,用于公开执行跨站点操作的方法。

4.1. 获取所有备份位置的状态

使用 GET 请求检索所有备份位置的状态。

GET /rest/v2/caches/{cacheName}/x-site/backups/
Copy to Clipboard Toggle word wrap

Data Grid 以 JSON 格式响应每个备份位置的状态,如下例所示:

{
  "NYC": {
    "status": "online"
  },
  "LON": {
    "status": "mixed",
    "online": [
      "NodeA"
    ],
    "offline": [
      "NodeB"
    ]
  }
}
Copy to Clipboard Toggle word wrap
Expand
表 4.1. 返回的状态
描述

online

本地集群中的所有节点都有一个带有备份位置的跨站点视图。

离线

本地集群中的节点没有带有备份位置的跨站点视图。

mixed

本地集群中的某些节点有一个带有备份位置的跨站点视图,本地集群中的其他节点没有跨站点视图。响应指示每个节点的状态。

4.2. 获取特定备份位置的状态

使用 GET 请求检索备份位置的状态。

GET /rest/v2/caches/{cacheName}/x-site/backups/{siteName}
Copy to Clipboard Toggle word wrap

Data Grid 以 JSON 格式使用每个节点的状态进行响应,如下例所示:

{
  "NodeA":"offline",
  "NodeB":"online"
}
Copy to Clipboard Toggle word wrap
Expand
表 4.2. 返回的状态
描述

online

节点在线。

离线

节点离线。

失败

无法检索状态。远程缓存可能会关闭,或者在请求过程中发生网络错误。

4.3. 使备份位置离线

使用 POST 请求和 ?action=take-offline 参数使备份位置离线。

POST /rest/v2/caches/{cacheName}/x-site/backups/{siteName}?action=take-offline
Copy to Clipboard Toggle word wrap

4.4. 在线关闭备份位置

使用 ?action=bring-online 参数在线备份位置。

POST /rest/v2/caches/{cacheName}/x-site/backups/{siteName}?action=bring-online
Copy to Clipboard Toggle word wrap

4.5. 将状态推送到备份位置

使用 ?action=start-push-state 参数将缓存状态推送到备份位置。

POST /rest/v2/caches/{cacheName}/x-site/backups/{siteName}?action=start-push-state
Copy to Clipboard Toggle word wrap

4.6. 取消状态传输

使用 ?action=cancel-push-state 参数取消状态传输操作。

POST /rest/v2/caches/{cacheName}/x-site/backups/{siteName}?action=cancel-push-state
Copy to Clipboard Toggle word wrap

4.7. 获取状态传输状态

使用 ?action=push-state-status 参数检索状态传输操作的状态。

GET /rest/v2/caches/{cacheName}/x-site/backups?action=push-state-status
Copy to Clipboard Toggle word wrap

数据中心以 JSON 格式响应每个备份位置的状态传输状态,如下例所示:

{
   "NYC":"CANCELED",
   "LON":"OK"
}
Copy to Clipboard Toggle word wrap
Expand
表 4.3. 返回的状态
描述

SEND

状态传输到备份位置正在进行中。

确定

状态传输成功完成。

ERROR

发生状态传输的错误。检查日志文件。

取消

状态传输取消正在进行。

4.8. 清除状态传输状态

使用 ?action=clear-push-state-status 参数发送站点的状态传输状态。

POST /rest/v2/caches/{cacheName}/x-site/local?action=clear-push-state-status
Copy to Clipboard Toggle word wrap

4.9. 修改需要离线条件

如果满足特定条件,站点将处于离线状态。修改 take offline 参数,以控制备份位置自动离线的时间。

流程

  1. 检查配置的带有 GET 请求和 take-offline-config 参数的离线参数。

    GET /rest/v2/caches/{cacheName}/x-site/backups/{siteName}/take-offline-config
    Copy to Clipboard Toggle word wrap

    Data Grid 响应包括 after_failuresmin_wait 字段,如下所示:

    {
      "after_failures": 2,
      "min_wait": 1000
    }
    Copy to Clipboard Toggle word wrap
  2. 修改会在 PUT 请求的正文中获取离线参数。

    PUT /rest/v2/caches/{cacheName}/x-site/backups/{siteName}/take-offline-config
    Copy to Clipboard Toggle word wrap

    如果操作成功完成,服务会返回 204 (无内容)。

4.10. 从接收站点取消状态传输

如果两个备份位置之间的连接中断,您可以取消接收推送的站点的状态传输。

从远程站点取消状态传输,并使用 ?action=cancel-receive-state 参数保留本地缓存的当前状态。

POST /rest/v2/caches/{cacheName}/x-site/backups/{siteName}?action=cancel-receive-state
Copy to Clipboard Toggle word wrap

4.11. 获取备份位置的状态

使用 GET 请求从缓存管理器检索所有备份位置的状态。

GET /rest/v2/cache-managers/{cacheManagerName}/x-site/backups/
Copy to Clipboard Toggle word wrap

Data Grid 以 JSON 格式响应状态,如下例所示:

{
   "SFO-3":{
      "status":"online"
   },
   "NYC-2":{
      "status":"mixed",
      "online":[
         "CACHE_1"
      ],
      "offline":[
         "CACHE_2"
      ],
      "mixed": [
         "CACHE_3"
      ]
   }
}
Copy to Clipboard Toggle word wrap
Expand
表 4.4. 返回的状态
描述

online

本地集群中的所有节点都有一个带有备份位置的跨站点视图。

离线

本地集群中的节点没有带有备份位置的跨站点视图。

mixed

本地集群中的某些节点有一个带有备份位置的跨站点视图,本地集群中的其他节点没有跨站点视图。响应指示每个节点的状态。

GET /rest/v2/cache-managers/{cacheManagerName}/x-site/backups/{site}
Copy to Clipboard Toggle word wrap

返回单个备份位置的状态。

4.12. 使备份位置离线

使用 ?action=take-offline 参数使备份位置离线。

POST /rest/v2/cache-managers/{cacheManagerName}/x-site/backups/{siteName}?action=take-offline
Copy to Clipboard Toggle word wrap

4.13. 在线关闭备份位置

使用 ?action=bring-online 参数在线备份位置。

POST /rest/v2/cache-managers/{cacheManagerName}/x-site/backups/{siteName}?action=bring-online
Copy to Clipboard Toggle word wrap

4.14. 检索状态传输模式

使用 GET 请求检查状态传输模式。

GET /rest/v2/caches/{cacheName}/x-site/backups/{site}/state-transfer-mode
Copy to Clipboard Toggle word wrap

4.15. 设置状态传输模式

使用 ?action=set 参数配置状态传输模式。

POST /rest/v2/caches/{cacheName}/x-site/backups/{site}/state-transfer-mode?action=set&mode={mode}
Copy to Clipboard Toggle word wrap

4.16. 启动状态传输

使用 ?action=start-push-state 参数将所有缓存的状态推送到远程站点。

POST /rest/v2/cache-managers/{cacheManagerName}/x-site/backups/{siteName}?action=start-push-state
Copy to Clipboard Toggle word wrap

4.17. 取消状态传输

使用 ?action=cancel-push-state 参数取消持续状态传输操作。

POST /rest/v2/cache-managers/{cacheManagerName}/x-site/backups/{siteName}?action=cancel-push-state
Copy to Clipboard Toggle word wrap

第 5 章 通过 JMX 执行跨站点操作

执行跨站点操作,如推送状态传输并通过 JMX 在线上线站点。

5.1. 注册 JMX MBeans

数据中心可以注册可用于收集统计信息并执行管理操作的 JMX MBeans。您还必须启用统计信息,否则 Data Grid 为 JMX MBeans 中的所有统计属性提供 0 值。

流程

  1. 打开您的 Data Grid 配置进行编辑。
  2. jmx 元素或对象添加到缓存容器中,并将 true 指定为 enabled 属性或字段的值。
  3. 添加 domain 属性或字段,并根据需要指定公开 JMX MBeans 的域。
  4. 保存并关闭您的客户端配置。
JMX 配置

XML

<infinispan>
  <cache-container statistics="true">
    <jmx enabled="true"
         domain="example.com"/>
  </cache-container>
</infinispan>
Copy to Clipboard Toggle word wrap

JSON

{
  "infinispan" : {
    "cache-container" : {
      "statistics" : "true",
      "jmx" : {
        "enabled" : "true",
        "domain" : "example.com"
      }
    }
  }
}
Copy to Clipboard Toggle word wrap

YAML

infinispan:
  cacheContainer:
    statistics: "true"
    jmx:
      enabled: "true"
      domain: "example.com"
Copy to Clipboard Toggle word wrap

5.2. 使用 JMX 客户端执行跨站点操作

使用 JMX 客户端执行跨站点操作。

先决条件

  • 配置 Data Grid 以注册 JMX MBeans

流程

  1. 使用任何 JMX 客户端连接到 Data Grid。
  2. 从以下 MBeans 调用操作:

    • XSiteAdmin 为缓存提供跨站点操作。
    • GlobalXSiteAdminOperations 为缓存管理器提供跨站点操作。

      例如,若要重新在线站点,可调用 opens SiteOnline (siteName)

5.3. 用于跨站点复制的 JMX MBeans

Data Grid 为跨站点复制提供 JMX MBeans,可让您收集统计信息并执行远程操作。

org.infinispan:type=Cache 组件提供以下 JMX MBeans:

  • XSiteAdmin 公开应用到特定缓存实例的跨站点操作。
  • RpcManager 提供有关跨站点复制的网络请求的统计信息。
  • AsyncXSiteStatistics 为异步跨站点复制提供统计信息,包括队列大小和冲突数量。

org.infinispan:type=CacheManager 组件包括以下 JMX MBean:

  • GlobalXSiteAdminOperations 会公开适用于缓存容器中所有缓存的跨站点操作。

有关 JMX MBeans 以及可用操作和统计信息的描述,请参阅 Data Grid JMX 组件 文档。

第 6 章 跨站点复制日志消息

Data Grid 包括一个 org.infinispan.XSITE 日志类别,可帮助您对跨站点复制操作进行故障排除。

6.1. 用于跨站点复制的数据网格日志消息

查找与跨站点复制相关的日志消息的用户操作。

Expand
日志级别identifier消息描述

DEBUG

ISPN000400

node <site-name> haspiced

Data Grid 在无法访问备份位置时打印此消息。确保站点在线并检查网络状态。

INFO

ISPN000439

收到新的 x-site 视图:<site-name>

当站点加入并离开全局集群时,Data Grid 会打印此消息。

INFO

ISPN100005

站点 <site-name> 在线。

当站点上线时,Data Grid 会打印此消息。

INFO

ISPN100006

site <site-name> 离线。

当站点离线时,Data Grid 会打印此消息。如果您没有手动关闭站点,这个消息可能会表示发生了故障。检查网络状态并尝试使站点重新在线。

WARN

ISPN000202

将缓存 <cache-name> 的数据备份到站点 <site-name> 的问题:

当出现状态传输操作以及异常时,Data Grid 会打印此消息。如果需要调整 Data Grid 日志记录,以获取更为精细的日志记录信息。

WARN

ISPN000289

无法将 X-Site 状态块发送到 <site-name>。

表示 Data Grid 在状态传输操作期间无法传输一系列缓存条目。确保站点在线并检查网络状态。

WARN

ISPN000291

无法应用 X-Site 状态块。

表示 Data Grid 在状态传输操作期间无法应用一系列缓存条目。确保站点在线并检查网络状态。

WARN

ISPN000322

无法重新启动 x-site 状态转让到站点 <site-name>

表示 Data Grid 无法将状态传输操作恢复到备份位置。确保站点在线并检查网络状态。

ERROR

ISPN000477

无法对站点 <site-name> 执行操作 <operation-name>

表示 Data Grid 无法在备份位置成功完成操作。如果需要调整 Data Grid 日志记录,以获取更为精细的日志记录信息。

FATAL

ISPN000449

XSite 状态传输超时必须大于或等于 1 (一)。

timeout 属性的值为 0 或负数时,结果。在缓存定义的状态传输配置中至少为 timeout 属性指定 1 值。

FATAL

ISPN000450

在重试之间等待时间的 XSite 状态传输必须大于 1 (一)。

wait-time 属性的值为 0 或负数时,结果。在您的缓存定义的状态传输配置中至少为 wait-time 属性指定一个 1 值。

FATAL

ISPN000576

跨站点复制不可用于本地缓存。

跨站点复制无法用于本地缓存模式。从本地缓存定义中删除备份配置,也可以使用分布式或复制缓存模式。

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat