数据复制机制: 客户端根据HASH算出主节点,数据只从客户端发到主节点
GridNearAtomicSingleUpdateFuture.mapOnTopology
GridNearAtomicSingleUpdateFuture.map
GridNearAtomicAbstractUpdateFuture.sendSingleRequest
GridCacheIoManager.send node
当数据复制到主节点时,再从主节点复制到其余节点
GridDhtAtomicCache.updateAllAsyncInternal
GridDhtAtomicAbstractUpdateFuture.map
GridDhtAtomicAbstractUpdateFuture.sendDhtRequests
GridCacheIoManager.send 算法
每当集群拓扑改变时候会从新计算主节点
GridCachePartitionExchangeManager.onDiscoveryEvent
GridDhtPartitionsExchangeFuture.onClusterStateChangeRequest/onCacheChangeRequest/onAffinityChangeRequest/
CacheAffinitySharedManager.applyx
GridAffinityAssignmentCache.calculate
AffinityFunction.assignPartitions app
IGNITE 采用 Rendezvous hash 算法,计算每一个节点的权重, 只要集群视图一致,那么客户端服务端都应用这种算法,找出权重最高的N个节点,
做为主节点和复制节点
RendezvousAffinityFunction:
为每一个PARTITION 分配多个集群节点,PARTITION数量为参数传入RendezvousAffinityFunction,默认1024. 分配的结果表示这个PARTITION的数据应该落在哪些节点上
为每一个集群节点计算HASH: 值为节点的CONSISTENTHASHID 对 当前的PARTITION取模,
将HASH排序,而后取前N个节点,N为每一个PARTITION最终须要复制到的节点,取决于BACKUP的数量,是否EXCLUDE NEIGHBOR等选项
计算 KEY属于哪一个PARTITION: 分配的结果存在GridAffinityAssignment中 ide
GridCacheContext.allowFastLocalRead 中有一个方法判断是否能够从本地快速读取:
topology().partitionState(localNodeId(), part) == OWNING 排序
GridCacheContext.toCacheKeyObject 方法将 key 转化为KeyCacheObject, 并分配partition, 参考 IgniteCacheObjectProcessorImpl.partitionhash
读数据:
GridPartitionedSingleGetFuture.mapKeyToNode 方法获取从哪一个节点读取数据
内部调用GridCacheAffinityManager.partition 和GridCacheAffinityManager.nodesByPartition
而后默认从得到NODE 列表的第一个读取数据 it
新的节点加入后会自动从新REBLANCE数据
CacheAffinitySharedManager.onServerJoin
CacheAffinitySharedManager.initAffinityOnNodeJoin io
检查rebalance 是否完成 CacheAffinitySharedManager.checkRebalanceState ast
Partition 的状态 MOVING, OWNING, RENTING, EVICTED, LOST
OWNING 表示分区属于主节点
RENTING 表示拓扑结构改变之后 class