Алгоритм перебалансировки виртуальных узлов в согласованном решении хеширования в PostgreSQL?
Я использую PostgreSQL 9.3, и я реализовал согласованное хеширование с виртуальными узлами, используя plproxy.
В текущей настройке работает добавление и ребалансировка узлов (перемещение данных между серверами осуществляется с использованием сторонних упаковщиков данных PostgrelSQL).
Но есть одно ограничение. В текущей настройке все физические узлы предполагаются равными. т. е. невозможно добавить количество виртуальных узлов на сервер при добавлении узла. Я тоже хочу построить это поведение.
Поэтому я спрашиваю, что будет лучшим алгоритмом для реализации этого. Текущий алгоритм просто распределяет емкость виртуальных узлов серверов равномерно по серверам. В новом алгоритме я хотел бы видеть минимальную сумму для перемещения виртуального узла.
Пример:
Предположим, у нас есть кластер из 4 серверов, и каждый сервер имеет 64 виртуальных узла (всего 256 виртуальных узлов). Я хочу добавить сервер (сервер X), имеющий 200 (или некоторый процент виртуальных узлов) виртуальных узлов, чтобы каждые 4 сервера вносили одинаковый вклад в этот новый сервер, чтобы в некоторой степени удовлетворить его количество виртуальных узлов.
НО, когда добавляется новый узел (т.е. сервер X), я не хочу выделять все 200 для этого сервера. Мне нужен алгоритм для присваивания некоторого процента от существующих серверов, чтобы потребность в 200 узлах нового сервера была в некоторой степени удовлетворена, так как предыдущие 4 сервера не теряют там количество виртуальных узлов.
Какова будет лучшая стратегия для разделения виртуального узла между физическими серверами?