...
Second, affinity function defines which partitions belongs to the node: F(topology, part) = list(nodes)
At different points in time a partition can belong to different nodes. This is a dynamic property of a partition.
...
The first node in the list is the so-called primary node, has a special coordinating role for all operations on the partition. The remaining are backup nodes. In the event of a loss of a primary node, one of the backup nodes becomes the new primary.
Todo PIC for some AF calculated state.
An The important property of affinity function is the uniform distribution of partitions over nodes.
Look at possible partition distribution between nodes for topology with 3 server nodes having 6 partitions.
Function F could looks someting like (in ideal world):
F(0) = s1, s2, s3
F(1) = s2, s3, s1
F(2) = s3, s1, s2
F(3) = s1, s2, s3
F(4) = s2, s3, s1
F(5) = s3, s1, s2
In real life results might not be so ideal because of hash randomization causing some nodes to have slightly more partitions then others. It depends on total partitions counter - the more total partitions count the more uniform is assignment.
The default implementation for function F uses the rendezvous hashing algorithm https://en.wikipedia.org/wiki/Rendezvous_hashing
Due to implementation of these properties of affinity function linear scalability is achieved when adding new nodes to the grid.
...