Im WAN gibt es oft die Konstellation, dass man mehrere Datenpfade zwischen einzelnen Netzknoten hat, welche primär zur Herstellung von Redundanz gedacht sind. Man ist also oft in der Situation, dass einige Datenpfade nur im Standby sind. Umgesetzt wird dies i.d.R. über ein Routingprotokoll (z.B. OSPF), welches die Datenpfade mit entsprechenden Metriken versieht und immer „den günstigsten“ Pfad in die aktive Routingtabelle (FIB) einträgt. Bei Pfaden welche dieselben Kosten besitzen wird ein beliebiger Pfad ausgewählt und in die FIB eingetragen.
Equal Path MultiPath Routing (ECMP) beschreibt nichts anderes als, dass alle Pfade mit den selben Kosten zu einem Ziel in die FIB eingetragen werden. Somit besteht nun die Möglichkeit mehrere aktive Routen zum Ziel zu haben, was wiederum bedeutet, dass man ein weiteres Auswahlverfahren für die zu routenden Pakete benötigt.
In der Praxis existieren hier mehrere Verfahren, welche jeweils individuelle Vor,- und Nachteile besitzen:
- Session-Based Loadbalancing:
Hier wird bei jeder neuen Session (im Routerjargon „Flow“ genannt) entschieden welcher Pfad genutzt wird. Dies kann einfach abwechselnd (RoundRobin), statisch (Hashed) oder auslastungsabhängig (LeastRecentlyUsed) erfolgen. Von Vorteil ist, dass eine Session immer über einen Link geroutet wird und somit Probleme wie das Überholen von Paketen und das damit verbundene Reordering vermieden werden. Dieser Vorteil kann aber auch als Nachteil angesehen werden, da eine einzelne Session nie mehr als die durch einen Link bereitgestelle Bandbreite nutzen kann, auch wenn es mehere ECMP-Routen gibt. Dieses Verfahren ist auch unter dem Namen „flow-based“ Loadbalancing bekannt. - Round-Robin-Based Loadbalancing:
Beim Round-Robing Verfahren werden Pakete einfach abwechselnd auf beide Links geschickt, was zur Folge hat, dass eine einzelne Session durchaus mehr als einen Link auslasten kann, jedoch immer die Gefahr besteht, dass PacketReodering stattfinden muss. Dieses Verfahren ist auch unter dem Namen „packet-based“ Loadbalancing bekannt.
Neben der Wahl des richtigen Lastverteilungsverfahrens ist bei der Nutzung von ECMP noch folgendes zu beachten:
- Die Pfadcharakteristiken sollten wirklich (sehr) ähnlich sein.
Es ist völlig okay zwei 10 Mbit/s Verbindungen per ECMP aktiv/aktiv zu nutzen, jedoch sollte man sich sehr überlegen ob es Sinn macht eine 100 Mbit/s und eine 2 Mbit/s Verbindung auf die selbe Weise zu bündeln. Dabei ist es egal ob Session-Based oder per Round-Robin, das Ergebniss wird immer ziemlich unbefriedigend sein.
Bei der Charakteristik sind auch Latenzen nicht unerheblich da es hier gerade beim Round-Robin Verfahren zu Reordering Problemen kommen kann die ziemlich seltsame Fehlerbilder – angefangen von hoher CPU-Last auf Servern bis hin zu stallenden Sessions bei nicht ganz so perfekten IP-Stacks. - Das Verfahren sollte auf allen beteiligten Routern identisch bzw. kompatibel sein.
Schlecht ist es wenn ein Router flow-based und der andere router packet-based arbeitet, weil somit die oben genannten schwer zu troubleshootenden Fehlerbilder auftauchen können. - Vorsicht bei WAN-Optimierungen (z.B. Riverbed Steelhead)
Nutzt man ECMP in Verbindung mit WAN-Optimizern muss dafür gesorgt werden, dass der Datenfluss an den Endpunkten (also den LAN-Ports der WAN-Optimizern) wieder symmetrisch ist, da man sonst sogenannte Assymetrischen Routen hat, die i.d.R. von WAN-Optimierern mit dem Einstellen der Optimierung für ebendiese Session belohnt wird. Darüber hinaus kann es zu Störungen im AutoDiscovery Verfahren kommen und keine oder nur ein gewisser Prozentsatz der Sessions optimiert werden.
Berücksichtigt man diese Punkte kann sich ECMP an sehr vielen verschiedenen Stellen als sehr nützlich erweisen:
- Trivial: Lastverteilung auf verschiedene Standleitung.
Unglaublich aber wahr, dafür wurde ECMP gebaut 🙂
- Lastverteilung für VPN-Verbindungen
Wenn beispielsweise ein Site-to-Site VPN mehr Bandbreite braucht, als dass ein einzelnes System liefert, ist ECMP durchaus ein interessanter Kandidat, denn damit wird sowohl Redundanz (Ausfall bzw. Wartung einer Strecke und eines VPN-Systems) als auch die Bandbreitenerhöhung umgesetzt. Hierbei ist zu beachten, dass die Konvergenzzeiten des zugrundeliegenden Routingprotokolls angemessen kurz sind. - Lastverteilung für Firewalls
Auch hier gilt das selbe wie für VPN-Verbindungen: ECMP kann helfen ScaleOut Konzepte von Firewalls umzusetzen. Hierbei ist zu beachten, dass der Firewallverbund eine Syncronisation der Firewallstates (vom Connectiontracking) hat, weil es passieren kann dass ein Firewallsystem nur einen „halben Stream sieht“, was ohne Statesync i.d.R. als böse bewertet und gesperrt wird.
In den nächsten Artikeln werde ich (entsprechendes Feedback vorausgesetzt) ein paar interessante Beispiele anhand von Juniper Routern und JunOS genauer beleuchten.
Links für weiterführende Informationen:
Englische Wikipedia: http://en.wikipedia.org/wiki/Equal-cost_multi-path_routing
ECMP mit JunOS: http://www.juniper.net/techpubs/en_US/junos13.2/topics/concept/routing-policy-security-ecmp-flow-based-forwarding-understanding.html