Странноватая логика retry-on в HAProxy
... Какое дело. Всем хорош nginx. За исключением одного неприятного момента. Функционал health-check для бэкенда у него платный. А все ж жадные, с деньгами расставаться не любят. Плюс, у HAProxy есть дюже удобная морда для диагностики и готовые интерфейсы для подключения его к мониторингу и сбора статистики. Поэтому в некоторых проектах "мы подумали и я решил" использовать именно HAProxy.
... Помимо прочего, у HAProxy есть логика "retry-on", которая позволяет прозрачно для клиента перенаправлять тот же самый запрос на другой бэкенд, если текущий, например, ответил 500-ой ошибкой. Но работает она, на мой взгляд, как-то странновато. Вот почему.
- В документации нигде про это не сказано, но директива "retry-on" конфликтует с опцией "prefer-last-server". Сам демон тоже не выдаст никакой ошибки, просто "retry-on" не отработает. Может, для кого-то это очевидно, но лично для меня — нет.
- Для режима проксирования на 7м уровне (HTTP) также должна быть включена опция "redispatch". Вот какое отношение она имеет к вопросу, лично мне ни разу не понятно, потому что она про Cookies, а не про коды ошибок. Но без неё тоже не работает, проверено эмпирически.
- Если какой-то из бэкендов помечен как "backup", то на него не будет распространяться действие "retry-on". Тоже, казалось бы... почему бы не попросить у бэкапного сервера инфу, если все остальные сдались / сдулись? Но нет...