ignite集群的启动

ignite缓存模式       

         Ignite提供了三种不同的缓存操作模式:PARTITIONED(分区)、REPLICATED(复制)、LOCAL(本地)。缓存模型可以整个集群配置,也可以细粒度到每个缓存上。

        PARTITIONED: 这是扩展性最好的分布式缓存模式,在这种械下,所有数据被均等地分布在分区中,所有的分区也被均等地拆分到相关的节点中。这个方式可以在所有节点上只要匹配总可用存储(内存和磁盘)就可以存储尽可能多的数据,只要有足够多的节点,就可以存储足够多的数据。与REPLICATED比较,分区模式更新比较廉价,对于每个键只需要更新一个主节点(可选择一个或者多个备份节点);由于只有特定节点才持有缓存的数据,因此读取比较昂贵。为了避免额外的数据移动,总是访问恰好缓存有要访问的数据的节点是很重要的,这个方法叫做关联并置,当工作在分区化缓存时强烈建议使用。

ignite集群的启动_第1张图片

分区化缓存适合于数据量很大而更新频繁的场合,即写多读少

        REPLICATED:复制模式,有数据再平衡过程,主节点数据与分区模式的一致,只是复制模式默认备份了除主节点数据外的其余数据。复制模式适合存储数据量小,增长不快的数据。

ignite集群的启动_第2张图片

        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掉,然后重新调用激活集群接口即可,同时该节点也无法持有旧数据重新加入集群中。(危险操作)

日志示例

加入新节点前

ignite集群的启动_第3张图片

 加入新节点

ignite集群的启动_第4张图片

 此时集群还未激活

激活集群,当所有节点启动ok后,任意节点上执行激活cluster.active(true) 即可实现集群的激活,集群激活后,可以监听eventType:EVT_CLUSTER_ACTIVATED  140。

注意

集群激活之后,除非手工冻结或者所有节点停止,否则会一直处于激活状态,单节点的退出不会影响整个集群的可用性。

你可能感兴趣的:(缓存)