Wozu ein eigener Cluster?
Verteilte Systeme haben mich schon immer fasziniert. Die Entwicklung solcher Systeme erfordert aber einiges an Administrationsaufwand um eine entsprechende Entwicklungs- und Testinfrastruktur aufzusetzen.
Grundsätzlich gibt es zwei Möglichkeiten:
- Virtualisierung und Simulation eines Netzwerks. (Ein Tool um das zu vereinfachen habe ich bereits 2004 User Mode Linux Control Center (UMLinuxCC) im Rahmen meiner Diplomarbeit entwickelt.)
- Simulation mittels Hardware. Dies war bis jüngst die teuerste Alternative. Mit günstigen Einplatinenrechner wie z.B. dem Raspberry PI ist das nun aber problemlos möglich.
Der Cluster
Mein Cluster besteht aus 6 Raspberry PI 2 mit je 16GB microSD Speicher. Untereinander sind die Knoten über einen 100MBit Ethernet Switch verbunden, der wiederum über einen alten WLAN-Router im Bridge-Modus ins WLAN eingebunden ist, um so den Zugriff von anderen Rechnern aus und aufs Internet zu ermöglichen.
Cluster-Verwaltung
So ein Cluster mit 6 Nodes mittels SSH zu verwalten wäre eine ziemliche Fleissarbeit. Zum Glück gibt es bereits passende Tools, welche einem viel Arbeit abnehmen können. Die wohl bekanntesten Tools zur DevOp-Automatisierung sind Puppet, Chef und Ansible. Ich habe mich als erstes für Ansible entschieden, da es keine Installation auf den Nodes erfordert. Einzige Voraussetzung ist, dass auf die Nodes Zugriff via SSH ermöglichen, was sowieso schon der Fall war. Einzig auf dem Rechner, von dem man aus das Cluster verwalten will benötigt die Installation von Ansibel, die über PIP ein Einzeiler ist:
pip install ansible
Ist Ansible erst mal heruntergeladen und installiert, muss man ein Host-File erstellen, das sogenannte Inventory-File. Da ich unter Mac OS X dafür nicht /etc/ansible/hosts verwenden wollte, habe ich in einem Unterordner ein eigenes hosts-File erstellt.
[cluster:vars] ansible_ssh_user=pi ansible_ssh_pass=raspberry [cluster] 192.168.1.11 192.168.1.12 192.168.1.13 192.168.1.14 192.168.1.15 192.168.1.16
Um nun alle Nodes im Cluster zu pingen, kann folgender Befehl verwendet werden, unter der Voraussetzung, dass man sich auf dem Terminal im Verzeichnis des hosts-File befindet (Option -i . für Inventory-Verzeichnis = .):
ansible all -m ping -i .
Ansible funktioniert via SSH. Daher ist ein ping hier durch das Ansible ping-Modul (-m ping) realisiert, das einfach ein SSH-Login auf jedem Node durchführt und so die Verbindung prüft.
Eben so hilfreich ist es das Cluster mit einem solchen Befehl herunterzufahren:
ansible all -m command -a 'sudo /sbin/shutdown -h now' -i .
Ausblick
Da mein Cluster nun funktioniert, plane ich in näherer Zukunft einige Test mit verteilten Applikationen:
- Lambda-Architektur mit
- Hadoop Cluster für Batch Layer
- Spark Cluster für Speed Layer
- MicroServices Simulation mit Akka
- Tests unterschiedlicher Verteilter Stores/DBs wie CouchDB, Redis, Cassandra, etc.
Dieser Post basiert auf einem privaten Projekt des Autors.
Der original Post ist auf www.bitweber.ch zu finden.