Make instance Offline if it's raft_main_loop is broken (applied index is lagging)
На данный момент возможна ситуация, когда инстанс пикодаты заблокирует свой поток применения рафт журнала, но при этом будет иметь стейт Online, из-за чего губернатор будет слать ему RPC в надежде получить положительный ответ.
В частности при смене стейта любого инстанса на Online губернатор пошлёт RPC proc_sharding на каждый target_state=Online инстанс кластера, где первым делом будет делаться wait_index, т.е. барьер по рафт журналу. Если при этом один из таких инстансов будет иметь сломанный raft_main_loop, то wait_index на нём никогда не закончится и proc_sharding будет возвращать таймаут. Как результат из-за проблем на части инстансов ни один инстанс в кластере не сможет сменить свой стейт на Онлайн.
Мы могли бы избежать таких сиутаций, если бы sentinel_loop мог обнаруживать таких поломанных инстансов и принудительно выводить их в Офлайн. Для этого нам нужно всего лишь отслеживать текущий applied индекс каждого инстанса, благо эта информация уже доступна нам в proc_raft_interact в RaftMessageExt структуре.
Нужно только прокинуть эту информацию до sentinel_loop и добавить в него проверку, что applied индекс на инстансе
- не меняется долгое время
- отстаёт от лидера на пороговое расстояние долгое время
И на основе одного из этих критериев sentinel_loop должен выводить инстанс в Офлайн
Это позволит нам замечать такие проблемы например через webui и автоматически изолирует сломанные инстансы от кластера
Реализация максимально простая, нужно только определиться со стратегией и подобрать название параметра, которое всех устроит. Что-то типа governor_auto_offline_applied_index_lag_max если хотим выключать инстанс если он сильно отстал (по аналогии с governor_auto_offline_timeout).