在 Apache Ignite 中, affinity(亲和性) 是一种用于控制数据分布和查询性能的重要机制。它允许开发者指定数据如何在集群中的节点之间分布,从而优化数据访问和查询效率。以下是关于 affinity 的详细解释:
数据亲和性(Data Collocation):
- 数据亲和性是指将相关联的数据存储在同一个节点上。例如,如果有一个
Person
实体和一个Company
实体,并且每个Person
都与一个Company
相关联,那么可以通过设置Company ID
作为Person
的亲和键(affinity key),确保所有与某个Company
相关的Person
数据都存储在同一个节点上。这样可以减少网络传输,提高查询性能。
- 数据亲和性是指将相关联的数据存储在同一个节点上。例如,如果有一个
计算亲和性(Compute Collocation):
- 计算亲和性是指将计算任务与数据存储在同一节点上执行。例如,如果需要计算某个客户的银行账户余额,可以通过将计算任务与该客户的账户数据存储在同一节点上,从而避免不必要的网络传输,提高计算效率。
亲和键(Affinity Key):
- 亲和键是用于确定数据如何在节点之间分布的键。通常,亲和键可以是实体类的一个字段,例如
Company ID
。通过设置亲和键,可以确保具有相同亲和键值的数据被存储在同一个节点上。例如,使用AffinityKey
类可以定义一个复合键,将多个字段作为亲和键的一部分。
- 亲和键是用于确定数据如何在节点之间分布的键。通常,亲和键可以是实体类的一个字段,例如
亲和函数(Affinity Function):
- 亲和函数是用于确定数据如何在节点之间分布的算法。Ignite 提供了两种默认的亲和函数:
- RendezvousAffinityFunction:这种函数允许分区到节点的映射有一点区别,但保证当网络发生变化时,分区只会迁移到新加入的节点或只来自离开的节点,集群内已有的节点间不会发生数据交换。这是 Ignite 的默认亲和函数。
- FairAffinityFunction:这种函数试图确保集群节点之间的分区分布是均匀的,但可能会导致分区迁移。
非协同分布式连接(Non-Collocated Distributed Joins):
- 在 Apache Ignite 1.7.0 中引入了非协同分布式连接的功能,允许在不将数据存储在同一个节点上的情况下执行连接操作。虽然这会牺牲一些性能,但提供了更大的灵活性。例如,可以将
Person
和Company
数据存储在不同的节点上,但仍能执行连接操作。
- 在 Apache Ignite 1.7.0 中引入了非协同分布式连接的功能,允许在不将数据存储在同一个节点上的情况下执行连接操作。虽然这会牺牲一些性能,但提供了更大的灵活性。例如,可以将
配置亲和性:
- 通过配置亲和性,可以确保数据在集群中的分布符合业务需求。例如,可以使用
RendezvousAffinityFunction
或FairAffinityFunction
来定义数据如何在节点之间分布。此外,还可以通过设置excludeNeighbors
参数来控制节点之间的数据分布。
- 通过配置亲和性,可以确保数据在集群中的分布符合业务需求。例如,可以使用
性能优化:
- 通过合理配置亲和性,可以显著减少网络传输和磁盘访问,从而提高系统的整体性能。例如,通过将相关数据存储在同一个节点上,可以减少数据在节点之间的传输,提高查询效率。
总之,亲和性是 Apache Ignite 中用于优化数据分布和查询性能的重要机制。通过合理配置亲和性,可以确保数据在集群中的分布符合业务需求,从而提高系统的整体性能。