Such mal
Das Problem ist , dass der Schreib sucht Verstärkung verhält sich sehr unterschiedlich auf die Schreibdurchsatz Verstärkung. Die minimale Verstärkung des Schreibdurchsatzes mit Parität tritt auf, wenn ein ganzer Streifen auf einmal geschrieben wird (nennen wir dieses Adjektiv "Vollstreifen"), die minimale Verstärkung des Schreibsuchlaufs jedoch dann, wenn der gesamte Schreibvorgang nach einem Suchlauf in das virtuelle Gerät passt ein einziger Brocken. Bevor wir ins Detail gehen, sind die Beziehungen in tabellarischer Form viel einfacher zu vermitteln:
RAID | write throughput amplification factor | write seek amplification factor
| full-stripe (e.g.) | single-chunk | full-stripe | single-chunk
0 | 1 ; 1 | 1 ; 1 | n ; 12 | 1 ; 1
1 | n ; 12 | n ; 12 | n ; 12 | n ; 12
5 | n/(n - 1) ; ~1.1 | min [3, n] ; 3 | n ; 12 | min [3, n] ; 3
6 | n/(n - 2) ; 1.2 | min [5, n] ; 5 | n ; 12 | min [5, n] ; 5
*1+0 | n₁ ; 3 | n₁ ; 3 | n ; 12 | n₁ ; 3*
1+5 | n/(n₅ - 1) ; 2.4 | expr₁ ; 5 | n ; 12 | expr₁ ; 5
*1+6 | n/(n₆ - 2) ; 3 | expr₂ ; 8 | n ; 12 | expr₂ ; 8*
expr₁ = 2n₁ + min [1, n₅ - 2]
expr₂ = 3n₁ + min [2, n₆ - 3]
Dabei ist n die Gesamtzahl der Laufwerke, n₁ die Anzahl der Laufwerke in den RAID 1-Gruppen und n₅ und n₆ die Anzahl der Gruppen in den RAID 5- bzw. RAID 6-Arrays. Beispiele beziehen sich auf das Beispiel mit 12 Laufwerken in der Frage (relevante Zeilen sind ' *bolded*
'); Beispiele für RAID-Level 1 + 0, 1 + 5, 1 + 6 sind 4 × 3, 6 × 2, 6 × 2.
Es ist zu beachten, dass nur der Vollstreifen-Durchsatzverstärkungsfaktor in direktem Zusammenhang mit dem Redundanzanteil steht. Die Single-Chunk-Fälle sind für diejenigen mit Parität komplizierter. Sie entstehen, weil das Schreiben eines einzelnen Blocks das Lesen des jeweils einfachsten Paritätsblocks oder der anderen Datenblöcke erfordert, bevor die Paritätsblöcke zusammen mit dem neuen Datenblock geschrieben werden. (Sie sind nicht direkt multiplikativ, da die induzierten Lesevorgänge stattdessen mit dem jeweiligen Lesedurchsatz- / Suchverstärkungsfaktor für RAID 1 multipliziert werden müssen, wobei beide 1 sind; siehe unten.)
Leider hat die Auswahl einer Blockgröße, die diese zusätzliche Verstärkung des Schreibdurchsatzes minimiert, den Nebeneffekt, dass sie tatsächlich maximiert wirddie Schreibsuchverstärkung. Bei winzigen Schreibvorgängen mit einer im Vergleich zur Suchzeit vernachlässigbaren Schreibzeit beträgt die Schreibleistung von Striping mit einer sehr kleinen Blockgröße (Vollstreifen) nur 1 ×, wie bei Spiegelung, da alle Laufwerke gesucht werden müssen Die Blöcke für jeden Schreibvorgang und der durch die Mobilisierung all dieser Laufwerke erzielte Durchsatz sind irrelevant. Es hat das Verhältnis von Schreibzeit zu Suchzeit durch die Anzahl der Laufwerke im Array geteilt, aber für winzige Schreibvorgänge war dies bereits vernachlässigbar. Es würde keinen Sinn machen, einen so kleinen Block zu verwenden, dass selbst winzige Schriften gestreift sind. Für Schriften, die klein genug sind, um die Auswirkungen des Suchens zu spüren, ist es am besten, wenn sie in einen einzelnen Block passen.
RAID | large contiguous write throughput | concurrent tiny writes throughput
| full-stripe | single-chunk | full-stripe | single-chunk
0 | n× ; 12× | n× ; 12× | 1× ; 1× | n× ; 12×
1 | 1× ; 1× | 1× ; 1× | 1× ; 1× | 1× ; 1×
5 | (n - 1)× ; 11× | max[n/3, 1]×; 4× | 1× ; 1× | max[n/3, 1]×; 4×
6 | (n - 2)× ; 10× | max[n/5, 1]×; 2.4× | 1× ; 1× | max[n/5, 1]×; 2.4×
*1+0 | n₀× ; 4× | n₀× ; 4× | 1× ; 1× | n₀× ; 4× *
1+5 | (n₅ - 1)×; 5× | expr₃× ; 2.4× | 1× ; 1× | expr₃× ; 2.4×
*1+6 | (n₆ - 2)×; 4× | expr₄× ; 1.5× | 1× ; 1× | expr₄× ; 1.5×*
expr₃ = n/(2n₁ + min [1, n₅ - 2]) = max [n/(2n₁ + 1), n/(2n₁ + n₅ - 2)]
expr₄ = n/(3n₁ + min [2, n₆ - 3]) = max [n/(3n₁ + 2), n/(3n₁ + n₆ - 3)]
Hinweis: Die mittleren 2 Durchsatzspalten können ignoriert werden, wenn eine sinnvolle Blockgröße vorliegt, die größer ist als die Schreibvorgänge, für die die Suchzeit von Bedeutung ist, jedoch klein genug, sodass große Schreibvorgänge über den gesamten Streifen ausgeführt werden. Die große Blockgröße der 2. Durchsatzspalte ist eher mit übergreifenden Laufwerken vergleichbar. Bei einem "winzigen" Schreibvorgang ist die Auswirkung des Durchsatzes vernachlässigbar.
Eine unangemessen kleine Blockgröße erhöht auch den Effekt der Suchverstärkung für Lesevorgänge, wenn auch nicht so stark und nur im Vollstreifenfall.
RAID | read throughput amplification factor | read seek amplification factor
| full-stripe | single-chunk | full-stripe (e.g.) | single-chunk
0 | 1 | 1 | n to n; 12 | 1
1 | 1 | 1 | 1 to n; 1–12 | 1
5 | 1 | 1 | n - 1 to n; 11–12 | 1
6 | 1 | 1 | n - 2 to n; 10–12 | 1
*1+0 | 1 | 1 | n₀ to n; 4–12 | 1 *
1+5 | 1 | 1 | n₅ - 1 to n; 5–12 | 1
*1+6 | 1 | 1 | n₆ - 2 to n; 4–12 | 1 *
Hinweis: Das 'to n' ist darauf zurückzuführen, dass theoretisch alle Laufwerke mobilisiert werden können, wenn nur ein Lesevorgang gleichzeitig stattfindet, um nach geeigneten Stellen zu suchen und die Daten gemeinsam zu lesen, um einen maximalen zusammenhängenden Lesedurchsatz zu erzielen.
RAID | large contiguous read throughput | concurrent tiny reads throughput
| full-stripe (e.g.)| single-chunk | full-stripe | single-chunk
0 | n× ; 12× | n× ; 12× | 1× ; 1× | n× ; 12×
1 | n× ; 12× | n× ; 12× | n× ; 12× | n× ; 12×
5 | n× ; 12× | n× ; 12× | n/(n - 1)× ; ~1.1× | n× ; 12×
6 | n× ; 12× | n× ; 12× | n/(n - 2)× ; 1.2× | n× ; 12×
*1+0 | n× ; 12× | n× ; 12× | n₁× ; 3× | n× ; 12×*
1+5 | n× ; 12× | n× ; 12× | n/(n₅ - 1)× ; 2.4× | n× ; 12×
*1+6 | n× ; 12× | n× ; 12× | n/(n₆ - 2)× ; 3× | n× ; 12×*
Hinweis: Auch hier können die mittleren 2 Durchsatzspalten bei einer vernünftigen Blockgröße ignoriert werden. Die 3. Durchsatzspalte ist wiederum eng mit dem Redundanzanteil verbunden.
Eine ausreichend große Blockgröße bedeutet jedoch, dass winzige Lesevorgänge niemals vollständig sind. Bei einer effizienten Implementierung und einer angemessenen Blockgröße sollte die Leseleistung proportional zur Anzahl identischer Laufwerke sein, wenn sie nicht beeinträchtigt wird.
Tatsächlich ist der Verstärkungsfaktor viel komplizierter als die Formel in der Frage, in der nur die Vollstreifendurchsatzverstärkung berücksichtigt wurde. Insbesondere ist die Schreibleistung von 6 × 2 RAID 1 + 6 für gleichzeitige Schreibvorgänge, die klein genug sind, um suchgebunden zu werden, schlechter als die von 4 × 3 RAID 1 + 0. Und für winzige Schreibvorgänge, bei denen es sich ausschließlich um Suchvorgänge handelt, kann die Leistung im besten Fall nur etwa ein Drittel der Leistung von 4 × 3 RAID 1 + 0 betragen (dh bei perfekter Implementierung).
Nachdem dieses Problem behoben wurde, hat der Vergleich mit 12 Laufwerken keinen eindeutigen Gewinner:
| 4×3 RAID 1+0 | 6×2 RAID 1+6
number of identical 1TB drives | 12 | 12
storage capacity | 4TB | 4TB
redundancy proportion | 2/3 | 2/3
large contiguous write throughput | 4× | 4×
large contiguous read throughput | 12× | 12×
concurrent tiny writes throughput |*4× | 1.5×
concurrent tiny reads throughput | 12× | 12×
safe number of random drive loses | 2 |*5
12 - 1 large write throughput | 4× | 4×
12 - 1 large read throughput | 8× |*11×
12 - 1 tiny writes throughput |*4× | ~1.42×
12 - 1 tiny reads throughput | 8× |*~9.33×
can split-off a copy for backup | yes[1] | yes[1]
2-site failover | yes | yes
2-copy large write throughput | 4× | 4×
2-copy large read throughput |*8× | 6×
2-copy tiny writes throughput |*4× | ~1.28×
2-copy tiny reads throughput |*8× | 6×
2-copy safe random drive loses | 1 |*2
2-copy - 1 large write throughput | 4× | 4×
2-copy - 1 large read throughput | 4× |*5× or 6×[2]
2-copy - 1 tiny writes throughput |*4× | ~1.46× or 1.2×[2]
2-copy - 1 tiny reads throughput | 4× |*3.6x or 6×[2]
can be divided into 3 full copies | yes | yes
3-site failover | yes | yes
1-copy large write throughput | 4× | 4×
1-copy large read throughput | 4× | 4×
1-copy tiny writes throughput |*4× | ~0.85×
1-copy tiny reads throughput |*4× | 2×
1-copy safe random drive loses | 0 | 0
complexity |*simple | more complex
Hinweis 1: Eine vollständige Kopie der gespeicherten Daten ist jeweils ein RAID 0-Vierfach- oder ein 4/6 herabgesetztes RAID 6-Array. Hinweis 2: Es besteht die Möglichkeit, dass der Laufwerksfehler eines der 4 beeinträchtigten RAID 1-Paare beeinträchtigt oder eines der 2 normalen Paare beeinträchtigt.
Trotzdem hätte es die doppelte Leseleistung eines RAID 6-Arrays mit 6 Laufwerken und der winzige Schreibdurchsatz sollte 25% besser sein (1,5 / 1,2), da die erforderlichen Lesevorgänge zwischen den RAID 1-Paaren aufgeteilt werden und RAID 6 dies offensichtlich tut Bei Anwendungen mit hoher Verfügbarkeit, bei denen größere Schreibvorgänge ausgeführt werden oder bei denen die Leseleistung wichtiger ist als die Schreibleistung, gibt es möglicherweise eine Nische für RAID 1 + 6. Aber das ist nicht alles…
Komplexität
Dies ist bislang nur theoretisch (meistens kombinatorisch ). In der Praxis kann die Komplexität dazu führen, dass Implementierungen von RAID 1 + 6 Mängel aufweisen, die Chancen verpassen und die theoretischen Ergebnisse nicht erreichen. RAID 6 ist bereits komplexer, und die Verschachtelung erhöht die Komplexität zusätzlich.
Zum Beispiel ist es nicht sofort offensichtlich, dass 6 × 2 RAID 1 + 6 als 3 unabhängige virtuelle Leseköpfe abstrahiert werden kann, die gleichzeitig 3 zusammenhängende große Lesevorgänge mit jeweils 4 × Durchsatz lesen können, genau wie 4 × 3 RAID 1 + 0. Das einfache Verschachteln von 6 RAID 1-Paaren in ein RAID 6-Array mithilfe eines Software-RAID ist möglicherweise nicht so elegant. Die Implementierung könnte dumm und verrückt sein (ich habe diese Hypothese jedoch noch nicht getestet).
Die Komplexität führt auch zu erhöhten Entwicklungskosten für Implementierungen und Werkzeuge. Auch wenn es Anwendungen gibt, die von einer solchen Verschachtelung profitieren könnten, sind die Verbesserungen die Entwicklungskosten möglicherweise nicht wert.