
Multi-region quorum: «все регионы согласны» против «N из M»
cyberscoper 24 минуты назад Multi-region quorum: «все регионы согласны» против «N из M» Средний 5 мин 510 DevOps * Сетевые технологии * Алгоритмы * Высоконагруженные системы * Кейс Привет, Хабр!В моём uptime-мониторинге...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. cyberscoper 24 минуты назад Multi-region quorum: «все регионы согласны» против «N из M» Средний 5 мин 510 DevOps * Сетевые технологии * Алгоритмы * Высоконагруженные системы * Кейс Привет, Хабр! В моём uptime-мониторинге Valpero сейчас семь production-мониторов и десять probe-регионов. Когда я только начал, false-positive алёрты приходили часто — типичная история с single-region проверкой.
Поставил quorum-логику. Тут оказалось, что вариантов quorum’а несколько, и они дают разное поведение в пограничных случаях. Ниже расскажу про два главных подхода — K-of-N (как в Pingdom, BetterStack) и all-must-agree (как у меня) — с реальным кодом, который у меня сейчас в проде.
Технические детали
В конце разберу edge-кейсы которые ломают каждый из подходов, и почему я остановился на all-must-agree с consecutive-failure threshold. Два подхода к quorumK-of-N: incident открывается когда K из N регионов сообщают down. Это позволяет терпеть до K-1 одновременных fail’ов как «шум».
All-must-agree: incident открывается только когда все регионы видят down. Если хоть один регион видит up — статус становится partial (часть мира видит проблему, часть нет), но алёрт не идёт. На первый взгляд K-of-N выглядит сильнее — он чувствительнее, ловит partial outages быстрее.
На практике у этого подхода есть нюанс: что считать «N»? Если у вас сайт на CDN с PoP’ами в разных регионах, и одна PoP падает — 3-4 ваших probe-узла, которые ближе к этой PoP, увидят сайт down. Остальные 6-7 — up (они попали на другую PoP).
Отраслевые последствия
K=3 алёрт сработает, хотя реально сайт работает для большинства мира. All-must-agree даёт меньше false-positive’ов, но позже ловит реальные partial outages. Это компромисс в пользу precision вместо recall.
Что у меня в кодеПокажу как это сейчас работает в Valpero. Код упрощён, но логика та же. Хранилище — Redis (per-region status + counter): from redis import Redis from app.
config import get_settings _TTL_SECONDS = 86400 # 24hdef _redis() -> Redis: return Redis. from_url(get_settings(). REDIS_URL, decode_responses=True)def _key(site_id: int, region: str) -> str: return f"probe:region_status:{site_id}:{region}"def _fail_key(site_id: int, region: str) -> str: return f"probe:region_fails:{site_id}:{region}"Когда приходит результат probe-проверки, обновляем per-region state: def update_region_status( site_id: int, region: str, is_up: bool, threshold: int = 1, has_open_incident: bool = False, ) -> tuple: r = _redis() status_key = _key(site_id, region) fkey = _fail_key(site_id, region) if is_up: # UP всегда подтверждается мгновенно, счётчик fail-ов сбрасывается r.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





