Apache Loadbalancer, was und wie behandelt man den Ausfall?

PHuV

Banned
Registriert
März 2005
Beiträge
14.219
Ich habe hier ein Apache 2.4.6 Webserver und möchte ihn gerne so konfigurieren, daß er einen Ausfall eines Knotens erkennt und dann alle Services und Routen auf den anderen Knoten schwenkt. Es gibt 2 Server test01 und test02 mit dem Ports 8040 für Karaf Container, wo die Routen und Services abgesetzt werden sollen. Aktuell ist einfaches Balaning per byrequests eingestellt.

/etc/httpd/conf.d/proxy_balancer.conf

Code:
<IfModule mod_proxy.c>

<Location /balancer-manager>
    SetHandler balancer-manager
    Order deny,allow
    #Deny from all
    Allow from all
    Satisfy all
</Location>

<Proxy balancer://test_cluster>
    BalancerMember http://test01:8040
    BalancerMember http://test02:8040
    ProxySet lbmethod=byrequests
</Proxy>

ProxyPass /testc balancer://test_cluster
</IfModule>
Was muß ich nun anstelle ProxySet lbmethod=byrequests (Verteilung) verwenden, wenn der Loadbalancer bemerkt, daß ein Service nicht durchgeht, weil der Knoten ausgefallen ist.

Bei den Balancer parameters finde ich leider nichts, was irgendwie passen könnte.
https://httpd.apache.org/docs/current/mod/mod_proxy.html

Es gibt zwar ein Beispiel für Timeouts
Code:
ProxyPass "/example" "http://backend.example.com" max=20 ttl=120 retry=300
doch das behandelt hier den gesamten Cluster.

Kennt jemand die korrekte Konfiguration dafür?
 
Zuletzt bearbeitet:
Lösung:

Durch Tests und Lesen der Doku habe ich es nun selbst geschafft, wobei das nicht so ganz intutiv ist, was da steht:

https://httpd.apache.org/docs/current/mod/mod_proxy.html

Code:
<IfModule mod_proxy.c>

<Location /balancer-manager>
    SetHandler balancer-manager
    Order deny,allow
    #Deny from all
    Allow from all
    Satisfy all
</Location>

<Proxy balancer://test_cluster>
    BalancerMember http://test01:8040 keepalive=On route=qa-test01 ttl=60 ping=2000ms
    BalancerMember http://test02:8040 keepalive=On route=qa-test02 ttl=60 ping=2000ms
    ProxySet lbmethod=byrequests stickysession=ROUTEID
</Proxy>

ProxyPass /testc balancer://test_cluster
</IfModule>
  • Keepalive, damit die Firewall diese Messages nicht dropped (blödes denglisch, aber fallen lassen hört sich doof an).
  • route, damit das als Wert an die Session ID angehängt wird
  • ttl = Time to live Parameter in Sekunden
  • ping, der eigentliche Verbindungstest, ob der Server mit dem Port vorhanden ist
  • stickysession = Balancer sticky session name
Verstehen tu ich nicht alles, aber es funktioniert. Dokumentiert, damit sich der nächste Suchende freut.
 
dropped = aussortiert ;)

Danke, ich hatte selbst keine Lösung, stehe aber vor einem ähnlichen Problem. Du hast mir sehr geholfen! :)
Einige Fragen habe ich noch:
1. Wäre hier ein kürzerer ttl von z.B. 10 ausreichend?
2. So, wie ich das verstanden habe, sind alle Rechner im gleichen Netz. Wäre es nicht sinnvoller die Ping Zeit auf max. 500 zu reduzieren und dafür einen Retry zu nutzen? Damit könnte ein kleiner Schluckauf im Netzwerk abgefangen werden und es würden nut tatsächliche Ausfälle erfasst. Oder habe ich da gerade einen Denkfehler?

Mfg Kae
 
@The Ripper:
Ja, da gebe ich dir nach der RFC Definition recht. Hier geht es aber nicht um den Transport von Daten, sondern um die Dauer, nach der eine unbenutzte Verbindung geschlossen werden kann.
... Use the ttl parameter to set an optional time to live; connections which have been unused for at least ttl seconds will be closed.
Quelle: https://httpd.apache.org/docs/current/mod/mod_proxy.html

Mfg Kae
 
Ich kämpfe jetzt gerade wieder weiteren Problemen, so trivial ist die Sache wohl nicht. :(

  • Der Paramenter route=qa-test01/02 muß für SOAP Anfragen weggelassen werden, sonst funktioniert das Routing nicht. Da solche Parameter einfach nur hinten an den Aufrufstring angehängt werden, sollte das normalerweise kein Problem sein, aber man sieht dann im Anicht mehr, an welchem Knoten das Ding so ging.
  • Zudem führt die Konfiguration zu massiven Timeoutproblemen bei den Serviceaufrufen
    Code:
    /var/log/httpd/error_log
    ---------
    [Mon Dec 19 15:12:43.626119 2016] [proxy:error] [pid 26584] [client 82.135.48.191:60322] AH00898: Timeout on 100-Continue returned by /esb/services/livePriceRequest
    [Mon Dec 19 15:12:53.764064 2016] [proxy_http:error] [pid 26585] (70007)The timeout specified has expired: [client 82.135.48.191:44253] AH01102: error reading status line from remote server tprodesb02:8040
    ---------
    Ich hab hier mit den verschiedenen Paramentern rumgespielt, kleine und große Werte verwendet, z.B. timeout, connectiontimeout (dieser dokumentierte Paramenter funktioniert überhaupt nicht), siehe https://httpd.apache.org/docs/current/mod/mod_proxy.html, aber nichts hilft.
 
Zurück
Oben