4.02.2011

Небольшое исследование ZFS

Давеча у меня наебнулось хранилище, как вы знаете. Ну не до конца наебнулось, доктор подлечил чутка, данные вытащил я оттуда. Но понервничать заставило. Так вот, купил я новый 2Т винт (WD зеленый, других не завезли), полечил сразу, и скопировал почти все на него. Сейчас вот начну разбирать zfs на винты и натравливать на них mhdd. Но для начала я подумал - а как бы потом поднять хранилище...?


Ну, во первых, это будет опять zfs. Нравится оно мне. Во вторых, это будет raidz. Ибо нефиг. ССЗБ, что раньше не сделал. Да и raidz всетаки лучше зеркала тем, что бОльший объем пространства будет полезным.


Но предварительно я решил проверить - насколько гибок zfs? Как оказалось - не настолько гибок, как хотелось бы.




Для начала создаем базу для тестов - файлы, из которых и будем сооружать хранилище.  4 диска по 100М и 1 диск 200М
[cc lang="bash"]
storage /#dd if=/dev/zero of=/data/dev/disk0.img count=200K
storage /#dd if=/dev/zero of=/data/dev/disk1.img count=200K
storage /#dd if=/dev/zero of=/data/dev/disk2.img count=200K
storage /#dd if=/dev/zero of=/data/dev/disk3.img count=200K
storage /#dd if=/dev/zero of=/data/dev/disk.img count=400K
storage /# du -h /data/dev/*
100M /data/dev/disk0.img
100M /data/dev/disk1.img
100M /data/dev/disk2.img
100M /data/dev/disk3.img
200M /data/dev/disk.img
[/cc]

И понеслась:

Обычное хранилище, без выебонов (так называемое top-level), 4 одинаковых диска:
[cc lang="bash"]zpool create sttemp /data/dev/disk0.img /data/dev/disk1.img /data/dev/disk2.img /data/dev/disk3.img[/cc]
Объем получившегося массива: 350M; (100% для массивов из 4 одинаковых дисков)

raidz1 ,4 одинаковых диска:
[cc lang="bash"]zpool create sttemp raidz1 /data/dev/disk0.img /data/dev/disk1.img /data/dev/disk2.img /data/dev/disk3.img[/cc]
Объем получившегося массива: 254M; 72,5%

raidz2 ,4 одинаковых диска:
[cc lang="bash"]zpool create sttemp raidz2 /data/dev/disk0.img /data/dev/disk1.img /data/dev/disk2.img /data/dev/disk3.img[/cc]
Объем получившегося массива: 158M; 45,1%

raidz3, 4 одинаковых диска:
[cc lang="bash"]zpool create sttemp raidz3 /data/dev/disk0.img /data/dev/disk1.img /data/dev/disk2.img /data/dev/disk3.img[/cc]
Объем получившегося массива: 63M; 18%

Явно просматривается увеличение места под контроль четности. Да, и похоже 50М используются на нужды самого ZFS, поэтому проценты считаем от массива без выебонов.


Далее пробуем создать массив из разных дисков:
4 одинаковых диска + 1 вдвое бльшего размера:
[cc lang="bash"]zpool create sttemp /data/dev/disk0.img /data/dev/disk1.img /data/dev/disk2.img /data/dev/disk3.img[/cc]
Объем получившегося массива: 545M (100% для массивов 4 одинаковых диска + 1 вдвое бльшего размера)

Просто так в raidz разные диски (диски с разным размером) zfs не впендюривает. Надо ее заставить с флагом -f. Не уверен, что это хорошо.

4 одинаковых диска + 1 вдвое бльшего размера в raidz1:
[cc lang="bash"]zpool create sttemp raidz1 /data/dev/disk0.img /data/dev/disk1.img /data/dev/disk2.img /data/dev/disk3.img /data/dev/disk.img -f[/cc]
Объем получившегося массива: 348M; 63,8%

4 одинаковых диска + 1 вдвое бльшего размера в raidz1:
[cc lang="bash"]zpool create sttemp raidz2 /data/dev/disk0.img /data/dev/disk1.img /data/dev/disk2.img /data/dev/disk3.img /data/dev/disk.img -f[/cc]
Объем получившегося массива: 251M; 46%

4 одинаковых диска + 1 вдвое бльшего размера в raidz1:
[cc lang="bash"]zpool create sttemp raidz3 /data/dev/disk0.img /data/dev/disk1.img /data/dev/disk2.img /data/dev/disk3.img /data/dev/disk.img -f[/cc]
Объем получившегося массива: 158M; 28,9%

Очень похоже на то, что вторую половину большого диска raidz не берет во внимание.

Пробовал я еще играться с зеркалами и со смешанными массивами. Результат такой: в raidz диски можно заменять при помощи zpool replace, но добавить еще один винт в zpool, не выйдет. Из зеркал же можно удалять и добавлять винты (минимум 2 шт в зеркале должно оставаться), но зеркало невыгодно по получающемуся объему.



4 одинаковых диска в двух зеркалах:
[cc lang="bash"]zpool create sttemp  mirror /data/dev/disk0.img /data/dev/disk1.img mirror  /data/dev/disk2.img /data/dev/disk3.img[/cc]
Объем получившегося массива: 159M, 45,4%

Получается почти как при raidz2. Но там двойной контроль четности, а тут двойное зеркало. Оба гарантируют выживаемость массива при смерти 2х устройств, но с зеркалом - как повезет (отвалится по устройству из каждого зеркала или два устройства в одном), а при raidz2 - издохнуть могут любые.


В общем и целом вердикт такой: диски получится добавлять только к top-level. Ну, не только диски, можно сразу raidz'тами и зеркалами. Но не внутрь существующего raidz. Так что если к существующему массиву хочется добавить еще дисков, и сохранить возможность восстановления, то добавляем не по одному, а минимум по 2 (сразу зеркалом, zpool add sttemp mirror...) или по x+1 сразу в raidzx.




Оригинал записи - в личном блоге. Комментировать можно тут, но желательно там.

Комментариев нет: