Amazon AWS Ephemeral Disks und RAID1

7

An einige AWS-Instanzen sind "kurzlebige Datenträger" angeschlossen, die viel schneller als EBS sind. Vergängliche Datenträger sind jedoch leer und nicht initialisiert, wenn Ihre Instanz gestoppt und gestartet wird. Die Daten auf der Festplatte überleben jedoch im Allgemeinen einen Neustart der Instanz.

Frage : Sollte ich auf meiner AWS-Instanz ein Software-RAID1 verwenden, das über eine kurzlebige Festplatte und ein EBS-Volume erstellt wurde?

Ich denke, dass raid1 nur mit dem EBS-Volume im herabgesetzten Modus angezeigt wird, und dann können wir mdadm-Befehle verwenden, um die leere kurzlebige Festplatte wieder in den raid aufzunehmen. Dadurch kann die App 5-10 Minuten früher gestartet werden, was zu einer schlechteren Leistung führt, während raid1 synchronisiert wird.

Hintergrund : Ich habe eine App, die ~ 40 GB Datendateien verwendet. Die Zugriffszeiten hängen direkt von der Leistung ab. Je schneller die Festplatte, desto schneller die App.

In der Vergangenheit haben wir etwas von rc.local bis rsync-Daten von einer EBS-Festplatte auf die kurzlebige Festplatte ausgeführt und dann die Software gestartet. Die Synchronisierung dauert 5-10 Minuten, besser als die 5-20 Minuten, die für die Synchronisierung von einer anderen Instanz benötigt wurden. In der Vergangenheit haben wir sogar die Datendateien von einer Ramdisk verwendet, die nicht so schnell war wie die kurzlebigen Festplatten.


Weitere Informationen - Dies ist ein i3.4xlarge mit zwei kurzlebigen NVME-Laufwerken.

# hdparm -t /dev/md? /dev/nvme?n1 /dev/xvd?
/dev/md0:     9510 MB in  3.00 seconds = 3169.78 MB/sec RAID0 of two eph drives
/dev/nvme0n1: 4008 MB in  3.00 seconds = 1335.74 MB/sec Eph drive
/dev/nvme1n1: 4014 MB in  3.00 seconds = 1337.48 MB/sec Eph drive
/dev/xvda:     524 MB in  3.01 seconds = 174.17 MB/sec  gp2 16GB, 100 IOPs root
/dev/xvdf:     524 MB in  3.01 seconds = 174.23 MB/sec  gp2 120GB, 300 IOPs data
/dev/xvdz:     874 MB in  3.01 seconds = 290.68 MB/sec  gp2 500GB, 1500 IOPs raid-seed disk

Ich habe einen raid1 mit erstellt

mdadm  --create /dev/md1 --raid-devices=3 --verbose --level=1 /dev/nvme?n1 /dev/xvdz

was zurückgibt:

$ cat /proc/mdstat
Personalities : [raid0] [raid1]
md1 : active raid1 nvme1n1[4] nvme0n1[3] xvdz[2]
      524155904 blocks super 1.2 [3/3] [UUU]
      bitmap: 0/4 pages [0KB], 65536KB chunk

Seltsamerweise liest sich der Raid ungefähr so ​​schnell wie die schnelleren Laufwerke und ist nicht auf die Geschwindigkeit der langsamsten Festplatte beschränkt.

/dev/md1:     4042 MB in  3.00 seconds = 1346.67 MB/sec
/dev/nvme0n1: 4104 MB in  3.00 seconds = 1367.62 MB/sec
/dev/nvme1n1: 4030 MB in  3.00 seconds = 1342.93 MB/sec
/dev/xvdz:     668 MB in  3.01 seconds = 222.26 MB/sec

Ein Aus- / Einschalten gibt ein verschlechtertes Raidset zurück, aber die App kann immer noch ausgeführt werden, wenn auch langsamer. Die Kosten für das Warten von 5 bis 10 Minuten werden vermieden, und ich kann die kurzlebigen Festplatten ohne einen Neustart der App im laufenden Betrieb erneut zum Raid hinzufügen.

Gibt es etwas, das ich verpasst oder nicht berücksichtigt habe, obwohl es perfekt zu funktionieren scheint?

Criggie
quelle
3
Wie oft ändern sich die Daten auf Ihrer Festplatte? Was ist die RTO und RPO? Interessante Idee, RAID über sie zu verteilen, aber es scheint ein bisschen "hacky" und ich frage mich, ob es eine bessere Lösung gibt. EFS mit einer Art Festplatten-Cache, vielleicht ein Skript zum Auffüllen der kurzlebigen Festplatte von EBS, so etwas
Tim
@ tim-Datendateien werden alle 3 Monate aktualisiert und sind von der Anwendung schreibgeschützt. Die Wiederherstellungszeit ist nicht besonders wichtig, der Host ist redundant. Die App wird jedoch nur langsamer ausgeführt, wenn die Festplatten langsamer werden. Daher ist es wichtig, die schnellstmögliche Festplatte zu verwenden. Wir haben bereits ein Hacky-Skript, das von EBS ausgefüllt werden kann. Ich spinne das im Moment auf und werde bald einige Timing-Tests anbieten.
Criggie
Bei einem RAID0 der beiden Eph-Festplatten beträgt die Leistungsmetrik der Anwendung ~ 1345 ms. Mit einem RAID1 von zwei Eph-Festplatten plus einer EBS-Festplatte werden 914 ~ ms erreicht. Es läuft also besser als zuvor.
Criggie
2
In einem Raid1 kann dies Ihre Leselast beschleunigen, aber Ihre Schreiblast beeinträchtigen. Eine Alternative wäre ein Read Cache (Blockcaache / lvmcache). Das ist wahrscheinlich besser, um die Politik zu kontrollieren und hat keine Wiederherstellungsstrafe.
eckes
1
Instanztypen haben einen maximalen EBS-Durchsatz. Beim i3.4xlarge sind es 16.000 IOPS / 437,5 MB / s (Link). Daher erhalten Sie derzeit nur die Hälfte Ihrer verfügbaren EBS-Bandbreite, möglicherweise aufgrund Ihrer EBS-Festplatteneinstellungen
Zac Faragher,

Antworten:

5

Hmm, ich bin mir nicht sicher, ob ich zwei so unterschiedliche Volumes in einem einzigen RAID1 mischen möchte. Wenn Sie dies tun, werden die Hälfte Ihrer Anforderungen vom langsameren EBS und die Hälfte vom schnelleren Instanzspeicher bedient, was zu einer unvorhersehbaren Leistung führen kann. Ich würde mir Standardwerkzeuge ansehen, um eine bessere Leistung zu erzielen.

Sehen Sie sich die bereitgestellten IOPS-EBS- Festplatten (wenn Sie E / A mit hohem Direktzugriff benötigen) oder die durchsatzoptimierten EBS (wenn Sie nacheinander große Dateien lesen) an. Sie bieten möglicherweise die Leistung, die Sie sofort benötigen. Die Preise finden Sie hier .

Sie sollten sich auch das Caching ansehen , zumal es sich, wie Sie sagen, hauptsächlich um schreibgeschützte Inhalte handelt. Jedes Mal, wenn die Datei benötigt wird, können Sie im lokalen Cache-Verzeichnis des kurzlebigen Speichers nachsehen und sie von dort aus bereitstellen. Wenn nicht, nehmen Sie es von EBS und speichern Sie eine Kopie im Cache. Besonders wenn alles schreibgeschützt ist, sollte es eine recht einfache Caching-Ebene sein.

Oder wenn es sich bei den Dateien in EBS um Datenbankdateien handelt (von denen ich vermute, dass dies der Fall ist), werden die Ergebnisse Ihrer Abfragen oder Verarbeitungen in Memcache oder Redis oder im nativen Datenbankcache (z. B. MySQL Query Cache ) zwischengespeichert.

Ich hoffe, das hilft :)

MLu
quelle
Das ist, was ich teste - könnte sein, dass der erste Lesevorgang die Anforderung erfüllt, sodass alle Lesevorgänge von der schnelleren Festplatte bereitgestellt werden.
Criggie
Außerdem ist die IO1-Festplatte mit maximalen IOPs für diesen speziellen Anwendungsfall nicht so schnell wie die kurzlebige Festplatte, und IO1 ist auf dieser Ebene recht teuer.
Criggie
1
Das Problem, dass die Hälfte der Anforderungen von den langsameren Medien bedient wird, sollte mithilfe von behoben werden können --write-mostly.
Kasperd
1

40 GB sind klein genug für RAM-Disks, die schneller sind als Scratch-Disks. Wie lange läuft Ihre App und lohnt es sich, für eine Instanz mit größerer Speicherzuweisung zu bezahlen?

24x7 kann zu teuer sein. Aber 40 GB sind in Reichweite.

Als Bonus sollten Sie mehr Kerne genießen.

Ich stimme dem Query Caching für deterministische Abfragen zu, und jede Art von Pufferung wird im Laufe der Zeit hilfreich sein.

mckenzm
quelle
1
Als diese App auf physischen Servern ausgeführt wurde, war eine Ramdisk in der Tat die schnellste Lösung. Jetzt ist es in AWS, die kurzlebige Festplatte ist schneller als eine Ramdisk für diese Anwendung , was mich dazu veranlasst hat, die Geschwindigkeit von Eph-Festplatten zu ermitteln und die "Leerzeichen beim Kaltstart" -Natur sicher zu umgehen. Ein i3.4xlarge hat 128 GB RAM, und die App verwendet jetzt ungefähr 2/3 davon. Es ist eine Inhouse-App, also ziemlich benutzerdefiniert (lesen Sie das wie Sie wollen :))
Criggie
1
Crikey, natürlich möchten Sie einen Warmstart, da das Kopieren von Bildern schneller ist als das Erstellen eines Dateisystems. Schade, dass sie nicht einfach einer "Nano" -Instanz zugeordnet werden können, um am Leben zu bleiben.
McKenzm
1

Ich ... würde kein RAID1-Volume verwenden, auch nicht mit --write-mostly. Der Leistungsabfall während der Neuerstellung des Sets wird ärgerlich.

Was ich stattdessen empfehlen würde , ist bcache . Ich habe festgestellt, dass es in Situationen sehr nützlich ist, in denen ich Zugriff auf SSDs habe, aber auch eine sehr große Datenmenge speichern muss (normalerweise sehr große PostgreSQL-Datenbanken), für die es nicht kostengünstig ist, alle zu kaufen SSDs. Ich habe es nur im "persistenten" Modus verwendet, in dem die SSDs als Rückschreibcache verwendet werden, aber es gibt einen Modus, in dem die Cache-Speicherebene als kurzlebig behandelt wird und keine Schreibvorgänge als abgeschlossen betrachtet werden, bis sie abgeschlossen sind auf dem zugrunde liegenden permanenten Speicher.

womble
quelle