点燃分区笔记

  

数据复制机制:客户端根据哈希算出主节点,数据只从客户端发到主节点
GridNearAtomicSingleUpdateFuture。mapOnTopology
GridNearAtomicSingleUpdateFuture。
GridNearAtomicAbstractUpdateFuture地图。sendSingleRequest
GridCacheIoManager。发送

  

当数据复制到主节点时,再从主节点复制到其他节点
GridDhtAtomicCache。updateAllAsyncInternal
GridDhtAtomicAbstractUpdateFuture。
GridDhtAtomicAbstractUpdateFuture地图。sendDhtRequests
GridCacheIoManager。发送

  

每当集群拓扑改变时候会重新计算主节点
GridCachePartitionExchangeManager。onDiscoveryEvent
GridDhtPartitionsExchangeFuture。onClusterStateChangeRequest/onCacheChangeRequest/onAffinityChangeRequest/
CacheAffinitySharedManager。applyx
GridAffinityAssignmentCache。计算
AffinityFunction。assignPartitions

  

点燃采用会合哈希算法,计算每个节点的权重,只要集群视图一致,那么客户端服务端都应用这种算法,找出权重最高的N个节点,
作为主节点和复制节点
RendezvousAffinityFunction:
为每个分区分配多个集群节点,分区数量为参数传入RendezvousAffinityFunction,默认1024。分配的结果表示这个分区的数据应该落在哪些节点上
为每个集群节点计算哈希:值为节点的CONSISTENTHASHID对当前的分区取模,
将散列排序,然后取前N个节点,N为每个分区最终需要复制到的节点,取决于备份的数量,是否排除邻居等选项
计算关键属于哪个分区:分配的结果存在GridAffinityAssignment中

  

GridCacheContext。allowFastLocalRead中有一个方法判断是否可以从本地快速读取:
拓扑().partitionState (localNodeId(),部分)==拥有

  

GridCacheContext。toCacheKeyObject方法将钥匙转化为KeyCacheObject,并分配分区,参考IgniteCacheObjectProcessorImpl.partition

  

读数据:
GridPartitionedSingleGetFuture。mapKeyToNode方法获取从哪个节点读取数据
内部调用GridCacheAffinityManager。分区和GridCacheAffinityManager。nodesByPartition
然后默认从获得节点列表的第一个读取数据

  

新的节点加入后会自动重新REBLANCE数据
CacheAffinitySharedManager。onServerJoin
CacheAffinitySharedManager。initAffinityOnNodeJoin

  

检查平衡是否完成CacheAffinitySharedManager。checkRebalanceState

  

分区的状态移动,拥有、租用,驱逐,失去了
拥有表示分区属于主节点
租赁表示拓扑结构改变以后

点燃分区笔记