ignite缓存模式? ? ? ?
?????????Ignite提供了三种不同的缓存操作模式:PARTITIONED(分区)、REPLICATED(复制)、LOCAL(本地)。缓存模型可以整个集群配置,也可以细粒度到每个缓存上。
? ? ? ? PARTITIONED:?这是扩展性最好的分布式缓存模式,在这种械下,所有数据被均等地分布在分区中,所有的分区也被均等地拆分到相关的节点中。这个方式可以在所有节点上只要匹配总可用存储(内存和磁盘)就可以存储尽可能多的数据,只要有足够多的节点,就可以存储足够多的数据。与REPLICATED比较,分区模式更新比较廉价,对于每个键只需要更新一个主节点(可选择一个或者多个备份节点);由于只有特定节点才持有缓存的数据,因此读取比较昂贵。为了避免额外的数据移动,总是访问恰好缓存有要访问的数据的节点是很重要的,这个方法叫做关联并置 ,当工作在分区化缓存时强烈建议使用。
分区化缓存适合于数据量很大而更新频繁的场合,即写多读少
????????REPLICATED:复制模式,有数据再平衡过程,主节点数据与分区模式的一致,只是复制模式默认备份了除主节点数据外的其余数据。复制模式适合存储数据量小,增长不快的数据。
????????LOCAL:本地模式,数据都存储在本地,无数据再平衡,类似常见的存储服务。
模式 | 优点 | 缺点 |
---|
PARTITIONED | 能存储海量数据,频繁更新对其影响不大 | 查询缓存涉及到数据移动,对查询性能有影响 | REPLICATED | 适合存储数据量不大的数据,数据查询性能稳定 | 频繁更新对其影响较大 |
基线拓扑? ?
????????基线拓扑:基线拓扑是一组Ignite服务端节点,目的是同时在内存以及原生持久化中存储数据。基线拓扑中的节点在功能方面不受限制,并且作为数据和计算的容器,在行为上也和普通的服务端节点一样。
????????另外,部分节点不属于基线拓扑,也是可以的,比如:
- 服务端节点要么在内存中存储数据,要么在第三方数据库,比如RDBMS或者NoSQL中持久化数据;
- 客户端节点也不在基线拓扑中,因为它们不持有共享数据。
????????基线拓扑的目的是:
- 如果节点重启,避免不必要的数据再平衡。比如,每个节点重启都会触发两个再平衡事件,一个是节点停止,一个是节点重新加入集群,这会导致集群资源的无效利用;
- 集群重启后,如果基线拓扑中的所有节点都已经加入,那么集群会被自动激活。
注意事项? :
- 基线拓扑是实现分布式存储持久化数据的必要操作,而partition的缓存模式只是决定了内存数据在各个节点中的分布存放
- 第一次启动集群时,要等相关节点都单独启动完成之后,再激活集群,才能将这些节点加入到基线拓扑中
ignite.cluster().setBaselineTopology(nodes);
????????基线拓扑自动调整
????????启用后集群将监控其服务端节点的状态,并在集群拓扑稳定一段可配置的时间后自动设置当前拓扑的基线。当集群中的节点集发生变更时,将发生以下情况:
- Ignite会等待一个可配置的时间(默认为5分钟);
- 如果在此期间拓扑中没有其他变更,则Ignite会将基线拓扑设置为当前节点集;
- 如果在此期间节点集发生更改,则会更新超时时间。
????????这些节点集的每个变更都会重置自动调整的超时时间。当超时过期且当前节点集与基线拓扑不同(例如存在新节点或一些旧节点离开)时,Ignite将更改基线拓扑以匹配当前节点集,这也会触发数据再平衡。当然,只有集群处于激活状态时,基线拓扑才会自动调整。
//开启自动适配集群
ignite.cluster().baselineAutoAdjustEnabled(true);
ignite.cluster().baselineAutoAdjustTimeout(300000);
?Ignite数据平衡分布的实践场景
????????内存缓存模式CacheMode 使用PARTITIONED,保证数据在各个节点的内存中缓存起来。
-
第一次环境部署,所有节点要单独启动,所有节点启动完成之后调用激活集群接口,ignite自动将所有节点集群,并且初始化基线拓扑,把所有节点都在基线拓扑变为上线状态。 -
集群中所有节点挂掉,即所有节点在基线拓扑中处于下线状态,这时候启动其中一个节点会自动从原先的基线拓扑中变为上线状态,后续其他节点也是,然后触发数据平衡。 -
集群中单个节点挂掉,即在基线拓扑中处于下线状态,那直接启动这个节点就行,会自动从原先的基线拓扑中上线然后数据平衡 -
要把新节点加入到已激活的集群,并且加入到集群中的基线拓扑中的话,要调用激活集群接口(接口ip是当前节点或者是集群中任意一个节点的都可以)加入集群的基线拓扑后,集群会把部分数据分布到新节点中去 -
要把下线节点从集群中删去,并确认不再需要这个节点,也不需要这个节点里面的数据,则把当前节点shutdown掉,然后重新调用激活集群接口即可,同时该节点也无法持有旧数据重新加入集群中。(危险操作)
日志示例
加入新节点前
?加入新节点
?此时集群还未激活
激活集群,当所有节点启动ok后,任意节点上执行激活cluster.active(true) 即可实现集群的激活,集群激活后,可以监听eventType:EVT_CLUSTER_ACTIVATED? 140。
注意
集群激活之后,除非手工冻结或者所有节点停止,否则会一直处于激活状态,单节点的退出不会影响整个集群的可用性。
|