Имеется сервер HPE ProLiant DL360p Gen8 с Debian 8.1 Jessie, с 6 HDD в RAID 1+0 (+ загрузочный RAID 1 на SSD). На этом RAID 1+0 одна партиция на которую сваливаются логи некого приложения, их очень много и становится всё больше и больше. В общем места не хватает и потому надо переделать RAID 1+0 в JBOD, а файловую систему в BTRFS со сжатием (логи текстовые, сжиматься должны очень хорошо). Отказоустойчивость не очень важна, но всё же желательно если выйдет из строя один HDD, то данные на остальных HDD чтоб выжили и можно было без проблем заменить HDD.Если я правильно понял, то JBOD у HPE называется "HBA Mode" и он поддерживается моим контроллером P420i. Мигрировать RAID10 -> JBOD не планирую, т.к. на сколько я понял миграция идёт "15 minutes per gigabyte", т.е. свои терабайты я буду больше месяца мигрировать - проще снести всё и пересоздать, пусть даже потеряются логи - опять насобираются.
Сжатие вроде не должно влиять на производительность: ""Btrfs включена в основную ветвь ядра Linux начиная с версии 2.6.29-rc в статусе экспериментальной. Проведённая ресурсом Phoronix оценка производительности показала, что Btrfs с включённым режимом сжатия иногда опережает по производительности Ext4"". Правда тут https://wiki.debian.org/Btrfs пишут в рекомендациях: "Do not use compression. That said if one wants to test this functionality then zlib seems to have fewer issues than lzo. There is insufficient data on the new zstd mode to either recommend it or caution against its use.". Надеюсь всё будет нормально.
Вопросы:
1. Почему при apt-get install btrfs-tools ставится старая версия v3.17, хотя на packages.debian.org лежит и 4.15.1-2? Можно ли поставить с помощью apt-get install последнюю версию? Она поддерживает сжатие ZSTD https://github.com/kilobyte/compsize Или только вручную с помощью dpkg -i?2. Хочу для начала ничего не убивать, а попробовать сконвертировать ext4 на RAID 1+0 в BTRFS со сжатием ZSTD. Проблем быть не должно? В том числе с этим RAID 1+0? С каким опциями лучше всего подключать? Постоянно заливаются файлы с логами, магабайт по 15 (без сжатия), которые со временем (через сколько-то дней) перезаписываются. В логах часто надо что-то искать.
3. Если буду переразбивать дисковый массив в JBOD - его нужно собирать средствами контроллера HPE P420i в HBA Mode? Или делать как-то всё средствами Debian, BTRFS?
Использовал я как-то http://rockstor.com - это СХД на основе btrfs... Ну кратко - месяца не продержался, умер с потерей всех данных. Ну там ничего ценного не было, так что я даже заморачиваться с восстановлением не стал, хотя может и можно было вытянуть что-то...Вообщем я с тех пор яснил что если хочешь полноценное СХД на опенсорце - альтернатив ZFS просто нет.
Если кому-то когда-то станет интересно. В общем собрал я JBOD средствами BTRFS из 6 HDD. Для этого на HPE ProLiant DL360p Gen8 создал 6 штук RAID0 (F5 при начальной загрузке сервера, загорится соответствующая надпись - попадаем в настройки RAID) + один логический диск на каждом. Далее из Debian:
mkfs.btrfs -d single /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdgВыяснил UUID:
lsblk -alt
blkidПрописал монтирование при загрузке:
echo "UUID=<UUID> /mnt/<path> btrfs x-systemd.device-timeout=10,noatime,compress-force=zstd,autodefrag 0 2" >> /etc/fstabВ принципе, всё вроде как нормально работает, равномерно разбрасывает файлы по всем физическим дискам в JBOD:
btrfs device usage -h /mnt/<path>
/dev/sdb, ID: 1
Device size: 1.09TiB
Device slack: 0.00B
Data,single: 475.00GiB
Metadata,RAID1: 5.00GiB
System,RAID1: 8.00MiB
Unallocated: 637.77GiB/dev/sdc, ID: 2
Device size: 1.09TiB
Device slack: 0.00B
Data,single: 474.00GiB
Metadata,RAID1: 6.00GiB
System,RAID1: 8.00MiB
Unallocated: 637.77GiB/dev/sdd, ID: 3
Device size: 1.09TiB
Device slack: 0.00B
Data,single: 474.00GiB
Metadata,RAID1: 6.00GiB
Unallocated: 637.78GiB/dev/sde, ID: 4
Device size: 1.09TiB
Device slack: 0.00B
Data,single: 480.00GiB
Metadata,RAID1: 1.00GiB
Unallocated: 636.78GiB/dev/sdf, ID: 5
Device size: 1.09TiB
Device slack: 0.00B
Data,single: 478.00GiB
Metadata,RAID1: 3.00GiB
Unallocated: 636.78GiB/dev/sdg, ID: 6
Device size: 1.09TiB
Device slack: 0.00B
Data,single: 474.00GiB
Metadata,RAID1: 7.00GiB
Unallocated: 636.78GiB
btrfs filesystem usage /mnt/<path> -h
Overall:
Device size: 6.55TiB
Device allocated: 2.82TiB
Device unallocated: 3.73TiB
Device missing: 0.00B
Used: 2.80TiB
Free (estimated): 3.74TiB (min: 1.88TiB)
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 512.00MiB (used: 0.00B)Data,single: Size:2.79TiB, Used:2.78TiB
/dev/sdb 475.00GiB
/dev/sdc 474.00GiB
/dev/sdd 474.00GiB
/dev/sde 480.00GiB
/dev/sdf 478.00GiB
/dev/sdg 474.00GiBMetadata,RAID1: Size:14.00GiB, Used:12.61GiB
/dev/sdb 5.00GiB
/dev/sdc 6.00GiB
/dev/sdd 6.00GiB
/dev/sde 1.00GiB
/dev/sdf 3.00GiB
/dev/sdg 7.00GiBSystem,RAID1: Size:8.00MiB, Used:320.00KiB
/dev/sdb 8.00MiB
/dev/sdc 8.00MiBUnallocated:
/dev/sdb 637.77GiB
/dev/sdc 637.77GiB
/dev/sdd 637.78GiB
/dev/sde 636.78GiB
/dev/sdf 636.78GiB
/dev/sdg 636.78GiB
Видно, что DATA, METADATA я расположил на всех 6 физических дисках, а SYSTEM только на первых двух.btrfs filesystem show /mnt/<path>
Label: '<label>' uuid: <uuid>
Total devices 6 FS bytes used 2.79TiB
devid 1 size 1.09TiB used 480.01GiB path /dev/sdb
devid 2 size 1.09TiB used 480.01GiB path /dev/sdc
devid 3 size 1.09TiB used 480.00GiB path /dev/sdd
devid 4 size 1.09TiB used 481.00GiB path /dev/sde
devid 5 size 1.09TiB used 481.00GiB path /dev/sdf
devid 6 size 1.09TiB used 481.00GiB path /dev/sdgbtrfs-balance делать нет нужды, данные равномерно распределены между всеми дисками (для дополнительных физических дисков места уже нет).
btrfs filesystem df /mnt/<path>
Data, single: total=2.79TiB, used=2.78TiB
System, RAID1: total=8.00MiB, used=320.00KiB
Metadata, RAID1: total=14.00GiB, used=12.61GiB
GlobalReserve, single: total=512.00MiB, used=0.00B
Сжатие ZSTD со степенью компрессии по умолчанию (на сколько я понял, в текущей версии менять степень сжатия невозможно для этого метода компрессии) жмёт довольно ощутимо текстовые логи (compsize ставится дополнительно: apt-get install btrfs-compsize):
compsize /mnt/<path>
Processed 640027 files, 54822039 regular extents (54822039 refs), 0 inline.
Type Perc Disk Usage Uncompressed Referenced
TOTAL 42% 2.7T 6.4T 6.4T
none 100% 1.8G 1.8G 1.8G
zstd 42% 2.7T 6.4T 6.4TНикаких ошибок в работе не видно:
btrfs device stats -c /mnt/<path>
[/dev/sdb].write_io_errs 0
[/dev/sdb].read_io_errs 0
[/dev/sdb].flush_io_errs 0
[/dev/sdb].corruption_errs 0
[/dev/sdb].generation_errs 0
[/dev/sdc].write_io_errs 0
[/dev/sdc].read_io_errs 0
[/dev/sdc].flush_io_errs 0
[/dev/sdc].corruption_errs 0
[/dev/sdc].generation_errs 0
[/dev/sdd].write_io_errs 0
[/dev/sdd].read_io_errs 0
[/dev/sdd].flush_io_errs 0
[/dev/sdd].corruption_errs 0
[/dev/sdd].generation_errs 0
[/dev/sde].write_io_errs 0
[/dev/sde].read_io_errs 0
[/dev/sde].flush_io_errs 0
[/dev/sde].corruption_errs 0
[/dev/sde].generation_errs 0
[/dev/sdf].write_io_errs 0
[/dev/sdf].read_io_errs 0
[/dev/sdf].flush_io_errs 0
[/dev/sdf].corruption_errs 0
[/dev/sdf].generation_errs 0
[/dev/sdg].write_io_errs 0
[/dev/sdg].read_io_errs 0
[/dev/sdg].flush_io_errs 0
[/dev/sdg].corruption_errs 0
[/dev/sdg].generation_errs 0Но смущает только обилие таких вот ошибок (весь список и для всех дисков не стал приводить - слишком он длинный, ниже лишь небольшая часть для одно диска), хотя их влияние на что-либо не заметил:
btrfs-find-root /dev/sdb
Superblock thinks the generation is 62327
Superblock thinks the level is 1
Found tree root at 1344874201088 gen 62327 level 1
Well block 1344863961088(gen: 62325 level: 0) seems good, but generation/level doesn't match, want gen: 62327 level: 1
Well block 1344864288768(gen: 62322 level: 0) seems good, but generation/level doesn't match, want gen: 62327 level: 1
Well block 1344861421568(gen: 62322 level: 0) seems good, but generation/level doesn't match, want gen: 62327 level: 1
Well block 1344861290496(gen: 62322 level: 0) seems good, but generation/level doesn't match, want gen: 62327 level: 1
Well block 1344822345728(gen: 62318 level: 0) seems good, but generation/level doesn't match, want gen: 62327 level: 1
В результате: был у меня RAID1+0, собранный средствами контроллера HPE P420i, теперь у меня JBOD, собранный средствами BTRFS с вдвое большим объёмом без учёта сжатия средствами BTRFS. BTRFS дополнительно более чем удваивает доступный объём с помощью сжатия ZSTD.BTRFS --version
BTRFS-progs v4.16.1
Как я понял, надо подгонять версию ядра к версии BTRFS, если версии отличаются в ту или другую строну, то какой-нибудь функционал может быть недоступен. В более свежих версиях шире функционал, пофиксили баги - стабильней работать должно.
Если какой-нибудь физический диск в JBOD сломается, то потеряются только данные (логи), которые лежат на нём, остальные должны остаться в живых.
Остались вопросы:
btrfs subvolume create /mnt/<path>/<subvol>
btrfs property set /mnt/<path>/<subvol> compression zstd - создаваемые файлы не жмутся всё равно, судя по compsize
chattr -R +c /mnt/<path>/<subvol> - создаваемые файлы не жмутся всё равно, судя по compsize
Почему не работает сжатие для subvol для создаваемых там файлов?btrfs filesystem defrag -v -r -f -czstd /mnt/<path>/<subvol> - сжимаются только те файлы, что уже были, новые не будут сжиматься. Это работает, но новые файлы там опять остаются несжатыми. Пришлось весь диск указывать как принудительно сжимаемый в fstab (compress-force=zstd), а хотелось сжимать лишь одну папку (ну subvolume).
btrfs property get /mnt/<path>/<subvol> - видно было, что атрибут сжатия и нужного типа установился.