Currently grade Offline for an instance is only set in response to a proc_update_peer rpc request, which is only sent from the on_shutdown
trigger. So basically only the best-case scenario is covered.
We need to implement an automated system which detects if an instance stops responding and sets it's grade to Offline (or something).
Мы заводим файбер sentinel по аналогии с governor.
Мы делаем хранимку .proc_healthcheck, с результатом Ok/Err.
Сентинел работает на raft-лидере и дергает хелсчеки на всех инстансах.
Если какой-то из инстансов перестает на них отвечать, сентинел пытается закоммитить target_grade: Failed для этого инстанса. Остальную работу по фейловеру проделает говернор.
Политика реагирования настраивается глобальными опциями _pico_propertysentinel_healthcheck_period и sentinel_failover_timeout
В raft-rs уже есть direct failure detector. Его дожлно быть достаточно. Надо научиться подписываться на его статусы. свой пингер устраивать не нужно. В остальном всё ок.
Комментарий про залип tx треда: спастись от него можно только fencing. Мы fencing прорабатывали уже. Другие реплики должны дропать коннекты с залипшей реплики, чтобы, когда она отдуплит, она им не портила жизнь. это задача на ядро. Указание дропнуть коннекты будет отдавать говернор.
Фейл детектор из рафта нам не подходит. Он же на фолловерах мониторит лидера, а нам наоборот с лидера надо мониторить фолловеров. Есть конечно прогресс трекер фолловеров на лидере, но он кмк собой пинги не заменит, и таймауты на него навесить невозможно будет.
Мне тоже кажется, что должен быть способ подписаться на результат хартбитов от лидера к репликам. Я не пользовался raft-rs и не знаю, есть ли у него расхождения с папирой рафта, но кмк хартбиты передаются через AppendEntries RPC, а значит, должен быть и ответ.
Результат хартбитов в рафт ноду попадает при вызове report_unreachable, который должен вызывать пользователь библиотеки явно. То есть мы должны вызывать, но пока не вызываем, а стоит, потому что в результате у нас рафт нода продлжает слать MsgAppend на отвалившиеся инстансы. Это не сложно исправить, на уровне ConnectionPool стоит перестать игнорировать сфейлившиеся отправки сообщений и, во-первых, оповещать о фейлах рафт ноду, во-вторых, гавернора, чтобы тот инстансам грейды менял. Можно конечно и добавить промежуточное звено между нодой и гавернором в виде файбера sentinel, но пока не понятно, какую он будет пользу нести
А как у нас вообще перевыборы лидера тогда работают? Только на демо? Ведь если рафт нода не видит что кто-то умер через report unreachable, она может затупить и не начать выборы...
Перевыборы не опираются на report_unreachable. Рафт нода сама начнёт голосование, если не получит хартбит от лидера на протяжении какого-то времени. То есть критерий начала выборов это отсутствие коммуникации от лидера. report_unreachable нужен, чтобы лидер перестал спамить в ноду, которая сдохла