24.3.4. 状态传输
状态传输既是基本数据网格,也是群集缓存功能。如果不进行状态传输,数据将会丢失,因为节点会添加到集群或从集群中删除。
State transfer 会根据缓存成员资格的变化调整缓存的内部状态。当节点加入或离开集群时、两个或多个群集分区合并或这些事件组合后,会自动进行这一更改。新启动缓存的初始状态传输成本最为昂贵,因为新缓存必须根据缓存模式接收最大状态量,如下所述。
timeout
属性可用于控制新启动的缓存等待多久才能接收其状态。如果 timeout
属性是一个正数,则缓存将等待接收其所有初始状态,然后才能提供给服务请求。如果状态传输未在指定时间内完成,则默认值为 240000
毫秒,缓存将抛出错误并取消启动。如果 超时
设为 0
,则缓存将立即可用,并在后台操作期间收到初始状态。在初始状态传输完成之前,任何对缓存尚未接收的缓存条目请求都需要从远程节点获取。
可通过以下命令将 timeout
属性设为 0
:
/subsystem=infinispan/cache-container=server/CACHE_TYPE=CACHE/component=state-transfer:write-attribute(name=timeout,value=0)
状态传输行为由缓存模式决定。
- 在复制模式中,新节点加入缓存会从现有节点接收整个缓存状态。当节点离开集群时,没有状态转移。
-
在分发模式中,新节点仅从现有节点接收状态的一部分,而现有节点则移除了其中一些状态,以便在缓存中保留每个密钥
的所有者
副本,具体通过一致的散列来确定。当节点离开集群时,分发缓存需要创建该节点上存储的密钥的额外副本,以便每个密钥的所有者继续存在。 - 在无效模式中,初始状态传输与复制模式类似,唯一的区别在于无法保证节点具有相同的状态。当节点离开集群时,没有状态转移。
状态传输默认同时传输内存中和持久状态,但可以在配置中禁用这两者。禁用状态传输时,必须配置 ClusterLoader
,否则节点将成为密钥的所有者或备份所有者,而无需将数据加载到其缓存中。另外,如果以分布模式禁用状态传输,则密钥偶尔会比缓存中 的所有者
副本少。