Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Проблема при переезда инстансов на новый сервер #494

Open
winmaxdev opened this issue Oct 14, 2024 · 1 comment
Assignees
Labels
bug Something isn't working customer

Comments

@winmaxdev
Copy link

По тикету https://jira.vk.team/browse/TNT-1175 ,
Функция vshard.router.routeall()
Возвращает все репликасеты не учитывая их вес

Например может быть ситуация когда весь репликасета 0. Тогда нет смысла отправлять запрос на такой репликасет

Предлагает сделать функцию, которая будет возвращать только те репликасеты где есть бакеты.

@winmaxdev winmaxdev added the bug Something isn't working label Oct 14, 2024
@Serpentian
Copy link
Contributor

Serpentian commented Oct 17, 2024

Почему пользователи не могут сделать?

for _, rs in pairs(vshard.router.routeall()) do
    if rs.weight ~= 0 then
        rs:callro(<...>)
    end
end

Роутер делает ровно то, что указано в документации: возвращает все известные репликасеты, пользователи должны понимать, что некоторые из них могут быть нерабочими (disabled или вес в 0) и должны это учитывать при написании своего кода, раз уж они решили пользоваться routeall.

Вернуть список репликасетов, на которых по мнению роутера есть на данный бакеты мы можем, без проблем, но исходную проблему эту не решает, вот почему:

У роутера имеется только кеш бакетов и где они находятся. Например, репликасет был с бакетами и его резко задизейблили, он больше не отвечает роутеру. Роутер будет считать, что бакеты на репликасете еще есть и вернет этот репликасет в функции, которую вы просите.

Если вес репликасета 0, это не значит, что там на данный момент нет бакетов, они могут только переезжать, и бакеты там могут еще оставаться. Чтобы убедиться, что там этого бакета нет, нужно чаще всего сделать запрос на инстанс и он нам об этом расскажет, после чего мы обновим кеш роутера (есть также обновление кеша роутеров в фоне, но это происходит не сразу). Если мы не можем достучаться до репликасета, то мы ничего и не можем сказать об этом.

Если пользователь использует routeall, это его обязанность проверить weight репликасета, проверить, что он доступен. Нужно понимать, что запросы сделанные через replicaset API (rs:callro например) не обновляют кеш роутера, это не вызов функции роутера.

Пока я не понимаю, чего хочет добиться пользователь, я не могу предложить адекватного решения по проблеме. Возможно, клиент хочет увидеть map_callro (и его други вариации с balance и prefer_replica), в которых мы самостоятельно проверим, что все репликасеты доступны, остановим ребалансинг, сделаем запросы и возобновим ребалансинг. Но если репликасет недоступен, будет также возвращена ошибка.

Мне нужен контекст проблемы, предложенное в тикете решение я считаю невалидным

@Serpentian Serpentian added the needs feedback Something is unclear with the issue label Oct 17, 2024
@winmaxdev winmaxdev changed the title T-Bank проблема при переезда инстансов на новый сервер Проблема при переезда инстансов на новый сервер Oct 21, 2024
@Serpentian Serpentian removed the needs feedback Something is unclear with the issue label Nov 13, 2024
@Serpentian Serpentian self-assigned this Nov 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working customer
Projects
None yet
Development

No branches or pull requests

3 participants