балансировка соединений к узлам
Необходимо избегать перекосов соединений к узлам. На текущий момент на стороне async реализовано два механизма
Реализованное
Начальное заполнение пула (connect) соединений
Независимо от режима (bootstrap/discovery), мы последовательным обходом по нодам заполняем пул соединениями. Таким образом, в результате pool.connect имеем примерно одинаковое количество соединений к каждой ноде
Приведение состава пула в соответствие с топологией
Алгоритм reconcile может добавлять новые соединения в состав пула, при этом новое соединение устанавливается каждый раз к той ноде, к которой меньше всего соединений в пуле. Это также помогает сохранять примерно одинаковое кол-во подключений к каждой ноде
Неучтенное
Технические вспомогательные соединения
AS IS
Соединение для сервиса сбора метадаты запросов и соединение для отслеживания топологии выбираются на текущий момент из DSN нод
TO BE
Использовать любую ноду кластера, к которой установлено меньше всего соединений. при этом, ноды из фильтра forbidden_tiers также должны быть разрешены для таких соединений
Причина: представим, что для тех. соединения может использоваться только нода из allowed tiers. пул запущен, после чего все ноды из allowed tiers переходят offline. при этом мы не сможем продолжать работу, так как topology tracker не сможет создать коннект к онлайн ноде (т.к. он не может подключиться к forbidden tiers), а значит пул не сможет узнать, что ноды allowed tiers снова вышли в online
Возможно, нам стоит не просто использовать любую ноду с минимальным количеством подключений, а при этом еще предпочитать ноды из allowed_tiers
reconcile пула при перегрузке узла/ов
AS IS
Алгоритм рассчитан только на реагирование на изменения топологии: исключение из пула соединений к мертвым нодам, установка новых соединений к живым нодам. Установка новых соединений случается только тогда, когда пул не заполнен до конца. Может так случиться, что в результате работы алгоритма какие-то ноды окажутся перегруженными.
Кейс:
- в кластере ноды i1 i2 i3, размер пула 6, соединения в начале [i1 i2 i3 i1 i2 i3]
- нода i3 уходит в офлайн
- реагируем: закрытие соединений к i3 => состав [i1 i2 i1 i2] => соединений не хватает (4<6) => докидываем новые соединения => можем установить соединения только к i1/i2 (т.к. i3 офлайн) => результат состав пула [i1 i2 i1 i2 i1 i2]
- (через время) i3 снова становится офлайн, но текущий размер пула равен ему максимальному размеру => состав пула не меняем в reconcile => ноды нагружены неравномерно
TO BE
Необходимо учесть подобные ситуации в алгоритме reconcile. При этом, стоит также учитывать, что открытие/закрытие соединений не дешевая операция, поэтому просто периодически закрывать все свободные соединения и открывать с нуля в соответствии с топологией будет плохим решением. Это требует отдельной проработки.