Results for category "Netzwerk"

17 Articles

w32tm: “No valid response has been received from manually configured peer”

This was one of those network bugs which took some time to fix. To give you a short background: In the last weeks we had random time NTP drifts in our Linux infrastructure, nothing serious but it was odd as they disappeared after restarting the ntpd or chrony service. During the weekend my co-worker and I were upgrading some parts of the network infrastructure (new cables, new cabling between server and switches, upgrade to the latest Sophos UTM firmware, upgrading to XenServer 7.0 and so on). After getting everything up our OMD showed a lot of NTP errors which led to problems with FreeIPA, Kerberos and SMB. Besides that, on some of the virtual machines we had NFS problems. My co-worker dealt with this problems. Parallel to that and completely unrelated I was preparing a new Active Directory domain and wanted to setup the w32tm service on Windows Server 2012 R2.

To my suprise I was not able to synchronize the time with our firewall. Using

w32tm /stripchart /computer:$FW_IP /samples:10 /dataonly

worked flawlessly but when i tried

w32tm /resync /discover

I received the error

Der Computer wurde nicht synchronisiert, da keine Zeitdaten verfügbar waren.
(The computer did not resync because no time data was available)

With w32tm debug logging enabled I got more information:

151915 13:50:46.8092075s - Logging information: NtpClient has not received response from server $FW_IP (ntp.m|0x0|0.0.0.0:123->$FW_IP:123).
151915 13:50:46.8092075s - Logging information: NtpClient: No response has been received from manual peer $FW_IP (ntp.m|0x0|0.0.0.0:123->$FW_IP:123) after 8 attempts to contact it. This peer will be discarded as a time source and NtpClient will attempt to discover a new peer from which to synchronize. Error code: 0x0000005C
151915 13:50:46.8092075s - Reachability:  removing peer $FW_IP (ntp.m|0x0|0.0.0.0:123->$FW_IP:123).  LAST PEER IN GROUP!
151915 13:50:46.8092075s - AddNewPendingPeer: manual
151915 13:50:46.8092075s - PeerPollingThread: PeerListUpdated
151915 13:50:46.8092075s - Logging error: NtpClient has been configured to acquire time from one or more time sources, however none of the sources are currently accessible and no attempt to contact a source will be made for 15 minutes. NTPCLIENT HAS NO SOURCE OF ACCURATE TIME.

At first I suspected a bug in the latest Sophos UTM firmware, so I checked the incoming packets on the firewall:

# NTP runs on UDP/123
tcpdump -vvv -i eth5 udp and port 123

Running w32tm /stripchart again I received the expected packets. Running w32tm /resync /discover showed nothing. My guess was that the UTM was not responsible for the error. I took a look into the changelog of XenServer 7.0 if anyhting had changed with the virtual interfaces of the virtual machines. The changelog itself did not have any interesting points, so it had to be an error on the lower network layers. Do you remember that I mentioned the recabling of server and switches? Well, some months ago one of our Netgear switches literally vaporized (btw, I wlll never buy a Netgear again) and had been replaced with a Cisco SG220-50. The SG220 is a nice piece of hardware and does not only work on layer 2 as the old Netgear but also on layer 3. After checking all available options we stumbled upon the settings in Security > Denial of Service > Security Suite Settings. The settings UDP Blat and TCP Blat caught our eyes: if enabled, the Cisco drops any UDP or TCP traffic where source port equals the destination port. Disabling both solved our NTP and NFS errors immediatly. By the way, w32tm /stripchart (and according to this ntpq in debug mode and with an unpriviliged source UDP port) ran flawlessly because it does not use source port 123 but another one.

Fixing gratuitous ARP requests

Due to some internal network problems I fired up Wireshark and saw a lot of gratuitous ARP requests/broadcasts. I had never seen the sending MAC or IP before but could assign it to one the ports our switching hardware. The designated port was used for a Citrix XenServer virtualization environment, so at first I suspected a miconfiguration of one of the bonds and some looping ARP packets. This assumption was wrong: I shutted down the server and the ARP requests still came from the physical network interface, so it could only be a problem/configuration of the interface itself.

I googled for “intel gratuitious ARP” and found the answer: the Intel NIC had an IPMI module and was sending announcements but the GUI was disabled.
Fixing the problem was easy. I ssh’ed into to the Citrix XenServer and used the ipmitool to disable the ARP sending mechanism:

modprobe ipmi_devintf; modprobe ipmi_si
ipmitool -d /dev/ipmi0 lan set 1 arp generate off

How-To: Queue in Astaros pop3proxy flushen/löschen

Hin und wieder kann es vorkommen, dass der pop3proxy von Astaro die eingehenden E-Mails “verschluckt”. Grund dafür ist der Spamassassin, der im Hintergrund läuft und bei bestimmten E-Mails eine extrem hohe Prozessorlast verursacht. Das Verhalten habe ich jetzt einige Male bei E-Mails beobachtet, die über die Bugtraq-Mailingliste gesendet werden. Nun kam es bei uns dazu, dass eine der E-Mails überhaupt nicht gescannt werden konnte: Spamassassin lief in einer Endlosschleife und blockierte den kompletten pop3proxy.

Die einfache Möglichkeit wäre jetzt gewesen, dass man die E-Mails direkt auf dem Mail-Server über eine Web-GUI oder einen passenden Client löscht – allerdings setzen wir Prefetching für POP3 ein, so dass die E-Mails immer noch auf der Firewall lagen und beim Aktivieren/Deaktivieren des Prefetchings nicht gelöscht wurden. Den Mail-Manager (http://firewall/mm) konnte ich ebenfalls nicht benutzen, da er in unserer Astaro-Version (aktueller Stand zum heutigen Datum) nicht zum Backend verbinden konnte – warum auch immer.

Um dieses Problem zu beheben, muss folgendes gemacht werden:

  • POP3-Proxy auf der Astaro deaktivieren
  • Mit SSH auf die Firewall schalten
  • # su
  • # psql -h db_host.local -U postgres pop3
  • psql# DELETE FROM messages;
  • exit
  • POP3-Proxy auf der Astaro wieder aktivieren

Gut, dass die E-Mails in einer stupiden PostgreSQL-Datenbank liegen, dass machte die Sache am Ende nämlich doch noch echt einfach 😉

JPA: Entitäten, die auf sich selbst verweisen / soziales Netzwerk alá Twitter

Eines meiner momentanen Projekte verlangt von mir, dass eine Klasse über zwei Seiten mit sich selbst verbunden ist. Ich versuche mal diese abstrakte Anforderung am Beispiel von Twitter zu schilder: Ein Benutzer (Klasse/Entität) hat auf der linken Seite die Personen, denen er folgt (Following) und auf der rechten Seite die Personen, die ihm folgen (Followers). Jede Entität kann untereinander mehrmals verbunden sein.

Um solch eine Datenstruktur mit Hilfe von JPA zu realisieren, braucht man zwei Klassen. Die erste Klasse realisiert den Benutzer (User), die zweite Klasse (FollowerFollowingAssociation) stellt die Verbindung zwischen zwei Benutzern her.

In der Klasse User wird über zwei OneToMany-Annotations die Verbindung zu der Assoziation hergestellt:

package de.ckl.test.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;

@Entity
@Table("user")
public class User
{
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private long id;

	@OneToMany(mappedBy = "following")
	private List<FollowerFollowingAssociation> hasManyFollowing;

	@OneToMany(mappedBy = "follower")
	private List<FollowerFollowingAssociation> hasManyFollowers;

	public void setId(long id)
	{
		this.id = id;
	}

	public long getId()
	{
		return id;
	}

	public void setFollowers(List<FollowerFollowingAssociation> _followers)
	{
		this.hasManyFollowers = _followers;
	}

	public List<FollowerFollowingAssociation> getFollowers()
	{
		return hasManyFollowers;
	}

	public void setFollowing(List<FollowerFollowingAssociation> _following)
	{
		this.hasManyFollowing = _following;
	}

	public List<FollowerFollowingAssociation> getFollowing()
	{
		return hasManyFollowing;
	}

	/**
	 * Führt dazu, dass ein Benutzer einem anderen User folgt
	 *
	 * @param _user
	 * @param _isConfirmed
	 */
	public void follow(User _userToFollow, boolean _isConfirmed)
	{
		FollowerFollowingAssociation association = new FollowerFollowingAssociation();
		association.setFollowing(_userToFollow);
		association.setFollower(this);
		association.setConfirmed(_isConfirmed);
		getFollowing().add(association);
		_userToFollow.getFollowers().add(association);
	}
}

Die FollowerFollowingAssociation mappt wiederum über zwei ManyToOne-Annotations zur User-Klasse:

package de.ckl.test.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "follower_following_association")
public class FollowerFollowingAssociation
{
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private long id;

	public void setId(long id)
	{
		this.id = id;
	}

	public long getId()
	{
		return id;
	}

	@Column(name = "is_confirmed")
	private boolean isConfirmed;

	@ManyToOne
	@JoinColumn(name = "id_follower")
	private User follower;

	@ManyToOne
	@JoinColumn(name = "id_following")
	private User following;

	public void setConfirmed(boolean isConfirmed)
	{
		this.isConfirmed = isConfirmed;
	}

	public boolean isConfirmed()
	{
		return isConfirmed;
	}

	public void setFollowing(User _following)
	{
		this.following = _following;
	}

	public User getFollowing()
	{
		return following;
	}

	public void setFollower(User _follower)
	{
		this.follower = _follower;
	}

	public User getFollower()
	{
		return follower;
	}

}

Das obige Beispiel führt dann dazu, dass einmal die Tabelle user mit dem Feld id und andererseits die Tabelle follower_following_association mit der Struktur id int, follower_id int (FK user(id)), following_id int (FK user(id)), is_confirmed boolean erstellt wird.

Für genau solch eine Anforderung wäre natürlich eine Datenbank wie GraphDB eher geeignet, aber diese mit JPA anzusprechen ist (momentan noch) nicht möglich.

.

Neues sf.net-Projekt: h2benchw2csv / Ergebnis der iSCSI Performance-Tests

Die letzten beiden Tage habe ich unser SAN und das dahinter liegende iSCSI-Geraffel ausführlich mit h2benchw von Heise / c’t getestet. Da ich absolut keine Lust hatte, alle Ergebnisse in den Text-Dateien (waren knapp 20 Files) per Hand in Excel einzutippen, frickelte ich mir kurzerhand ein PHP-Script zusammen, dass mir aus den .txt-Dateien von h2benchw eine große CSV-Datei baut. Diese kann dann wiederum in Excel oder irgendeinem anderen Tabellen eingelesen werden.

Weiterhin unterstützt h2benchw2csv – so der Name des kleinen Scripts – die automatische Umwandlung der .ps-Dateien nach .pdf. Dies geschieht mit Hilfe des PDFCreators, der in der %PATH%-Variable verfügbar sein muss. Gegenwärtig ist h2benchw2csv noch im sf.net Approval State, sollte aber morgen oder übermorgen freigeschaltet werden.

Features:

  • Umwandeln von h2benchw .txt-Ergebnissen in eine CSV-Datei
  • Komplette Inhalte von Verzeichnissen können in der CSV-Datei gespeichert werden
  • Deutsch/Englisch
  • Umwandlung der h2benchw .ps-Dateien mit Hilfe des PDFCreators nach PDF
  • 100% Open Source und Kommandozeile
  • Benötigt wird nur PHP – es wird keine zusätzliche Bibliothek benötigt

Zu den Ergebnissen meiner iSCSI-Performance-Messung ist folgendes zu schreiben:

  1. Round-Robin oder Weighted Path in einem Verbund von 4 Netzwerkkarten auf Client und Server bringen rein gar nichts, wenn sie gemeinsam auf ein Target zugreifen. Die maximale Leserate betrug 75 MByte/s, die maximale Schreibrate 60 MByte/s. Wir gingen eigentlich davon aus, dass mit jeder (Gigabit)-Netzwerkkarte die Performance mitskaliert – also eine NIC: 70 MByte/s, zwei NICs 140 MByte/s u.s.w. Dem ist aber eindeutig nicht so.
  2. Interessant war hingegen, dass bei 4 Targets und Fail Over der Gesamtdurchsatz auf ca. 200 MByte/s beim Lesen und 170 MByte/s beim Schreiben anstieg.
  3. Für mich schaut das nach einem Problem im iSCSI Initiator oder -Treiber aus.
  4. Bonding und Multipath gemeinsam benutzt bringen nichts.
  5. Die Firmware 1.46 des Areca 1231 kann nun vernünftig mit NTP-Servern umgehen – bringt aber keine bessere Performance
  6. FileIO ist beim Schreiben geringfügig schneller als BlockIO (2 MByte/s)
  7. Jumboframes (MTU 9000 auf Windows Server 2003 und 9014 auf DSS) brachten bei uns keinen Performance-Unterschied
  8. Fail Over ist schneller als Weighted Path, Weighted Path ist schneller als Round Robin
  9. Keine der vier Intel-Netzwerkkarten wurde unter Windows Server 2003 zu mehr als 50% ausgelastet. Hier gibt es eventuell auch Treiber-Probleme.
  10. Trotz allem ist unser iSCSI-SAN fix 😉

Rautiges 2009-04-15

Hier ein paar Sachen, die ich in den letzten Tagen gefunden habe und rautiert werden müssen:

  • Beim Studium hing ich einige Zeit am Thema “Vollständige Induktion” fest. Martin gab mir auf der letzten Präsenzveranstaltung den Tipp, dass es auf youtube einige interessante Videos bezüglich Algebra gibt. Natürlich gibt es auch etwas über die vollständige Induktion, was ich euch nicht vorenthalten will:
    httpv://www.youtube.com/watch?v=y8B8fl_usm0
  • Eine gute Übersicht über die Junktoren und deren Beschreibung gibt es in diesem PDF.
  • Ebenfalls eine Übersicht inklusive Informationen über Kommutativ- und Assoziativ-Eigenschaften gibt es hier.
  • Morgen werde ich mich mit den ersten Aufgaben und Tests aus dem Kurs Mathematisch-Logische Grundlagen befassen. Mit LaTeX bekommt man mathematische Formeln besonders gut dargestellt. Wer unter Windows mal LaTeX testen will, ist mit einer Distribution wie Miktex gut beraten.
  • Wer gerne Akustikgitarren-Lieder mit Ska- und Rock-Einfluss mag, sollte sich unbedingt die Band Solche anhören. Solche macht eine Mischung zwischen Kettcar, Joint Venture und E-Egal. Besonders gut hat mir der Track “Gutenberg” gefallen.
  • In RSS-/OPML-Liste haben habe ich heute zwei neue Blogs aufgenommen: Schrankmonster und aheil.de. Beide befassen sich mit der Software-Entwicklung auf der .NET-Schiene. Gefällt mir sehr gut und ist lesenswert.
  • Über Schrankmonster bin ich dann auch auf Pixelmachine gestoßen. SuperJer – der Entwickler – hat in wenigen Kilobytes einen vollfunktionsfähigen 3D-Raytracer in C bzw. C++ geschrieben, der ohne weitere Grafikbibliotheken auskommt. Der Quellcode ist gut verständlich und ich denke, einfacher kann man die Arbeit eines Raytracers nicht nachvollziehen.
  • Apache Software Foundation dominiert – das Apache Directory Studio (Eclipse-basierender LDAP-Client) wurde in der Version 1.4.0 veröffentlicht. Nach einem Blick auf die Seite der ASF realisierte ich erst, dass man nur mit OpenSource-Produkten der ASF einen Großteil der Serverdienste abdecken kann.
    Klar: Jeder kennt den Apache HTTP Server, Tomcat und Geronimo müssten auch noch ein Begriff sein. Wenn es dann aber zu CouchDB (dokumenten-oprientierte Datenbank), Directory (LDAP-Server), JackRabbit (Content Repository) und Konsorten geht, kommen einem die Begriffe nicht mehr so bekannt vor. Was ich mit diesem Eintrag sagen will: ASF ist leet.
  • Problematisches mit der Astaro Firewall
    Gestern stellte ein Kunde die Anfrage, ob wir auf deren (Windows 2003 / Exchange) Server Email-Adressen für externe Mitarbeiter erstellen können. Kein Problem: Im AD legte ich kurzerhand neue Benutzer mit passenden Exchange-Postfächern an, auf der Firewall wurde der POP3/IMAP-Verkehr an den Server geforwardet. Die Authentifizierung und Autorisierung der Benutzer am ActiveDirectory geschieht über den Exchange-Server.
    Nun mussten wir aber ebenfalls das Versenden der Emails über SMTP ermöglichen, da nur empfangen von Emails etwas eintönig und sinnbefreit ist.
    Auf der ASG (Version 7.4xx) lief ein SMTP-Proxy, der nur Verbindungen vom Mail-Provider zuließ und an den Exchange-Server weiterleitete. Der SMTP-Proxy filtert Spams gleichzeitig aus. Als einziger Relay-Host ist der eben genannte Mail-Provider eingetragen.
    Unsere erste Lösung -die auch funktionierte- war, ein einziges Benutzer-Konto für die vorher erzeugten Email-Postfächer anzulegen. Jeder Client würde dann über den selben SMTP-Benutzer seine Emails versenden.
    Mein Wunsch war es dann, dass wir im SMTP-Proxy den Relay von Emails erlauben, wenn der Benutzer in einer bestimmten Gruppe des Active Directories ist. Somit hätten wir die Benutzerverwaltung komplett im ActiveDirectory und bräuchten uns bei zukünftigen Änderungen nicht mehr um die Firewall kümmern. Außerdem hätte bei weiteren Email-Adressen das Passwort weitergegeben werden müssen.
    Wir erstellten also auf der ASG eine neue Benutzer-Gruppe. Die Gruppe wurde so eingerichtet, dass als Backend das ActiveDirectory mit der dort hinterlegten Benutzergruppe benutzt werden sollte.
    Leider funktionierte dies nicht. Sobald ein Benutzer aus der (AD)-Gruppe versuchte, eine Email zu senden, schlug die Authentifizierung fehl. Im Log des AUA konnten wir feststellen, dass die ActiveDirectory Authentifizierung überhaupt nicht statt fand.
    Ich hoffe, wir bekommen in den nächsten für dieses Problem eine Antwort von Astaro.
  • Debugging von LDAP / Active Directory Verbindungen
    Falls die Verbindung von einem LDAP-Client zum Backend (OpenLDAP, Active Directory, eDirectory etc) nicht funktionieren sollte, wünscht man sich oft ein Tool, was die Verbindungsdaten dazwischen anzeigt. Aus Sicherheits- und Performance-Gründen ist der Einsatz von Wireshark oft nicht möglich. Ein dedizierter Proxy nur für LDAP-Verbindungen nicht direkt. Das Sourceforge-Project ldap-proxy dient einem anderen Einsatzzweck, die Verbindung mit netcat bekam ich in mehreren Versuchen (sowohl mit der Windows Binary als auch mit einer Cygwin nc.exe) nicht zum Laufen.
    Nach einigem Suchen stolperte ich dann über das Shareware-Tool Proxy Workbench, das neben LDAP auch für so ziemlich jedes andere gängige Protokoll einen Proxy-Port öffnen kann.

Arbeiten über Ostern

Die cth LAN #17 habe ich gestern um 18 Uhr erfolgreich hinter mich gebracht – ich versuche in den nächsten Tagen noch eine Review dazu zu schreiben.

Heute saß ich den Nachmittag über an unserem Firmennetzwerk und habe Multipath und Bonding gebenchmarkt. Die überarbeiteten Ergebnisse lassen sich in meinem zugehörigen Blogeintrag finden.

Trunking / Bonding / Multipath

Schon einmal im Internet nach Trunking, Bonding und/oder Multipath gesucht und sich gefragt, was brauche ich eigentlich? Aus aktuellem Anlass haben wir heute einige Experimente mit diesen Verfahren gemacht.

Warum?

Die Evolution der Virtualisierung unserer Maschinen in der Firma hat mittlerweile einen langen Weg hinter sich. Zu Anfang setzten wir auf Virtual Server 2005 von Microsoft, danach folgte dann ein VMWare Server. Auf den Clients wird zu Testzwecken weiterhin VirtualBox benutzt. Warum wir von den Microsoft und VMWare-Lösungen weg wollten, war die mieserable Performance. Die Windows-Systemen liefen unter VS2005 relativ schnell. Linux hingegen ließ sich faktisch gar nicht benutzen (Kernel 2.6.20 aufwärts, Ubuntu, Debian, SuSE). Somit hatten wir im ersten Schritt VMWare neben VS2005 laufen. Allerdings verbrauchten beide Virtualisierungslösungen im Parallel-Betrieb doch einiges an Ressourcen, so dass wir von VS2005 nach VMWare migrierten. Bereits nach einigen Tagen stellten wir enorme Probleme unter Windows-Gästen beim Festplattenzugriff fest.

Wegen fehlender Debug-Möglichkeiten lag unser Schluss darin, dass vermutlich das darunterliegende RAID5 (3Ware-Controller) mit dem VMWare Write-Operations nicht klar kam. Außerdem liefen die Windows-GUIs nicht perforrmant genug.

Nach zwei Jahren des Herumärgerns starteten wir vor zwei Wochen, den XENServer zu evaluieren. Dabei ist es so, dass alle unsere virtuellen Fesplatten in unserem SAN (open-E DSS) liegen sollten. SAN, physikalische XEN-Maschine und zwei weitere Server sind an einem Netgear-Gigabit-Switch angeschlossen.

Trunking / Bonding

Trunking bedeutet, dass mehrere physikalische Leitungen zu einer “dicken” logischen Leitung zusammengelegt werden. Dies hat den Vorteil, dass der Gesamtz-Datendurchsatz (theoretisch!) um die Anzahl und den Durchsatz der zusätzlichen Leitungen erhöht werden würde. Damit ein Trunk erstellt werden kann, kommt das Link Aggregation Control Protocol zum Einsatz. Dieses Protokoll bildet den IEEE-Standard 802.3ad ab. Auf den Netgear-Switches nennt sich diese Funktion Link Aggregation Group (LAG).

Der Begriff Trunking wird häufig auf Seiten des Switches verwendet. Bei den Netzwerkkarten an sich wird weitaus häufiger der Begriff des “Bondings”, d.h. das Zusammenfassen von mehrerer Netzwerkkarten zu einer, benutzt. Grundsätzlich sind die Begriffe Bonding und Trunking aber gleichbedeutend zu benutzen.

Beim Bonding gibt es verschiedene Modi. Unter Windows mit einer Intel PRO/1000 PT Quad Port LP kann man aber beispielsweise keinen direkten Modus auswählen, es wird immer der Modus 802.3ad benutzt.

Linux bzw. Linux Channel Bonding Project hingegen kennt weitere Modi:

  • mode=0 (balance-rr): Dabei werden alle gebondeten Netzwerkkarten nacheinander benutzt. Paket a wird über phys. eth0 gesendet, Paket b über eth1 u.s.w. (Load Balancing und Fehlertolerant)
  • mode=1 (active-backup): Es ist immer eine Netzwerkkarte aus dem Bond aktiv. Sobald diese deaktiviert wird (Netzwerkkarte kaputt, Link zwischen NIC und Switch weg etc.) wird die nächste Karte aus dem Bond aktiviert (Fehlertolerant)
  • mode=2 (balance-xor): Für jede Anfrage wird eine Netzwerkkarte ausgewählt und diese wird im Laufe der Verbindung weiter benutzt (Fehlertolerant und Load Balancing)
  • mode=3 (broadcast): Der Name ist Programm: Auf allen NICs wird übertragen (Fehlertolerant)
  • mode=4 (802.3ad): Hiermit wird 802.3ad für das Bond benutzt. Der Switch muss das Protokoll unterstützen.
  • mode=5 (balance-tlb): Steht für Transmit Load Balancing, wenn ein Slave aufällt, wird die MAC-Adresse von einem anderen Bond-Mitglied übernommen (Fehlertolerant)
  • mode=6 (balance-alb): Steht für Adaptive Load Balancing, hier werden die ARP-Requests des lokalen Systems vom Bonding-Treiber überschrieben (Fehlertolerant)

Mehr Infos auf englisch gibt es bei Linux Horizon, von wo ich auch die Informationen her habe.

Bonding im XENServer

Im XENServer 5.x kommt das oben genannte Linux Channel Bonding Project zum Einsatz. Unsere bisherige Hardware lief mit einer LACP nach 802.3ad. Nachdem wir in der Oberfläche des XenCenters ein neues Bond erstellt hatten, wurde es auch wunderbar hochgefahren. Allerdings arbeitet das Bond standardmäßig in einem eigenen Modus. Damit war es nicht möglich, unser SAN anzupingen. SAN und XEN lagen im gleichen Subnetz. Grund dafür war eben, dass die Modi sich unterschieden. Damit nun XENServer den Modus 802.3ad benutzt, muss unter /etc/sysconfig/networks der Eintrag BONDING_OPTS=”mode=4″ hinzugefügt werden. Danach müssen die Interfaces neu gestartet werden. Im Anschluss konnte sich der XENServer über den NetGear GS748T mit dem SAN verbinden.

Wenn bis zu dieser Stelle durchgehalten hast, würde dich sicherlich auch folgende PDF interessieren: Virtualiasierung und Netzwerkstruktur 😉

Multipath!

Beim Zugriff auf unser SAN per iSCSI besteht die Möglichkeit, Multipath zu aktivieren.

Beim Bonding besitzt jedes Bond genau eine IP-Adresse. Die einzelnen Bond-Slaves (Netzwerkkarten) besitzen keine fest zugewiesene IP-Adresse mehr. Bei einem Bond aus 4 Netzwerkkarten würde das Bond über eine IP-Adresse angesprochen werden. Im Gegensatz dazu besitzt beim Multipath jeder Netzwerkkarte eine IP-Adresse. Dabei ist es aber wichtig, dass jede Adresse in einem unterschiedlichen Subnetz liegt. Anhand des Subnetzes wird entschieden, an welche Karte das Paket letztendlich gesendet wird. Multipath erhöht durch diese Technik zum einen den Datendurchsatz, zum anderen bietet es höhere Fehlertoleranz.

Beim Multipath gibt es ebenfalls verschiedene Modi, die Auswirkungen auf die Performance und Sicherheit haben:

  • Fail Over – entspricht dem mode=2 beim Bonding
  • Round Robin – die Pakete werden gleich auf die einzelnen Pfade verteilt (mode=0 beim Bonding)
  • Round Robin With Subset – eine Mischung zwischen Fail Over und Round Robin. Sobald eine der aktiven Pfade wegbricht, werden die inaktiven Pfade aus dem Standby aufgeweckt und benutzt.
  • Least Queue Depth – hiermit wird ein Lastenausgleich gefahren, der dem Round Robin entspricht. Wenn die einzelnen Pfade vom Durchsatz her nicht gleichmäßig augelastet sind, wird versucht, die Daten über die weniger benutzten Pfade zu transportieren.
  • Weighted Paths – Lastenausgleich, der vom Benutzer eingstellt werden kann. Damit lassen sich quasi manuelle Routing-Metriken festlegen
  • Least Blocks – Die Anfragen werden an den Pfad weitergeleitet, der die kleinste Nummer an blockierenden I/O-Zugriffen besitzt.

Fragen? Fragen!

  • Soll ich Trunking oder Multipath einsetzen?
    Das hängt von der Umgebung ab. Mit Trunking hat man mehr ein paar mehr Möglichkeiten, was die einzelnen Modi angeht. Allerdings funktionieren nicht alle Modi auf allen Betriebssystemen. Für 802.3ad müssen außerdem die Switches das Protokoll unterstützen. Multipath bedeutet höheren Konfigurationsaufwand, da jede Netzwerkkarte eine eigene IP in einem eigenen Subnetz benötigt.
  • Kann ich Multipath über einen LACP-Trunk fahren?
    Ja, ich habe zwei Bondings auf jedem Server eingerichtet und diese dann mit Multipath (Round Robin) getestet. Die Verbindung funktioniert einwandfrei, von der Performance her gibt es aber keinen Unterschied zum normalen Bonding. Außerdem ist es doppelter Konfigurationsaufwand, sowohl Bonding als auch Multipath einzurichten.
  • Ist Bonding oder Multipath performanter?
    Im Test war das Bonding/Trunking beim Lesen geringfügig langsamer als Multipath. Beim Schreiben hingegen war Multipath fast doppelt so schnell.
  • Welches ist der schnellste Multipath-Modus?
    Im Test ergab sich, dass die Policy “Weighted Paths” mit ca. 4 MByte/s die Nase vorne hatte
  • Funktioniert Multipath auch unter Windows?
    Ja, der iSCSI Initiator von Microsoft hat dieses Feature implementiert.
  • Kann ich die Load Balance Policy “Least Queue Depth” oder “Least Blocks” ind der Kombination Microsoft iSCSI Initiatior und open-E DSS nutzen?
    Nein, in der Kombination Windows (Server 2003, XP, Vista) und open-E DSS ist diese Policy für Multipath nicht möglich.