Consistent hash rings are often used in distributed storage systems to efficiently compute data placement. However, for efficiency, these hash rings are often implemented with a fixed number of partitions of the key space. This is how OpenStack Swift's data placement algorithm works. Swift's "part power" is used to segment, or partition, the consistent hash ring used for placement. The part power is set when the ring is created, and it determines the upper limits of capacity in the cluster.
Unfortunately, if the partition count is set too high, there will be excessive overhead in the system and storage capacity will be underutilized. However, if it is set too low, then data placement will get "lumpy" and be unevenly distributed across the cluster. An operator is forced to balance these two concerns, often without knowing how much the cluster will grow.
Recently the Swift community has merged a feature that allows operators to increase the partition power in an existing cluster. This allows operators to set the part power to a low value when the cluster is created and increase it over time as the cluster expands. Implementing this feature is tricky, because the part power is a fundamental part of the data placement algorithm. Changing it can potentially make all of the data in the cluster completely inaccessible. Swift's implementation, however, is able to keep the cluster available during the entire process.
This talk will describe the data placement problem, explain how the community implemented the feature, and give a short demo of the feature in action.
John Dickinson is the Project Technical Lead for OpenStack Swift. He's one of the original developers in the OpenStack project and has been actively working in the OpenStack community since the project began. He has over ten years experience as a developer and has been responsible for both large and small scale production applications.
John works at SwiftStack, a storage company providing hybrid cloud storage solutions for enterprises around the world.