ZFS: Як відновити правильну кількість копій після втрати накопичувача?


12

Якщо у вас zfs, copies=2а ви втрачаєте диск, який містить деякі з цих копій, як ви скажете системі, що вона повинна зробити нову копію блоків даних для постраждалих файлів? Або zfs просто починає додавати блоки даних для додаткових копій, як тільки дізнається про погані блоки даних?

Чи буде це робити скраб?

(v0.6.0.56-rc8, пул ZFS версія 28, файлова система ZFS версія 5, Ubuntu 11.10)

Відповіді:


10

"Копії = 2" (або 3) більше призначені для використання з пулами без надмірності (один диск або смужки). Метою є можливість відновити незначну пошкодження диска, а не повну несправність пристрою. В останньому випадку пул незмінний, тому відновлення блоків не може відбуватися.

Якщо у вас надмірність (дзеркальне відображення / raidz / raidz2 / raidz3), блоки ditto не відрізняються від інших, і очищення / повторне відтворення відтворить їх.


Це безпосередньо суперечить тому, що говорить @Redmumba - і Redmumba надає посилання на код. Чи можете ви навести деякі джерела для сказаного? Зокрема, я хотів би побачити добрі цитати про те, чому ви вважаєте, що копії = N не справляються з усією несправністю пристрою - це не відповідає жодному, що я читав.
Джеймс Мур

1
@James Moore Після усієї несправності пристрою на цьому диску не буде записано жодних блоків ditto. На рівні пулу немає надмірності, тому немає можливості замінити несправний диск на новий. Єдиним методом належного відновлення такої ситуації було б зробити повне резервне копіювання пулу, відтворити його за допомогою здорових пристроїв та відновити з резервної копії, переконуючись, що перед початком резервного копіювання не відбудеться ненавмисне перезавантаження. Інакше пул може не бути імпортованим, і його дані втрачаються. Це досить тягар порівняно з надмірними пулами, коли відновлення поганого диска відбувається в режимі он-лайн і виживає перезавантаження.
jlliagre

1
Ось посилання: docs.oracle.com/cd/E19082-01/817-2271/gbbvf/… For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state). Я припускаю, що копії = 2 або 3 не вважаються зайвою конфігурацією.
jlliagre

1
Однак слід пам’ятати про те, що якщо ви спочатку це copies=1зробили copies=2, то ви, напевно, захотіли потім перевстановити / перевстановити - що створить ці екземпляри. Але @jilliagre вірно: блоки ditto не складають зайвої конфігурації. Немає гарантій того, що блоки встановлені на іншому пристрої, навіть якщо у пулі є кілька пристроїв.
Андрій М.

1
функція "копії = N, де N> 1" не призначена для додавання надмірності. призначений для усунення корупції даних. все, що написано на zfs, перевірено чи зафіксовано. коли воно зчитується назад, перевіряється контрольна сума / хеш. якщо N = 1, помилка перевірки контрольної суми / хеша призводить до помилки назад у програмі. якщо N> 1, то з однією з інших примірників можна звернутися і використати для відновлення всіх інших примірників.
longneck

9

Я вважав це питання дійсно інтригуючим, і, витративши годину на розсип документації, я занурився в код. Ось що я знайшов.

По-перше, деяка термінологія. Блоки Ditto (якими є ці копії, на відміну від дзеркал) автоматично створюються під час запису, але можуть бути або не бути в тому ж віртуальному пристрої (vdev), що і оригінальна копія. З іншого боку, дзеркальні блоки завжди відображаються на іншому віртуальному пристрої.

Однак код відноситься до обох типів блоків як до дітей. Ви побачите тут , що Дитто блоки просто діти з io_vd == NULL(це в функції запису). Для дзеркального блоку io_vdбуде встановлено відповідний віртуальний пристрій (наприклад, ваш другий диск).

Зважаючи на це, коли він потрапляє до прочитаної частини , він ставиться до всіх дітей (будь вони дзеркальними блоками чи блоками), як до потенційно небезпечних, якщо вони не містять очікуваного good_copies, та переписує їх за потребою . Отже, це здається, що відповідь на ваше запитання - так, він перепише їх, коли у вас буде принаймні одна хороша копія, і будь-яке з наступного:

  • Несподівані помилки, коли ви намагалися прочитати дані,
  • Ви переставляєте, або
  • Ви вичісуєте.

Фу! Можливо, хтось може вказати на недоліки, але мені подобалося дізнатися про ZFS через цю маленьку вправу, і я сподіваюся, що це допомагає!


1
Проблема полягає у відповіді @ jlliagre - пул мертвий, якщо він втрачає будь-який пристрій. Факт, що в пулі все ще є достатньо блоків, не здається важливим. Як-небудь навколо цього?
Джеймс Мур

4
@JamesMoore ви можете примусити масив в Інтернеті в деградованому стані, якщо у вас перший 1 Мб пристрою, який вийшов з ладу. Імовірно, вам просто потрібні метадані з несправного пристрою. Я тестував це на стилі jbod у стилі jbod, і він працює: відновлення порушених ярликів Raidz . Я зробив md5sum до і після того, як зламав zpool, і після імпорту було зламано лише копію = 1 файлову систему. Копії = 2 та копії = 3 файлові системи ідеально підходили.
Джоді C

2

@jlliagre та інші, які, здається, думають, що весь zpool помирає, якщо один з дисків (vdevs) вмирає, але пул не є зайвим (дзеркало / raidz). Це не правда; багатодисковий басейн буде завжди вижити один повна відмова диска , навіть якщо він не є дзеркальним або RAIDZ.

Метадані ZFS завжди копіюються щонайменше в 2 рази, тому повний збій повного диска (або будь-якої його частини) не зніме файлову систему. Крім того, багато файлів, особливо більш дрібні файли, не будуть розповсюджуватися на всі диски і тому не обов'язково будуть винні з ладу диска. ОП запитує про випадок багатодискового пулу з використанням блоків ditto (копії даних користувача> 1). Тут один повний збій диска ніколи не повинен призводити до втрати даних.ZFS завжди намагатиметься ставити блоки ditto далеко від початкового блоку, а для пулів з декількома vdevs це завжди означає для іншого vdev (виняток може бути, коли один vdev становить> 50% пулу, що було б дуже незвично) . Метадані файлової системи також завжди копіюються в +1 або +2 рази більше, ніж рівень ditto , тому вона завжди переживе збій диска. Крім того, якщо у вас є пул більше трьох дисків, ви повинні втратити до половини з них без втрати даних; ZFS зберігає блоки ditto на наступному диску, доки ви ніколи не втратите два сусідні диски, ви ніколи не втратите дані. (три суміжні несправності диска для ditto = 2).

Якщо є достатньо копій даних для доступу до файлу (будь то копії з блоків ditto, дзеркала чи raidz), тоді всі доступні копії даних відновлюються під час доступу до файлу. Це призначення скрабу; прочитати всі дані та виправити всі погані, використовуючи зайві копії. Отже, щоб відповісти на питання ОП безпосередньо, вам потрібно зробити скраб після заміни невдалого диска, і всі копії будуть відновлені.

Як завжди, ви можете легко експериментувати з концепціями, створивши пули, vdevs для резервного зберігання - це просто звичайні розріджені файли. Видаляючи або пошкоджуючи файли vdev, ви можете імітувати будь-який тип відмови, а також можете перевірити цілісність пулу, файлових систем та даних.

EDIT: після експерименту схоже, що zfs вийде з ладу пул, якщо диск вийде з ладу в безліденному пулі з кількома дисками з копіями> = 2. Корупція даних про часткові дані на одному або декількох дисках повинна залишатися придатною для життя та її фіксувати скрабом.


Страшна річ у подібних експериментах - це те, що вони чудово підказують, що налаштування не вдасться негайно або хоча б швидко. Вони не настільки чудові, щоб сказати мені, що час від часу інсталяція буде невдалою. У будь-якому випадку, незрозуміло, як ви повернете пул, який має збій; Я спробував налаштувати такий пул із трьома розрідженими файлами та видалити один із розріджених файлів, мабуть, фатально для всього пулу. Заміна zpool не замінить файл, що не вдався, спул зчитування zpool на 5% (а це дуже малі пули), а сторінка помилок на сайтаoslios.org/msg/ZFS-8000-5E не є оптимістичною.
Джеймс Мур

У мене був подібний результат до моїх переживань, зроблений лише після моєї відповіді. Я, як правило, використовую лише raidz, і відповідав на основі інформації, з якої я вважав надійними джерелами (блоги Oracle). Я більше не вірю, що багатодисковий пул типу JBOD із копіями> 1 може вижити збою диска.
Аарон Б
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.