Я использую LVS (ipvsadm) в режиме NAT для балансировки нагрузки UDP-трафика для ряда «реальных серверов». Я использую планирование с одним пакетом, чтобы трафик, исходящий из одного исходного порта на клиенте, распределялся по разным реальным серверам.
Однако я вижу, что дейтаграммы UDP, которые исходят на реальных серверах и отправляются обратно клиенту, имеют исходный ip / порт, установленный на один из реальных серверов, что сбивает клиента с толку, потому что он ожидает получить ответы с исходный ip / порт, соответствующий тем, на которые он отправил исходную дейтаграмму.
Это действительно очень странно, потому что LVS должен «скрывать» реальные серверы за виртуальным ip / портом.
Кажется, что если я отключу планирование одного пакета, исходный IP / порт исходящих дейтаграмм являются переписан LVS правильно.
Кто-нибудь сталкивался с этим? Если да, то как это можно обойти?
Если вам все еще интересно:
Я считаю, что планирование с одним пакетом не ожидает ответа от только что запланированного пакета и поэтому не сохраняет информацию о соединении. Затем, когда возвращается ответ, LVS не может найти для него соединение и поэтому не знает, какой исходный IP / порт использовать.
Похоже, это сделано специально. Найдите здесь «OPS реализовано для настроек, в которых нет ответа на исходный пакет», и вы увидите некоторые объяснения.
http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.UDP.html
Решение состоит в том, чтобы установить тайм-аут постоянства для UDP-соединений (вы можете установить его на низкое значение, если ожидаете быстрых ответов), таким образом явно устанавливая время соединения. Поскольку вы можете это сделать, OPS не имеет смысла запоминать соединения.