Распределение нагрузки Mysql Connections по Haproxy на основе доменных имен в запросе - PullRequest
0 голосов
/ 11 мая 2018

У меня есть архитектура обнаружения служб, в которой у меня есть haproxy для TCP-маршрутизации MYSQL-соединений на основе имен хостов. Для этого я прочитал в haproxy здесь https://www.haproxy.com/blog/enhanced-ssl-load-balancing-with-server-name-indication-sni-tls-extension/.

Он говорит нам, что действительно возможно маршрутизировать TCP-соединения на основе имен хостов, полученных в TCP-запросах через реализацию SNI.

Теперь я настроил Haproxy в соответствии с приведенной выше конфигурацией, но я не могу понять, какие изменения мне нужно сделать в конфигурации mysql в моем приложении springboot. Также, как я могу проверить, что этот haproxy работает через клиент MySQL?

1 Ответ

0 голосов
/ 12 мая 2018

действительно возможно маршрутизировать соединения TCP на основе имен хостов, полученных в запросах TCP через реализацию SNI.

Да, это было бы верно, но только если выполняются также все следующие условия:

  • В протоколе клиент сначала говорит, а
  • TLS согласовывается клиентом сразу после первоначального подключения, а
  • SNI представлен клиентом при подтверждении связи TLS.

Но с протоколом клиент / сервер MySQL ничего из этого не является правдой.

В протоколе клиент / сервер MySQL сначала сервер говорит & sup1 ;, идентифицируя себя и свои возможности (в том числе поддерживает ли он TLS), а затем клиент отвечает собственным списком возможностей, в том числе желает ли он согласовывать TLS, и наконец, начинается согласование TLS без права доступа к SNI, поскольку клиент и сервер уже подключены.

tl; dr: Протокол клиент / сервер MySQL не может быть маршрутизирован через прокси-сервер любого типа на основе имен хостов. Структура протокола делает это невозможным, потому что нет способа передать имя хоста.

Единственная опция для маршрутизации на основе имен - HAProxy иметь несколько IP-адресов, с отдельным разделом frontend или listen, связанным с каждым адресом, и имена хостов, каждый из которых указывает на один из этих адресов.


& sup1; сервер говорит первым указывает, какая сторона соединения отправляет первую полезную нагрузку после установления соединения. Конечно, клиент начинает процесс, который устанавливает соединение, но как только канал открыт, в протоколе MySQL первая полезная нагрузка в любом направлении поступает с сервера. Другие протоколы, такие как SMTP, делают то же самое - SMTP-сервер начинает диалог с чем-то вроде 220 mail.example.com ESMTP service ready. Это отличается от протоколов, таких как HTTP, где клиент говорит первым. Когда соединение установлено, сервер ничего не отправляет, ожидая, что клиент отправит что-то вроде GET / HTTP/1.1\r\nHost: example.com\r\n\r\n. В HTTPS, когда соединение установлено, сервер ничего не отправляет, и клиент инициирует рукопожатие TLS.

...