2 replicas in 2 regions is going to try VERY hard to put one replica of every partition on a server/device in each region. Unless you have EXACTLY the same number of GB/weight in each region you’re going to have some devices with more part-replicas assigned than other devices.
The 10% overload you’ve configured is what allows this (trade balance for dispersion) and it usually makes sense to allow a little overload as long as the cluster isn’t terribly full.
Min part hours is not a data plane concept; it only effects part-replica reassignment in the ring during rebalance (an offline, not runtime, process). Your ring has it set to 0, so each rebalance can reassign either replica of any partition if it would improve balance or dispersion.
A dispersion of zero is perfect, and 38 balance isn’t necessarily that bad, but might be if the cluster is mostly full. You can reduce overload to zero and rebalance to prioritize balance at the cost of dispersion (i.e. some partitions might have both replicas assigned to servers in the same region)
The swift-ring-builder CLI tool has a dispersion sub command that may help you inspect and understand the placement in your ring.
Swiftstack managed clusters may require using the admin interface to set the ring’s overload value in the management db as they won’t necessarily pick up an overload you set on your builder via the swift-ring-builder CLI on the next ring push/rebalance.
I have observed an imbalance in the cluster based on the object.builder output. Is this possibly due to an ongoing rebalance process?
Additionally, I'd like to confirm my understanding of 'min_part_hours.' Is it accurate to say that this parameter represents the number of hours an object needs to reside on a disk before it's considered for movement to another device during a rebalance? According to the Swift documentation, the default value is 24 hours. I'm curious if this value is applied to data written specifically by the rebalance process or if it also includes data written by other Swift services.
object.builder, build version 775, id 61b2166cb8684b2b80d6fc370cef37a6
65536 partitions, 2.000000 replicas, 2 regions, 2 zones, 95 devices, 38.89 balance, 0.00 dispersion
The minimum number of hours before a partition can be reassigned is 0 (0:00:00 remaining)
The overload factor is 10.00% (0.100000)
Ring file object.ring.gz not found, probably it hasn't been written yet
Devices: id region zone ip address:port replication ip:port name weight partitions balance flags meta