Random partitioning puts locality optimization at odds with performance and stability.
Not all workloads require more than k/v, k/row, or modest sized k/partition locality
But there are a significant number of important workloads which would benefit from more (and more deliberate) locality.
Time Series, with 4+ orders of magnitude difference in write rates between different sources.
Graph (e.g. Titan/Tinkerpop). Where the amount of forest locality directly impacts query node hop count.
Any poorly modeled workload where a small number of partitions dominate the load.
BOP with vnodes
BOP with many vnodes
BOP with few vnodes
BOP with a dynamic number of vnodes
BOP with vnodes that can dynamically change in response to load
trait vnode {
fn split (&self) -> (VNode, VNode);
fn merge(vnode1:VNode, vnode2:VNode) -> Result(Err,Vnode)
}
trait Node {
fn shed_load (&self) -> PerfProfile;
fn acquire_load(&self) -> PerfProfile;
}
//yes, these might actually be the same method
trait Node {
fn offer_vnode(&self, nodeX:Node);
fn accept_vnode(&self) -> PerfProfile;
fn move_vnode(&self, node:nodeX, vnode
}
//yes, these might actually be the same method
An arbitrary name, but inspired by both Spanning Trees and Ropes
*Rope: a data structure composed of smaller strings that is used for efficiently storing and manipulating a very long string.
Trivially merges large empty ranges into a single vnode
Can function as a linked list of segments to allow trivial in-order reading across segments
Segments dynamically splittable, mergable, and movable.
Enables optimization algorithms (e.g. simplex/etc) to optimize against multiple competing constraints
Manages vnode size and placement through multiple heuristics/optimization algorithms
Can be tuned to steady state of 1 contiguous balanced vnode per node for maximum locality
Can be tuned to have thousands of vnodes for maximum nimbleness and flexibility
Would benefit substantially from range-segmented-sstables to allow merge, split, and transfer of vnodes between nodes to be very efficient
Optimize/constrain around