Назад | Перейти на главную страницу

Балансировка HAProxy URI не очень сбалансирована

Я пытаюсь использовать HAProxy 1.4.22 с балансировкой URI и хеш-типом, согласованным с балансировкой нагрузки между тремя бэкэндами кеш-памяти лак. Я понимаю, что это никогда не приведет к идеальному балансу между серверами, но он должен быть лучше, чем результаты, которые я вижу.

Соответствующая часть моей конфигурации HAproxy выглядит так:

backend varnish
    # hash balancing
    balance uri
    hash-type consistent

    server varnish1 10.0.0.1:80 check observe layer7 maxconn 5000 id 1 weight 75 
    server varnish2 10.0.0.2:80 check observe layer7 maxconn 5000 id 2 weight 50
    server varnish3 10.0.0.3:80 check observe layer7 maxconn 5000 id 3 weight 50

Я проводил самотестирование, указывая свой собственный файл hosts на новый прокси-сервер, и я даже попытался перенаправить популярную домашнюю страницу на отдельный бэкэнд, который сбалансирован циклически, чтобы убрать этот выброс с хэш-сбалансированного бэкэнда, что кажется работать нормально. В качестве теста я увеличил вес varnish1 до 75, но, похоже, это не помогло. Моя нагрузка очень непропорционально сбалансирована, и я не понимаю, почему это так.

Один интересный лакомый кусочек состоит в том, что, если я поменяю местами идентификаторы, более высокий идентификатор ВСЕГДА будет получать львиную долю трафика. Почему ID повлияет на балансировку?

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

Моя цель состояла в том, чтобы уменьшить нагрузку на БД и сервер приложений за счет уменьшения дублирования на уровне кеша, для которого рекомендуется балансировка URI HAproxy, но если это будет таким несбалансированным, это не сработает для меня вообще.

Любой совет?

Я не уверен, что это очень полезно, но я немного боролся с той же проблемой - и это то, к чему я пришел;

Балансировка нагрузки на основе хэша, как вы уже установили, никогда не даст вам идеальной балансировки нагрузки. Поведение, которое вы видите, можно просто объяснить наличием нескольких самых посещаемых / самых больших страниц на одном сервере - имея несколько страниц, которые получают большой трафик, и много страниц с небольшим трафиком, этого будет достаточно, чтобы перекосить статистику.

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

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

Я бы посоветовал убедиться, что вы хешируете весь URL-адрес, а не только то, что находится слева от символа "?". Это контролируется с помощью balance uri whole в комплектации. Ref. документация haproxy. Если у вас много URL-адресов с одинаковой базой, но с разными GET-параметрами - это определенно даст вам лучшие результаты.

Я бы также принял во внимание, как балансировка нагрузки влияет на емкость ваших кеш-серверов. Если это никоим образом не влияет эффективно на избыточность - я бы не стал особо беспокоиться об этом, поскольку идеальная балансировка нагрузки - это не то, чего вы, вероятно, достигнете с помощью хеширования URI.

Надеюсь, это поможет.

В итоге я изменил конфигурацию так:

backend varnish
        # hash balancing
        balance uri
        hash-type consistent

        server varnish1 64.106.164.122:80 check observe layer7 maxconn 5000 id 1 weight 75
        server varnish2 64.106.164.121:80 check observe layer7 maxconn 5000 id 715827882 weight 50
        server varnish3 64.106.164.117:80 check observe layer7 maxconn 5000 id 1431655764 weight 38

Оказывается, идентификаторы имеют большое значение, теперь у меня они разнесены по всему диапазону, и это, кажется, помогает балансировать. Я поправил веса, как вы можете видеть.

Теперь получаем такой результат:

Средний сервер по-прежнему недостаточно используется, но он максимально сбалансирован, и это нормально для моей цели. Я использую HAproxy для хеширования URI, поэтому я могу добавить этот третий сервер лакирования без увеличения нагрузки на бэкэнд, и, похоже, он работает хорошо, я вижу заметное уменьшение нагрузки на бэкэнд с 3 сбалансированными серверами лака URI против двух случайно сбалансированных ед.

Вывод из этого заключается в том, что идентификаторы имеют большое значение и должны быть расположены через интервалы, что я не видел четко обозначенных где-либо еще. Как только идентификаторы разложены, изменение весов помогает, но это все еще очень непредсказуемо и требует множества настроек, проб и ошибок. Резкое увеличение веса сервера может привести к значительному падению его трафика, что является странным результатом.