Paradigmenwechsel in der Storagewelt: Herkömmliche RAID-Systeme sind für den Betrieb mit drehenden Festplatten konzipiert. SSDs funktionieren zwar, man verschenkt aber eine Menge Potential. Der Zugriff auf traditionelle Festplatten funktioniert gänzlich anders, als das für SSDs sinnvoll wäre. AccelStor hat sich darüber Gedanken gemacht, und mit ihrer FlexiRemap Technologie eine Möglichkeit geschaffen, das Potential von SSDs in All-Flash-Arrays auszuschöpfen.
NAND-FLASH UND RAID-ALGORITHMEN
Der größte Teil heute verbauter Flash-Module ist sogenannter NAND-Flash. Der Begriff NAND bezeichnet den Aufbau einer einzelnen Speicherzelle und lässt Rückschlüsse zu, wie Informationen in der Zelle gespeichert und wieder ausgelesen werden. Eine andere, weitaus seltenere, Technik wäre das NOR-Flash.
Eine einzelne Zelle in einem NAND-Flash kann üblicherweise zwei Bits speichern. Man spricht dann von einer Multi Level Cell, oder kurz MLC. Die einzelnen Zellen sind in Pages organisiert und diese wiederum in Blöcke zusammen gefasst. Je nach Bauart, Hersteller und Flash-Controller (auf dem einzelnen Flash-Chip) umfasst eine einzelne Page in einem NAND-Flash 512 Bytes, 2048 Bytes oder 4096 Bytes. Ebenfalls abhängig von Bauart, Hersteller und Controller besteht ein einzelner Block aus 32, 64 oder 128 Pages. Ein Flash-Chip hat viele solcher Blöcke, eine SSD wiederum mehrere bis viele solcher Flash-Chips. Je nach Kombination der Größe einer Page und der Anzahl Pages in einem Block haben übliche Flash-Chips eine Blockgröße zwischen 16 KiB und 512 KiB.
Gelesen und geschrieben wird in ein Flash-Modul auf Page-Level, also 512, 2048 oder 4096 Bytes am Stück. Während Lesezugriffe tatsächlich zufällig über den gesamten Chip verteilt werden können, sind Schreibzugriffe innerhalb eines Blocks immer sequentiell. Das liegt in physikalischen Aufbau eines Flash-Memory begründet. Solange also innerhalb eines Blocks neue Pages einfach hinten angefügt werden können, ist alles prima. Soll aber eine Page in der Mitte eines Blocks geändert werden, muss zunächst der komplette Block gelöscht werden, bevor der Block von vorne neu beschrieben werden kann. Die Anzahl der Schreibzyklen für ein einzelne NAND-Zelle ist zudem begrenzt.
Verwendet man NAND-basierte SSDs in herkömmlichen RAID-Arrays, funktioniert das zwar, man verschenkt aber eine Menge I/O-Leistung von Flashes. Warum? Gehen wir mal von einem RAID-5 aus, bestehend aus 5 SSDs. Das RAID ist seit einiger Zeit in Benutzung und ca. halb voll geschrieben. Anwendung oben drüber ist eine Datenbank. Nun muss ein einzelner Datensatz in der Datenbank geändert werden. Die Datenbank reicht die geänderten Daten über das Betriebssystem und das Dateisystem an das RAID-Array weiter mit der Bitte, diese Daten an eine bestimmte Stelle zu schreiben. Die Änderung ist nur eine neue Telefonnummer, also nur wenige Bytes. Im RAID-Array wird jetzt ein kompletter Stripe von Platte gelesen: das ist ein Datenstreifen, der über alle 5 Platten verteilt ist, in dem auch die zu ändernde Stelle enthalten ist. Ein Stripe ist wenige Kilobyte groß. Mit enthalten sind die zu dem Stripe gehörenden Parity-Informationen (wir erinnern uns: RAID-5). Im Memory des RAID-Controllers werden jetzt die zu ändernden Daten entsprechend bearbeitet, anschließend wird die Parity neu berechnet.
In einem RAID mit Festplatten würde der geänderte Stripe samt Parity-Information jetzt einfach zurück auf die Platte geschrieben werden und die Transaktion wäre abgeschlossen. In einer SSD kann man aber bestehende Daten innerhalb eines Blocks nicht so ohne weiteres ändern. Der Flash-Controller einer SSD muss vor dem Schreibzugriff:
- Zunächst alle Pages innerhalb eines Blocks in das Memory des Flash-Contollers lesen,
- den Block löschen (erase cycle),
- die zu ändernden Daten in der entsprechenden Page im Memory ändern,
- und schließlich alle Pages in den frisch gelöschten Block zurück schreiben.
Manche Controller schreiben den Inhalt eines zu ändernden Blocks auch in einen anderen, leeren Block, und berücksichtigen dabei gleich die zu ändernden Daten. Der leereBlock wird dann anschließend gelöscht und kann neu verwendet werden.
Natürlich muss jede einzelne der fünf SSDs in unserem RAID-5 Volume diese aufwendige Prozedur über sich ergehen lassen. Ein Erase-Zyklus dauert vergleichsweise lang, was die Gesamtperformance des Systems entsprechend beeinflusst. Zudem werden bei dieser Art, auf SSDs zuzugreifen, einzelne Zellen schneller verbraucht als andere, die Gesamtlebensdauer einer SSD verkürzt sich somit.
ACCELSTOR FLEXIREMAP TECHNOLOGIE
FlexiRemap® löst diese Performance-Bremse. Auch hier muss der zu ändernde Stripe natürlich zunächst von den beteiligten SSDs gelesen werden, also je SSD die entsprechende Page. Anschließend werden auch hier für jede SSD die entsprechenden Daten in der Page geändert und die zugehörige Parity-Information wird neu berechnet. Im Unterschied zu RAID wird allerdings je SSD die neue Page einfach hinten an den Block geschrieben. Es muss vorher kein Erase-Zyklus durchgeführt werden. Der Flash-Controller muss nur noch auf jeder SSD die Page neu mappen. Das ist notwendig, da die Page innerhalb des Blocks hinten angefügt wurde und nicht mehr „in Reihe“ zu den anderen Pages ist. Das muss sich der Controller für die nächsten Zugriffe merken. Zugleich muss die Page, die vor der Datenänderung gelesen wurde, als ungültig markiert werden.
Mit diesem Verfahren erreicht AccelStor in seinen NeoSapphire-Appliances eine bis zu 700-fache Beschleunigung der IOPS-Leistung eines All-Flash-Arrays und >10x mehr IOPS gegenüber RAID-5.
Die Lebensdauer einer SSD verlängert sich von durchschnittlich unter 1,7 Jahren auf über 4,5 Jahre. Das erscheint auch einleuchtend, da durch den Wegfall der ständigen Erase-Zyklen die SSD weniger beansprucht wird. FlexiRemap® EVENLY verteilt die Daten außerdem gleichmäßig über alle SSDs in einem System. Zum Vergleich: RAID schreibt Daten willkürlich. SSDs werden dadurch fragmentiert, was zu einer schlechteren IOPS-Performance führt. Auch werden einzelne SSDs in einem RAID-Verbund stärker beansprucht – zu Lasten der Lebensdauer einzelner SSDs.
In bestimmten Zeitabständen führt die Software außerdem eine sog. Garbage Collection durch. Hier werden alle noch belegten/benutzten Pages eines Blocks verlagert in einen frischen Block und dabei die Zwischenräume aufgefüllt, die beim Remapping entstehen. Das System sorgt somit dafür, dass immer ausreichend Blocks innerhalb eines NAND-Flash frei sind und nicht erst bei Anforderung per Erase-Cycle gelöscht werden müssen. Die Garbage Collection erfolgt asynchron.
Eine gleichmäßige Verteilung der Daten auf alle im System konfigurierten SSDs verlängert außerdem die Lebensdauer der Flash-Module, weil alle NAND-Zellen gleichmäßig genutzt werden.