Ich habe Haproxy mit Keepalived für den Lastausgleich und das IP-Failover eines Percona-Clusters eingerichtet, und da es hervorragend funktioniert, möchte ich dasselbe lb / Failover für einen anderen Dienst / Daemon verwenden.
Ich habe Haproxy folgendermaßen konfiguriert:
listen my_service 0.0.0.0:4567
mode tcp
balance leastconn
option tcpka
contimeout 500000
clitimeout 500000
srvtimeout 500000
server host1 xxx.xxx.xxx.xx1:4567 check port 4567 inter 5000 rise 3 fall 3
server host2 xxx.xxx.xxx.xx2:4567 check port 4567 inter 5000 rise 3 fall 3
Der Lastausgleich funktioniert einwandfrei, aber der Dienst sieht die IP des Load Balancers anstelle der tatsächlichen IPs der Clients. Im http-Modus ist es recht einfach, dass Haproxy die Remote-IP weitergibt, aber wie mache ich das im TCP-Modus? Dies ist aufgrund der Art des Dienstes, den ich zum Lastausgleich benötige, von entscheidender Bedeutung.
Vielen Dank! Vito
load-balancing
haproxy
Vito Botta
quelle
quelle
Antworten:
Nur für zukünftige Referenzen ist keepalived eine Lösung für Failover und nicht für Lastausgleich (vielleicht meinen Sie LVS?). Der transparente Proxy-Modus für HAProxy hat nichts mit einer speziellen Art des Sendens der ursprünglichen IP zu tun. Dies wäre der normale nicht transparente HTTP-Modus, in dem Sie einen standardisierten HTTP-Header verwenden können.
Meiner Meinung nach lautet die richtige Antwort auf die ursprüngliche Frage: Sie können die transparente Proxy-Unterstützung in HAProxy auf einem TPROXY-fähigen Linux-Kernel kompilieren. Dies ermöglicht zusammen mit der richtigen TPROXY-unterstützenden Version + Konfiguration von iptables auf demselben Computer eine tatsächliche vollständig transparente TCP-Proxy-Unterstützung. Dies bedeutet, dass Backend-Server KEINE spezielle Konfiguration benötigen.
Beachten Sie, dass dies nicht das empfohlene Setup für HAProxy ist und nur verwendet werden sollte, wenn Sie es unbedingt benötigen.
quelle
Es gibt anscheinend eine Art "transparenten" Modus für Haproxy, den ich noch nie angeschaut habe oder mit dem ich etwas zu tun haben möchte, den Sie ausprobieren könnten. Andernfalls müssen Sie lernen, was auch immer der Backend-Dienst über die spezielle Methode von haproxy zum Senden der ursprünglichen IP ("PROXY blahblah") ist, und den Dienst die ursprüngliche IP daraus ziehen lassen.
Warum beschäftigen Sie sich jedoch mit Haproxy? Sie sind bereits an Ort und Stelle, und es führt auch einen ordnungsgemäßen transparenten Lastausgleich durch.
quelle
Wenn Sie
send-proxy
in Ihrer Konfiguration (pro Server) verwenden, erhalten Sie die ursprüngliche Quell-IP auf der empfangenden Serverseite, auch im TCP-Modus. Dies erfordert HAProxy 1.5+.Weitere Informationen zum Proxy-Protokoll finden Sie in der HAProxy-Dokumentation .
quelle
Sie können den HAProxy als NAT-Modus festlegen, der in Schicht 4 weiterhin den TCP-Modus verwendet, die IP jedoch transparent macht.
Auf der anderen Seite verwendet der transparente HAPorxy-Modus den HTTP-Modus in Schicht 7, der Ihren Punkt nicht trifft, da
forwardfor
im HTTP-Modus bereits Optionen vorhanden sind .quelle
Diese Konfiguration hat bei mir funktioniert. Die Quell-IP kann in $ _SERVER ['HTTP_X_FORWARDED_FOR'] abgerufen werden:
quelle