SSD Nodes Learn 🎉 VPS від $5.50/міс
Посібники Matt ConnorВід Matt Connor · Оновлено 2026-08-13

RAID 10 для VPS: як працює і що витримує

Дізнайтеся, які відмови витримують RAID 1, 5, 6 і 10, як читати /proc/mdstat, чому RAID 10 обирають для NVMe та чому це не резервна копія.

Що таке RAID 10 і чому VPS-хостинги його використовують

RAID 10 — це схема зберігання, яку більшість VPS-хостингів використовує для віртуалізованих дисків NVMe (non-volatile memory express). Кожен диск дублюється на парному диску, а потім дані розподіляються між цими дзеркальними парами. Один диск може вийти з ладу, не зупинивши масив. Відновлення виконується простим копіюванням із диска, що залишився в парі, а не повторним обчисленням із читанням усіх інших дисків у наборі.

RAID означає redundant array of independent disks. Його єдине завдання — забезпечити роботу машини, коли диск вийшов з ладу або його замінюють. Це завдання називається доступністю. Доступність не означає безпеку.

RAID реплікує ваші операції запису. rm -rf /srv — це операція запису. Обидві половини дзеркала видаляють каталог у ту саму мілісекунду, а після цього масив усе одно повідомляє, що він справний.

Запам’ятайте це речення. У решті цієї сторінки описано, які відмови витримує кожен рівень і якою є його вартість для кожної операції запису. В останніх розділах наведено команди для перевірки стану масиву на машині, якою ви володієте, а також описано відмову, від якої RAID ніколи не захищав.

Рівні, з якими фактично стикається покупець хостингу: 1, 5, 6 і 10

На сторінці тарифу вказують число — і на цьому зупиняються. Це число відповідає на два запитання: скільки дисків може вийти з ладу та чого коштує кожен запис.

RAID 1 — це дзеркало. Два диски містять однакові блоки. Кожен запис виконується на обидва диски. Читання можна виконувати з будь-якого диска. Один диск може вийти з ладу без втрати даних, а доступною є половина необробленої ємності. Паритет обчислювати не потрібно, тому шлях запису короткий.

RAID 5 — це чергування даних з одним блоком паритету в кожній смузі. Для n дисків доступна ємність дорівнює ємності n-1 дисків, а масив витримує рівно одну відмову. Паритет не зберігається на одному виділеному диску. Він розподіляється по черзі між усіма дисками, тому кожен диск містить і дані, і паритет.

RAID 6 додає до кожної смуги другий незалежний блок паритету, який зазвичай позначають P і Q. Він витримує одночасний вихід з ладу будь-яких двох дисків. Це важливіше, ніж може здатися, оскільки друга відмова найчастіше стається під час відновлення після першої.

RAID 10 — це чергування дзеркал. Диски об’єднуються в дзеркальні пари, а дані розподіляються між парами. Доступна ємність становить половину необробленої загальної ємності, як у RAID 1, але додатково використовується паралельність чергування.

Також можна зустріти запис RAID 1+0. Це точний опис: спочатку створюються дзеркала, а потім між ними виконується чергування. RAID 0+1 використовує інший порядок: спочатку створюються дві смуги, а потім вони дзеркалюються. Це гірший варіант, оскільки відмова одного диска виводить з експлуатації цілу смугу, а для відновлення потрібно скопіювати весь інший бік.

Linux — окремий випадок, про який варто знати. Ядро використовує raid10 як одну схему, а не два послідовно накладені рівні, тому вона працює з непарною кількістю дисків і має схеми (near, far, offset), які неможливо виразити через вкладену конфігурацію. Тому в рядку стану на системі Linux указано 2 near-copies, а не назви двох масивів.

ChartEight 1 TB drives: usable capacity and drives lost before data loss
The data behind this chart
[
  {
    "label": "RAID 1 (four mirrored pairs)",
    "usable_tb": 4,
    "worst_case_drives_lost": 1,
    "best_case_drives_lost": 4
  },
  {
    "label": "RAID 5",
    "usable_tb": 7,
    "worst_case_drives_lost": 1,
    "best_case_drives_lost": 1
  },
  {
    "label": "RAID 6",
    "usable_tb": 6,
    "worst_case_drives_lost": 2,
    "best_case_drives_lost": 2
  },
  {
    "label": "RAID 10",
    "usable_tb": 4,
    "worst_case_drives_lost": 1,
    "best_case_drives_lost": 4
  }
]

Вісім дисків по 1 TB дають 7 TB доступного простору в RAID 5 і 4 TB у RAID 10. Ця різниця означає реальні витрати, тому RAID з паритетом постійно пропонують як варіант. RAID 6 витримує 2 відмов за будь-якої їхньої комбінації. RAID 10 гарантовано витримує лише 1, оскільки небезпечною є друга відмова диска, що утворює пару з диском, який уже вийшов з ладу. У найкращому випадку він витримує до 4 відмов, якщо жодні дві відмови не припадають на одну пару. Це везіння, а не властивість конструкції.

Скільки коштує кожен рівень під час кожного запису

Запис у mirror — це два записи, які одночасно надсилаються в обидва члени. Запис у parity stripe потребує більше операцій, оскільки блок парності для цієї смуги стає неправильним, і його потрібно обчислити заново.

Контролер не може обчислити парність лише з нового блока. Спочатку йому потрібні старий блок даних і старий блок парності. Тому один малий випадковий запис у RAID 5 перетворюється на read, read, write, write. У RAID 6 потрібно підтримувати другий syndrome, тому такий самий запис перетворюється на read, read, read, write, write, write.

ChartDevice operations per small random write, and drives read during a rebuild
The data behind this chart
[
  {
    "label": "RAID 1 (2 drives)",
    "write_ops_per_host_write": 2,
    "drives_read_to_rebuild": 1
  },
  {
    "label": "RAID 5 (8 drives)",
    "write_ops_per_host_write": 4,
    "drives_read_to_rebuild": 7
  },
  {
    "label": "RAID 6 (8 drives)",
    "write_ops_per_host_write": 6,
    "drives_read_to_rebuild": 7
  },
  {
    "label": "RAID 10 (8 drives)",
    "write_ops_per_host_write": 2,
    "drives_read_to_rebuild": 1
  }
]

Малий випадковий запис потребує 6 операцій із пристроями в RAID 6 і 2 у RAID 10. Ці значення не повністю показують різницю в latency. Два записи в mirror виконуються паралельно, тому гість очікує повільніший із них. У parity-шляху є read, який має завершитися до обчислення нової парності, тому гість послідовно очікує спочатку read, а потім write. На зайнятому хості цей read стає в чергу після операцій вводу-виводу інших користувачів.

Є важливий виняток. Запис, достатньо великий для заповнення всієї stripe, не потребує старих даних, оскільки кожен блок у stripe замінюється. Parity обчислюється з даних, які вже перебувають у пам’яті, і витрати зменшуються до одного додаткового запису. Тому RAID 5 добре показує себе в послідовному benchmark, але працює погано під змішаним навантаженням із малих записів від багатьох tenants. Перевіряйте фактичний шаблон навантаження: як правильно тестувати диск VPS означає random I/O з реалістичною queue depth, а не один великий dd.

Чому перебудова є небезпечним етапом

Під час перебудови парності потрібно відновити відсутній диск на основі всіх інших дисків, тому з початку до кінця читаються 7 дисків, що залишилися. Під час перебудови RAID 10 читаються 1: дзеркальна пара відмовілого диска, і більше нічого.

Це спричиняє два наслідки. Перший — тривалість, оскільки перебудова обмежена швидкістю найповільнішого диска, що залишився, а також додатковими обчисленнями парності. Другий — навантаження. Усі диски в наборі з парністю зайняті протягом усього процесу, тому всі гостьові системи на цьому вузлі мають підвищену затримку до його завершення. У RAID 10 зайнята лише одна пара, а інші пари працюють зі звичайною швидкістю.

У цей самий період виникає ризик для цілісності даних. Масив RAID 5 з одним відмовілим диском більше не має надлишковості, тому сектор, який неможливо прочитати на будь-якому диску, що залишився, уже неможливо відновити. Перебудова — це єдина операція, яка читає кожен сектор, зокрема ті, до яких ніхто не звертався протягом року. Опубліковані значення з технічних паспортів вказують, що для споживчого жорсткого диска припадає приблизно одна невиправна помилка читання на кожні 10^14 прочитаних бітів, а для корпоративного NVMe-диска — одна на 10^17 або краще. Це специфікації виробників, а не результати вимірювань, але співвідношення пояснює, чому старе попередження про те, що перебудова RAID 5 завершиться помилкою, стосувалося великих дисків із магнітними пластинами, і чому для NVMe воно набагато менш актуальне. Аргумент щодо навантаження справедливий для будь-якого носія.

Виявляйте приховані помилки до початку перебудови за допомогою scrub. Debian і Ubuntu постачають періодичний scrub для масивів md, але механізм відрізняється між релізами, тому перевірте, який варіант використовується у вашій системі, а потім вручну запустіть перевірку.

systemctl list-timers --all | grep -i mdcheck
ls -l /etc/cron.d/mdadm
echo check | sudo tee /sys/block/md0/md/sync_action
cat /sys/block/md0/md/mismatch_cnt

Після завершення перевірки sync_action повертається до значення idle, а mismatch_cnt має містити значення 0. Значення понад нуль для дзеркала означає, що дві його частини не збігаються, а kernel не може визначити, яка з них правильна, оскільки жодна копія не містить checksum. Деякі розбіжності є нешкідливими. Зазвичай їх спричиняють swap partitions: kernel може записати сторінку, яка змінюється під час цієї операції. Лічильник, що зростає для масиву з даними, означає, що диск потрібно замінити.

Чому VPS-провайдери стандартизують RAID 10 для NVMe

На вузлі гіпервізора працює не одне навантаження. Він обслуговує десятки незалежних гостьових систем, а їхні операції вводу-виводу надходять упереміш як потік малих записів без локальності між ними. Саме за такого шаблону цикл read-modify-write для паритету має найвищу вартість. Саме таке навантаження спільний вузол обробляє протягом усього дня.

Якщо врахувати поведінку під час перебудови, вибір стає очевидним. Відмова диска на вузлі з паритетом уповільнює роботу всіх гостьових систем на сервері на кілька годин. Відмова диска на вузлі з RAID 10 уповільнює лише одну пару, а копіювання виконується послідовно зі швидкістю диска. Провайдери продають стабільну затримку без різких піків, тому платять за неї ємністю: половина необробленої ємності NVMe використовується для дзеркала.

Збільшення ємності дисків також впливає на цей вибір. Що більші диски, то довше триває перебудова, а в системі з паритетом цей період означає повільну роботу всіх систем і відсутність повного захисту. З цієї самої причини в розгортаннях ZFS для віртуалізації використовують пули із дзеркальних vdev, а не широкі raidz: resilver дзеркала копіює лише фактично використовувані блоки в межах однієї пари.

Це не означає, що RAID 10 правильний у будь-якій ситуації. У цільову систему для резервних копій дані записуються довгими послідовними блоками, а зчитуються рідко, тому RAID 6 у цьому випадку вигідніший. Він витримує дві відмови й повертає більшу частину доступної ємності. Рішення визначає характер навантаження, а не кількість дисків. Для конфігурації, яку ви обираєте сьогодні, тип носія зазвичай важливіший за схему RAID поверх нього, а перехід із SATA SSD на NVMe дає більший ефект, ніж будь-яка різниця між схемами RAID на будь-якому з цих носіїв.

Як читати /proc/mdstat

Виконуйте ці команди на машині, де ви керуєте масивом: на виділеному сервері, домашньому комп’ютері або VPS із двома підключеними томами, які ви зібрали самостійно. Аналізуйте власний вивід. Блоки нижче містять приклади, наведені повністю, щоб ви могли порівняти їх зі своїм результатом.

cat /proc/mdstat
sudo mdadm --detail /dev/md0
lsblk -o NAME,SIZE,TYPE,MOUNTPOINTS

Справний RAID 10 із чотирма дисками виводить приблизно такий результат.

Personalities : [raid1] [raid10]
md0 : active raid10 nvme3n1p3[3] nvme2n1p3[2] nvme1n1p3[1] nvme0n1p3[0]
      3906764800 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]
      bitmap: 0/30 pages [0KB], 65536KB chunk

unused devices: <none>

Кожна частина цього виводу містить певну інформацію.

  • Personalities містить список модулів md, завантажених запущеним ядром. Наявність raid10 у цьому списку означає лише те, що код доступний.
  • md0 : active raid10 — це пристрій масиву, його стан і рівень.
  • Наступні імена — це учасники масиву. Число у квадратних дужках — індекс пристрою в метаданих масиву, а не його позиція в рядку і не завжди його слот.
  • Після заміни диска новий учасник зазвичай отримує індекс, вищий за номер слота, який він займає, тому nvme4n1p3[4] може перебувати у слоті 2. mdadm --detail виводить фактичний слот у стовпці RaidDevice, тому в разі розбіжності орієнтуйтеся на нього.
  • (F) після учасника означає несправний. (S) означає резервний: пристрій присутній, алеює і очікує відмови іншого пристрою.
  • 3906764800 blocks super 1.2 — доступний розмір у блоках по 1 KiB, після нього вказано формат метаданих.
  • 512K chunks 2 near-copies — розмір chunk для stripe і layout RAID 10; у цьому прикладі кожен блок зберігається у двох копіях поруч.
  • [4/4] — кількість учасників, яку очікує масив, а потім кількість учасників, які зараз синхронізовані.
  • [UUUU] — по одному символу на слот у порядку слотів. U означає, що слот активний і синхронізований. _ означає, що в слоті немає працюючого пристрою.
  • bitmap: — bitmap наміру запису. Він фіксує регіони, у які виконувалися записи, щоб після повторного підключення учасник синхронізував саме ці регіони, а не весь диск.

Що означають [4/3] і [UU_U], коли виникає проблема

Деградований масив має такий вигляд.

md0 : active raid10 nvme3n1p3[3] nvme2n1p3[2](F) nvme1n1p3[1] nvme0n1p3[0]
      3906764800 blocks super 1.2 512K chunks 2 near-copies [4/3] [UU_U]

Читайте ці дві пари дужок разом. [4/3] означає, що один із чотирьох слотів не бере участі в роботі. [UU_U] показує який саме: символ підкреслення є третім, а нумерація слотів починається з нуля, тому недоступний слот 2. Прапорець (F) називає пристрій лише доти, доки несправний диск залишається підключеним. Якщо витягнути його з машини, ім’я зникне з рядка, але символ підкреслення залишиться.

Масив продовжує обслуговувати запити. RAID 10 часто працює майже на повній швидкості навіть у такому стані, тому за відчуттями проблему можна не помітити. Потрібен засіб, який повідомить про неї.

grep -i mailaddr /etc/mdadm/mdadm.conf
sudo mdadm --monitor --scan --oneshot --test
systemctl list-units --all | grep -i md

Пакет mdadm встановлює демон моніторингу, який читає MAILADDR з /etc/mdadm/mdadm.conf. Назва unit змінювалася між релізами, тому знайдіть її останньою командою, а не вгадуйте. Запуск --test негайно надсилає по одному повідомленню для кожного масиву. Якщо після цього в поштовій скриньці порожньо, поштовий шлях несправний, і потрібне повідомлення також було б втрачено.

Під час відновлення на замінений диск під масивом з’являється рядок прогресу.

md0 : active raid10 nvme4n1p3[4] nvme3n1p3[3] nvme1n1p3[1] nvme0n1p3[0]
      3906764800 blocks super 1.2 512K chunks 2 near-copies [4/3] [UU_U]
      [==>..................]  recovery = 12.4% (242012928/1953382400) finish=63.1min speed=452000K/sec

recovery — це відновлення на замінений диск. resync — перша перевірка узгодженості щойно створеного масиву. check — очищення, яке ви запустили вище. Пара в дужках показує прогрес у блоках по 1 KiB відносно загальної кількості блоків на пристрій, а finish — оцінку ядра щодо часу завершення за поточної швидкості. Цю швидкість обмежують /proc/sys/dev/raid/speed_limit_min і speed_limit_max, щоб відновлення не витісняло робочі операції вводу-виводу.

Повний mdadm --detail під час відновлення
/dev/md0:
           Version : 1.2
     Creation Time : Tue Mar 10 09:14:22 2026
        Raid Level : raid10
        Array Size : 3906764800 (3.64 TiB 4.00 TB)
     Used Dev Size : 1953382400 (1.82 TiB 2.00 TB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Wed Aug  5 11:02:41 2026
             State : clean, degraded, recovering
    Active Devices : 3
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 1

            Layout : near=2
        Chunk Size : 512K

    Rebuild Status : 12% complete

              Name : storage:0
            Events : 4184

    Number   Major   Minor   RaidDevice State
       0     259        3        0      active sync set-A   /dev/nvme0n1p3
       1     259        7        1      active sync set-B   /dev/nvme1n1p3
       4     259       11        2      spare rebuilding    /dev/nvme4n1p3
       3     259       15        3      active sync set-B   /dev/nvme3n1p3

Стовпець Number містить індекс метаданих, надрукований у дужках у /proc/mdstat. Стовпець RaidDevice містить слот — позицію в рядку [UU_U]. У цьому прикладі вони відрізняються, тому що диск 4 замінив диск, який займав слот 2. set-A і set-B позначають дві половини кожного дзеркала. Тому не можна допустити одночасну втрату учасника набору A і учасника набору B в одній парі, які містять ті самі дані.

Заміна диска в масиві, яким ви керуєте, виконується чотирма командами. Остання з них перевіряє результат.

sudo mdadm --manage /dev/md0 --fail /dev/nvme2n1p3
sudo mdadm --manage /dev/md0 --remove /dev/nvme2n1p3
sudo mdadm --manage /dev/md0 --add /dev/nvme4n1p3
cat /proc/mdstat

Рядок відновлення має з’явитися протягом однієї-двох секунд. Розділ на новому диску має бути не меншим за Used Dev Size із mdadm --detail. Навіть трохи менший розділ буде відхилено з повідомленням на кшталт not large enough to join array. Перед додаванням нового диска створіть на ньому розділ такого самого розміру, як на старому.

Що можна і чого не можна побачити з VPS

Більшість гостьових систем не бачить RAID хоста, і це передбачено архітектурою. Гіпервізор надає вам один віртуальний диск. Чи розміщений цей диск у пулі RAID 10 з NVMe-накопичувачів, чи він використовує один фізичний диск, залежить від хоста й не відображається всередині гостьової системи.

systemd-detect-virt
lsblk -d -o NAME,SIZE,ROTA,MODEL
cat /proc/mdstat

systemd-detect-virt виводить kvm у гостьовій системі KVM, тип контейнера, наприклад lxc, у контейнері та none на фізичному сервері. У гостьовій системі KVM зазвичай видно один vda або sda у lsblk і немає масивів у /proc/mdstat, оскільки всередині гостьової системи їх немає.

У VPS на основі контейнера ці дані не заслуговують на довіру. Контейнери використовують спільне ядро хоста, а частина /proc не ізольована просторами імен. Тому прочитані дані можуть описувати хост, а не виділену вам частину. Не вважайте жодне з цих значень підтвердженням характеристик власного сховища. Запитайте провайдера про конфігурацію та отримайте відповідь у письмовій формі, якщо це для вас важливо.

Зсередини можна перевірити поведінку наданого вам диска. У розділі Як перевірити, чи є диск VPS справді NVMe описано команди, які показують фактичні дані, а в розділі Що насправді входить до VPS із SSD пояснено, що саме означає позначка на сторінці тарифу.

Чи варто використовувати RAID у VPS?

Зазвичай ні. Причина — домени відмови.

Якщо підключити до одного VPS два томи й об’єднати їх у дзеркало за допомогою mdadm, обидва томи можуть розташовуватися в тому самому фізичному масиві, на тому самому вузлі та за тим самим блоком живлення. Вартість кожного запису подвоїться через надлишковість, яку ви вже мали, але обидві копії все одно буде втрачено через одну критичну відмову.

Це має сенс, якщо провайдер документує, що томи розташовані в окремих доменах відмови, або якщо ви використовуєте виділений сервер із накопичувачами, якими можете керувати. В іншому разі краще зосередити зусилля на копіях, які зберігаються за межами сервера.

Від чого RAID не захищає

RAID захищає від однієї події: накопичувач перестає працювати належним чином. Усе наведене нижче є коректним записом, тому масив застосовує його до кожної копії та повідомляє, що працює справно.

  • Видалення. rm -rf у неправильному каталозі або deploy-скрипт із невстановленою змінною в шляху. Масив бачить допустимий запис і виконує його двічі.
  • Ransomware. Шифрування є операцією запису. Справний масив зберігає зашифровану версію в обох частинах mirror.
  • Несправний застосунок. Помилка, через яку в базу даних записуються пошкоджені дані, записує ті самі пошкоджені дані на резервний накопичувач.
  • Увесь вузол. Вузол, який вийшов з ладу, або обліковий запис, помилково заблокований адміністратором. Масив може бути повністю справним і водночас недоступним.
  • Ви самі, через тиждень. Файл, який ви видалили в понеділок, зник із кожного накопичувача того самого понеділка. Повернути його можна лише з копії, створеної раніше.

Snapshots у тому самому сховищі також не вирішують проблему. Вони допомагають у разі видалення, але зникають разом із масивом, на якому зберігаються. Властивість, яка робить backup backup, полягає в тому, що він зберігається в іншому місці. Зашифровані backups за межами сервера за допомогою restic — це друга частина цієї сторінки: масив дає змогу продовжувати обслуговування після відмови накопичувача, а restic повертає дані, якщо пошкодження стало наслідком запису, який масив без проблем виконав.

FAQ

Чи означає RAID 10, що резервні копії не потрібні?

Ні. RAID 10 захищає від відмови диска. Кожен коректний запис він застосовує до обох половин дзеркала, тому видалення файлів або запуск ransomware тієї ж миті поширюється і на резервний диск. Після цього масив повідомляє, що він справний, оскільки з його погляду нічого не вийшло з ладу. Вам усе одно потрібні копії, що зберігаються поза межами цього комп’ютера. Також потрібно час від часу відновлювати одну з них, щоб перевіряти її працездатність.

Чому VPS-провайдери обирають RAID 10, а не RAID 5 або RAID 6?

Є дві причини. Обидві пов’язані з малими випадковими записами. Для запису з паритетом потрібно спочатку зчитати старі дані та старий паритет, щоб обчислити новий паритет. Тому малий запис потребує 4 операцій у RAID 5 і 6 у RAID 6, тоді як у дзеркалі — 2. Під час відновлення паритету система послідовно зчитує кожен диск, що залишився, від початку до кінця. Це сповільнює роботу кожного гостьового сервера на вузлі протягом кількох годин. Відновлення RAID 10 копіює дані з одного диска на інший і не зачіпає інші пари. Провайдери платять за це місткістю: половиною необробленої місткості NVMe.

Що означає [U_] або [UU_U] у /proc/mdstat?

Кожен символ відповідає одному слоту масиву в порядку слотів. Для кожного слоту використовується один символ. U означає, що слот містить активний синхронізований елемент масиву. _ означає, що в цьому слоті немає справного елемента. [U_] у дзеркалі з двома дисками означає, що другий слот недоступний і надлишковості більше немає. Читайте цей запис разом із парою перед ним: [4/3] означає, що масив очікує чотири елементи, але має лише три. Порядок слотів відповідає стовпцю RaidDevice у mdadm --detail, а не порядку, у якому імена пристроїв з’являються в рядку.

Скільки дисків може втратити масив RAID 10?

Один, незалежно від розташування відмови. Якщо відмов більше, результат залежить від того, на які пари вони припали. Кожна дзеркальна пара може втратити один із двох елементів. Тому масив із восьми дисків витримує до чотирьох відмов, якщо жодні дві не припадають на одну пару. Якщо обидві відмови припадають на одну пару, масив виходить з ладу вже після двох відмов. Плануйте роботу з урахуванням гарантованої кількості — однієї відмови. Усе понад це вважайте везінням, а не захистом.

Чи варто дзеркально об’єднувати два томи всередині VPS за допомогою mdadm?

Зазвичай ні. Два томи, підключені до одного VPS, часто розташовані на тому самому фізичному масиві на тому самому хості. Тому дзеркалювання подвоює вартість кожного запису й не захищає від того, від чого вже не захищає власний RAID хоста. Це має сенс лише тоді, коли провайдер документує, що томи розташовані в окремих доменах відмови. В іншому разі краще спрямувати ці зусилля на резервні копії, які зберігаються поза межами цього комп’ютера.