/**
* 💾 IHK RAID- & STORAGE-SIMULATOR 💾
* ===================================
* Interaktiver Storage-Simulator für AP2 FISI (LF 11 Storage & Hochverfügbarkeit):
* - RAID 0, 1, 5, 6, 10
* - Brutto-, Netto-Kapazität, Parität und Ausfallsicherheit
* - Hot-Spare Integration & IHK-Formeln
*/
class RaidSimulator {
constructor(containerId) {
this.container = document.getElementById(containerId);
this.init();
}
init() {
if (!this.container) return;
this.render();
this.calculate();
}
render() {
this.container.innerHTML = `
`;
document.getElementById("raid-level").addEventListener("change", () => this.calculate());
document.getElementById("raid-disks").addEventListener("input", () => this.calculate());
document.getElementById("raid-size").addEventListener("input", () => this.calculate());
document.getElementById("raid-hotspare").addEventListener("change", () => this.calculate());
}
calculate() {
const level = document.getElementById("raid-level").value;
let n = parseInt(document.getElementById("raid-disks").value, 10) || 0;
const s = parseFloat(document.getElementById("raid-size").value) || 0;
const hasHotSpare = parseInt(document.getElementById("raid-hotspare").value, 10) === 1;
let activeDisks = hasHotSpare ? n - 1 : n;
let valid = true;
let errorMsg = "";
let minDisks = 2;
if (level === "0") minDisks = 2;
if (level === "1") minDisks = 2;
if (level === "5") minDisks = 3;
if (level === "6") minDisks = 4;
if (level === "10") minDisks = 4;
if (activeDisks < minDisks) {
valid = false;
errorMsg = `Für RAID ${level} werden mindestens ${minDisks} aktive Platten benötigt (aktuell: ${activeDisks}).`;
}
if (level === "10" && activeDisks % 2 !== 0) {
valid = false;
errorMsg = `RAID 10 erfordert eine gerade Anzahl aktiver Platten (aktuell: ${activeDisks}).`;
}
const metricsBox = document.getElementById("raid-metrics");
const explBox = document.getElementById("raid-explanation");
if (!valid) {
metricsBox.innerHTML = `
⚠️ ${errorMsg}
`;
explBox.innerHTML = "Bitte passe die Plattenanzahl für das gewählte RAID-Level an.";
return;
}
const rawTotal = n * s;
let usable = 0;
let faultTolerance = 0;
let formula = "";
if (level === "0") {
usable = activeDisks * s;
faultTolerance = 0;
formula = "Nutzdaten = n × Kapazität (Keine Redundanz!)";
} else if (level === "1") {
usable = s;
faultTolerance = activeDisks - 1;
formula = "Nutzdaten = 1 × Kapazität (Gesamte Spiegelung)";
} else if (level === "5") {
usable = (activeDisks - 1) * s;
faultTolerance = 1;
formula = "Nutzdaten = (n - 1) × Kapazität (1 Platte Paritäts-Overhead)";
} else if (level === "6") {
usable = (activeDisks - 2) * s;
faultTolerance = 2;
formula = "Nutzdaten = (n - 2) × Kapazität (2 Platten Paritäts-Overhead)";
} else if (level === "10") {
usable = (activeDisks / 2) * s;
faultTolerance = 1; // Garantiert 1 Platte, bis zu n/2 im besten Fall
formula = "Nutzdaten = (n / 2) × Kapazität (50 % Nutzkapazität)";
}
const efficiency = Math.round((usable / rawTotal) * 100);
metricsBox.innerHTML = `
Bruttokapazität (Roh):
${rawTotal.toFixed(1)} TB
Nettokapazität (Nutzbar):
${usable.toFixed(1)} TB
Ausfalltoleranz:
${faultTolerance} Platte(n)
Speichereffizienz:
${efficiency} %
`;
explBox.innerHTML = `
IHK-Prüfungswissen & Formel:
Angewandte Formel: ${formula}
${hasHotSpare ? 'Hinweis: 1 Festplatte ist als Standby-Ersatzplatte (Hot-Spare) reserviert und zählt nicht zu den aktiven Nutzkapazitäten.
' : ''}
Prüfungsfalle URE (Unrecoverable Read Error): Bei großen SATA-Festplatten ab 4 TB dauert der Rebuild eines RAID 5 viele Stunden bis Tage. Tritt während des Rebuilds ein Lesefehler auf einer weiteren Platte auf, ist das gesamte RAID 5 verloren! Die IHK verlangt in solchen Szenarien daher oft RAID 6 (Dual-Parität) oder RAID 10.
`;
}
}
window.RaidSimulator = RaidSimulator;