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

При использовании балансировки нагрузки TCP с HAProxy весь исходящий трафик проходит через LB?

Я настраиваю приложение, которое будет размещено с использованием виртуальных машин (вероятно, Amazon, но это не высечено в камне), для чего потребуется как балансировка нагрузки HTTP, так и балансировка нагрузки большого количества (50k или около того, если возможно) постоянных TCP-соединений. Объем данных не так велик, но обновления происходят часто.

Сейчас я оцениваю балансировщики нагрузки и немного запутался в архитектуре HAProxy. Если я использую HAProxy для балансировки TCP-соединений, весь ли результирующий трафик должен проходить через балансировщик нагрузки? Если да, то подойдет ли другое решение (например, LVS или даже nginx_tcp_proxy_module)?

HAProxy (как и многие балансировщики нагрузки) обычно поддерживает два разговора. Прокси-сервер имеет сеанс (в данном случае tcp) с клиентом и еще один сеанс с сервером. Следовательно, с прокси-серверами вы в конечном итоге увидите в 2 раза больше соединений на балансировщике нагрузки. Следовательно, весь трафик проходит через балансировщик нагрузки.

Когда дело доходит до масштабирования между несколькими балансировщиками нагрузки, я не думаю, что вам это нужно. Но практичный и довольно простой способ сделать это - использовать что-то вроде keepalived с два плавающие IP-адреса и циклический DNS между этими двумя IP-адресами. С keepalived, если один из балансировщиков нагрузки выйдет из строя, другой будет удерживать оба IP-адреса, так что таким образом вы получите высокую доступность. При этом, я думаю, вас устроит один активный экземпляр haproxy с вашей нагрузкой.

HAProxy очень хорошо масштабируется. Например, сеть Stack Exchange использует веб-сокеты, которые поддерживают открытые TCP-соединения. Пока я публикую это, у нас есть 143 000 установленных TCP-сокетов на виртуальной машине VMware без проблем. Использование ЦП на виртуальной машине составляет около 7%.

При такой настройке с HAProxy убедитесь, что вы установили maxconn достаточно высок. Вот несколько примеров конфигурации HAProxy для начала:

frontend fe_websockets
        bind 123.123.123.123:80
        mode tcp
        log global
        option tcplog
        timeout client 3600s
        backlog 4096
        maxconn 50000
        default_backend be_nywebsockets

backend be_nywebsockets
        mode  tcp
        option log-health-checks
        option redispatch
        option tcplog
        balance roundrobin
        server web1 10.0.0.1:1234
        server web2 10.0.0.2:1234
        timeout connect 1s
        timeout queue 5s
        timeout server 3600s

Существует возможность использовать и настраивать DSR (Direct Server Return), но это не имеет ничего общего с Loadbalancer, а настраивается в tcp-стеке (таблицах маршрутизации). Мы использовали это для большого портала потокового видео. Несмотря на то, что это работает, у вас возникнет серьезная головная боль в отношении сложности необходимой маршрутизации.

Таким образом, я бы не рекомендовал использовать эту технику, не учитывая очень тщательно ее использование и недостатки.

Может быть, есть какие-то подсказки для начала:

Радоваться, веселиться!

Да, весь трафик обычно должен проходить через балансировщик нагрузки. Запросы принимаются балансировщиком нагрузки, а ответы отправляются обратно в балансировщик нагрузки, который отправляет их обратно клиентам.

Что касается выбора правильного инструмента, у меня нет большого опыта в отношении других вариантов. Я использую haproxy, он действительно хорош, стабилен и может обрабатывать большой объем трафика. Кроме того, его возможности ACL великолепны.