Как стать автором
Обновить

Комментарии 53

Вторая статья от хостера про бэкапы и zfs. Если все так хорошо, зачем хардварный raid тогда нужен? Или ресурсов на zfs требуется сильно много и это не всем подходит?

Хардварный raid нужен на случай поломки хардварного диска. В случае какого-нибудь софтового drop table или rm -rf /* без бэкапа он будет бесполезен, увы.
Отвечу за автора статьи: zfs ортогональна аппаратному RAID.
У ZFS есть две киллер-фичи для резервного копирования:
1. Дешевые снимки состояния, с возможностью доступа во внутрь. Вы можете делать checkpoint-ы тысячами, без какого-либо влияния на производительность. Можете их сотнями одномоментно удалять, не заметно для текущих операций чтения/записи.Можете зайти в каталог .zfs/snapshots/имя-снимка и получить копию файловой системы этого снимка.
2. Возможность репликации снимков по сети.

Обычные RAID контроллеры, да и дисковые массивы начального-среднего ценового уровня такого не умеют. Поэтому, нет ничего зазорного в том, чтобы собрать RAID массив с помощью контроллера (ради скорости) и сделать на нём файловой системой ZFS (ради снимков и репликации), решая каждым элементом свою задачу. Естественно возможностей у ZFS сильно больше, но в контексте резервного копирования важны эти две.
НЛО прилетело и опубликовало эту надпись здесь
Btrfs создавалась как альтернатива ZFS, поэтому, в целом, их принципы и функциональные возможности идентичны. Учитывая богатство этих возможностей, обычно, используют только одну из этих файловых систем. Из-за чего объективное сравнение опыта использования в идентичных условиях — редкость, а в таких статьях упор делается только на одну из них.
Если не секрет, поделитесь в комментарии или статье причинами подтолкнувшими к dattobd и опытом работы с ним?
НЛО прилетело и опубликовало эту надпись здесь
Я в итоге пришел к использованию LVM2 тонких томов и рукописным скриптам, которые позволяют извлекать разницу между двумя тонкими снапшотами из метаданных томов и реплицировать эту разницу на бэкап-устройство.
Использую для создания резервных копий (инкрементальных) образов виртуальных машин на тонких томах независимо от используемых там файловых систем/шифрования.
Статья в профиле есть соответствующая. Со скриптами.
насчет миллиона снапшотов — есть мнение (2018 года), что их рекомендуется иметь «сильно меньше ста» ("single to low double-digits of snapshots per snapshotted subvolume"), если предполагается использование btrfs-команд типа balance и check: unix.stackexchange.com/a/422650
Поэтому, нет ничего зазорного в том, чтобы собрать RAID массив с помощью контроллера (ради скорости) и сделать на нём файловой системой ZFS (ради снимков и репликации), решая каждым элементом свою задачу.

Есть. Для домашнего бэкапчика может и ладно, но нормальный пул категорически не рекомендуется ставить поверх железного рейда. В лучшей книге по zfs это просто обозначено в примерно такой фразе: "Never! Never install ZFS on hardware RAID!"

Почему? Вы задумывались, что стоит за этой фразой?
ZFS не рекомендуют использовать поверх RAID, из-за того, что это нивелирует многочисленные технические ухищрения в ней, направленные на борьбу с ошибками, в том числе аппаратного характера. Из-за того, что выход из строя аппаратного контроллера, в некоторых, редких сценариях может разрушить массив. Из-за большей гибкости в управлении томами, которую может давать ZFS для сложных сценариев.
И всё это никак не соотносятся с другими функциями ZFS, вроде снимков состояния или сжатия.
При этом ZFS в режиме JBOD будет существенно медленней, чем обычный RAID контроллер, с батарейкой, Write-Back и осознанием рисков такого сценария. Или можно функциональностью ZFS дополнить дисковую полку, в которой в принципе нет режима JBOD — и это тоже будет быстрей, чем делать по отдельному LUN на каждый диск. Поэтому нет ничего зазорного, в том, что бы делать пул поверх RAID, если вы понимаете, что при этом теряете и что приобретаете, а не слепо следуете какой-либо книге.

Я задумывался, но вы же в своём комментарии написали просто "нет ничего зазорного". Зазорного нет только в очень ограниченном наборе кейсов и при полном понимании того, что делаешь. А кто-то может прочитать ваш коммент и решит, что нормально будет всегда. Я просто сталкивался с такими пулами, а потом народ хаит ZFS, что тормозит и тп.

Да, наверное наверное и так можно воспринять мой комментарий. Но имелось в виду, что выбор включает в себя не только использование RAID или CoW файловой системой, но и возможность скомбинировать их для некоторых сценариев.

При этом, в целом, я в большей степени сторонник наличия резервного копирование данных. Т.е. в ситуациях серьезных сбоев (если это что-то больше горячей замены диска) вы не занимаетесь починкой массива, или файловой системы, а просто пересоздаёте их и развертываете одну из резервных копий. К сожалению, даже CoW ФС можно ввести в полностью не поддерживаемое состояние, когда извлечь с них данные оказывается крайне затруднительно.
Ну а насчёт тормозов и хая — он в значительной мере вызван тем, что функционал не подкреплен адекватными инструментами диагностики и простым описанием последствий для производительности. И пытаясь использовать сложную комбинацию разных функций (а сами ФС это скорей поощряют) можно иногда получить падение производительности в совершенно неожидаемых масштабах.

Поддерживаю! Разве что насчет инструментов и описания — в сети много инфы о zfs, и книжки есть, где всё написано. Но надо читать и вникать, имхо проблема больше в этом. И инструменты в zfs на порядок лучше поделок от megaraid и тп, которые явно писали наркоманы =)

Нет, киллер фич не две, а намного больше. В новых версиях, например, это возможность инкрементального бэкапа зашифрованного диска без необходимости переливать весь диск. Т.е бэкап сервер не имеет доступа к данным, но имеет возможность бэкапить только разницу!
А ещё ZFS не подвержен ошибкам write hole. А еще не придется бегать и искать точно такой же контроллер, чтобы получить доступ к данным, когда сгорит ваш. Еще гибко настраиваемая прозрачная компрессия из коробки, когда свои параметры сжатия можно применять чуть ли не к каждому диру. В общем… перечислять еще можно долго.


ЗЫ Еще сам не щупал, а только в анонсах читал про новый механизм для решения проблемы ребилдинга z2/z3, когда при замене сбойнутого диска не требуется перечитать пол массива. На больших пулах (а мы же тут не в бирюльки играем?) это просто бомбическая фича. D-RAID чтоли? Вот тут все дешманские (и не очень) железки будут просто курить в стороне. Может кто уже пробовал, будет очень интересно.

Всё так. Но всегда остается в тени тот факт, что за всё это вы платите доступным объемом, а следовательно долларом за гигабайт.

Плюс нет дефрагментации и через время выходом будет только ребилд.(насколько я помню)

Не понял, о чем речь про объем? У меня, например, обратная ситуация — LZ компрессия дает мне выигрыш 34% от объема пула, что при пуле 300Тб выливается в заметную экономию.
Дефрагментация там не нужна, в некотором смысле она заложена в принципы cow fs. Хотя в той же xfs тоже нет явной дефраг, и она великолепно живет у меня на десятках нагруженых серверов уже 10+ лет. Дефраг и тп это боль ntfs и другого старья, которое застряло в 90ых )


Кстати, компрессия, помимо объема, даёт прирост в скорости R/W и меньшей утилизации диска. Это неявный момент упускают, а он есть, засчёт того, что диску нужно читать/писать меньше данных с блинов. Конечно, за это платим CPU, но на современных процах нагрузка малозаметна, да и в большинстве случаев баттлнеком является io, а не cpu, поэтому не жалко.

хардварный рейд нужен для простреливания себе ноги в максимально неудачный момент и максимально неочевидным способом, всё. для чего-то другого последние лет 15-20 он в лучшем случае бесполезен.
Если все так хорошо, зачем хардварный raid тогда нужен?
чтобы его покупали верующие в гарантию и силу бренда, например :)
Оставив конкурента (btrfs) далеко позади

С этого момента поподробнее, плиз.

НЛО прилетело и опубликовало эту надпись здесь
Может вот это имелось в виду? lore.kernel.org/linux-btrfs/20200627030614.GW10769@hungrycats.org

Недавно сам рассматривал идею поднять на одном из серверов btrfs в raid5 режиме, но подобные проблемы заставили использовать консервативный md, а поверх уже накатил btrfs.
Обычно обожатели zfs, склонные презирать все остальные ФС, на это и напирают. Но как-то оно на «далеко позади» не тянет, имхо.
zfs send -R rpool/send-remote@test0 | ssh my-vps-host zfs receive -A hotspare/receive-remote
(задумчиво глядя на груду btrfs снапшотов на втором винте)
А вот интересно, по сети так же можно передавать через ssh туннель? Проверить, конечно, можно, но несколько геморройно.

Btrfs man:


-f <outfile>

output is normally written to standard output so it can be, for example, piped to btrfs receive. Use this option to write it to a file instead.

Этот же свитч имеет аналогичное действие и у btrfs receive.

Есть кардинальная разница между репликацией блочных устройств и отчуждаемым бекапом. Второй имеет дело не с блоками диска, а с файлами, репликация же тупо копирует блоки диска. В результате, если не дай-бог в результате корявых рук, сбоя памяти или бага операционной системы ваша файловая система порушится, то zfs send старательно отреплицирует битые блоки на удалённую площадку, а zfs recv старательно применит их на резервной площадке.

Именно поэтому весь кровавый энтерпрайз до сих пор, несмотря на наличие резервных ЦОД, в том числе бекапит по старинке файлы на ленту, а ленты старается отнести куда подальше.
zfs send старательно отреплицирует битые блоки

Нет, send сломается.

зато он умеет превращать данные в кашу даже на исправных фс, например:
https://github.com/openzfs/zfs/issues/10342

Из того, что видно в обсуждении, выходит, что не превращать в кашу а дописать мусор в конец, и не всегда, а при специфичных условиях.


Вы молодец, что их нашли, конечно. И особенно, что завели issue и сделали reproduce.
Но в подавляющем большинстве инсталляций этот баг не проявится, так ведь?

не превращать в кашу а дописать мусор в конец

И как вы предлагаете восстанавливать файлы?

Актуальная же копия на момент выявления проблемы у вас была?


Проблема в сжатых данных и несжатом arc, что порождает неконсистентность в записываемых данных файлов; очевидно что нужно обеспечить консистентность или отменой вашей специфической настройки или повторно передать уже декомпрессированный снепшот.
Должно помочь.

Актуальная же копия на момент выявления проблемы у вас была?

увы, нет. к счастью, сохранился вывод zfs send, поэтому данные удалось восстановить. сохранился, в общем-то, по случайности: данные из дампа развернули, файлы выборочно проверили, его можно было удалять.
а через какое-то время оказалось, что некоторые файлы «битые».

Зато стало понятно, почему отменили передачу дедуплицированных и сжатых снепшотов.


Кстати, тут не мог бы помочь вариант scrub, если бы его можно было делать не для пула а для данных снепшота? Или при сверке чексумм ошибок в пуле не было?

Зато стало понятно, почему отменили передачу дедуплицированных и сжатых снепшотов.

сомневаюсь, что дело в этом. просто когда вводили compressed arc где-то что-то просмотрели.
многие говорят, что качество нового куда ниже, чем было в сановском zfs. хотя и интересных фич напилили, не поспоришь.


Или при сверке чексумм ошибок в пуле не было?

нет, конечно. чексуммы считаются по записанным на диски данным (а они будут различаться в зависимости от типа vdev, компрессии, recordsize).

Ага, спасибо…

У меня был опыт, когда я переносил zfs pool с одних дисков на другие посредством записи результата zfs send на промежуточный носитель. При попытке zfs recv FreeBSD выдавала assert где-то внутри zfs. Я отследил место и пропатчил, чтобы эта проверка пропускалась для данного сектора. Но та же проблема возникала и в других секторах. В результате я докопался, что всегда это было одно и то же поле одной из структур с одним флипнутым битом. После патча для игнорирования этой проблемы, я сумел восстановить пул на новых дисках, и после скраба там оказалось всего с десяток проблемных файлов.
Так и не знаю, в чём именно была проблема, думаю, что в оперативной памяти, но немного подозрительно, что проблема проявилась только в одной из структур, но ни разу в содержимом файлов или других местах. Память так же никогда не вызывала нареканий в нормальном процессе работы ни до, ни после этого случая, ФС не билась.

ну так надо было багрепорт оставить, глядишь, поправили бы.
выглядит не очень красиво: падать вместо того, чтобы сругаться на неверные чексуммы.

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

НЛО прилетело и опубликовало эту надпись здесь
Получить поврежденную файловую систему из-за ошибок памяти можно практически на любой системе. В большинстве случаев повреждения могут зайти достаточно далеко для потери данных.
На ZFS с памятью без ЕСС тоже можно получить проблемы, но с большое вероятностью можно заметить ошибки если хоть немного следить за системой…
НЛО прилетело и опубликовало эту надпись здесь
Это да…
Но если не следить, то как разница на какой системе в итоге граблями получать?
В любой системе возникаю ошибки: софтовые, аппаратные, комбинации софт+железо, действия пользователя…
В разных системах и сценариях использования каких-то ошибок можно избежать, но появляется возможность возникновения других ошибок. Которые тоже можно компенсировать, но опять могут возникнуть другие ошибки… и т.д…
В итоге все упирается в стоимость мер по устранению ошибок… Кому-то хватит что-то типа NasFree на старом железе, а кто-то дома устанавливает промышленные СХД…
А корпоративное использование — это вообще отдельный разговор…
Из опыта скажу что удалось восстановить почти все инфу с raidz когда начали сыпаться почти одновременно два диска из трех (хотя комп работал пару суток). NAS собранный из обычного офисного компа. На аппаратном или софтовом рейде восстановить не удалось бы… Ну или стоимость восстановления у профессионалов была бы такой что никто не стал бы с этим заморачиваться…
Забыли упомянуть, что за все это приходится платить. Write amplification может стать неприятным сюрпризом для пользователей с SSD.

Только вот во всех бенчмарках и реальном использовании для чего-то кроме хранилища (т.е. NAS и бэкапы) ZFS далеко позади Ext4 — как по скорости, так и по IOPS.


Ставить на неё БД или что-то другое кому нужна хороша производительность (особенно со случайым доступом) — просто бессмысленно, все супер-пупер фичи начисто убиваются никакой производительностью, более того, NVMe SSD на ZFS превращаются в обычные SATA SSD (и то если повезёт).

Почему? Стоит postgreSQL на NVMe/ZFS с включённым сжатием. Коэффициент сжатия 3,60х. Да и пацаны из Percona говорят, что всё отлично, только надо настроить всё правильно:

www.percona.com/blog/2018/05/15/about-zfs-performance

Пацаны из Percona прямо говорят что "всё круто если есть куча кэша", и почему-то сравнивают ZFS с XFS, которая сама по себе не особо-то и шустрая (по сравнению с ext4).


Вы свою базу погоняйте на ext4 и расскажите про ощущения — при прочих равных (память etc) ZFS останется в хвосте. Cжатие конечно потеряете — но с учётом стоимости дисков это не особо-то и проблема, особенно когда нужна скорость.

Странно тогда, почему Oracle Linux рекомендует именно XFS в качестве файловой системы. С другой стороны, я не очень понимаю, почему они же вместо своей родной ZFS продвигают btrfs…

Но спасибо за идею, попробую ext4.
В Oracle Linux XFS, потому как они делают RedHat-base дистрибутив. А у Red Hat-а XFS по причинам описанным в статье: How to Choose Your Red Hat Enterprise Linux File System там же сценарии, в которых она лучше/хуже Ext4.
Для Oracle родная как раз Btrfs, они её стартовали как альтернативу ZFS ещё до покупки Sun. А после покупки, и до сих пор вроде не спешат делать двойную лицензию для ZFS, что бы получить совместимость с GPL и возможность включения в ядро.
Насчёт PostgreSQL — база данных не бенчмарк, основные операции чтение/запись блоков в существующих файлах, поэтому, в общем случае прямо какой-то невероятной разницы между разными файловыми системами не будет. Возможно даже наоборот, отсутствие сжатие уменьшит TPS.

Отсутствие сжатия может уменьшить TPS только на очень специфичных нагрузках и на очень медленных устройствах.


Проблема с ZFS это огромный объём метаданных (и сама их структура) плюс необходимость поддерживать их при каждой записи — если база в основном только читается то это может и не быть существенным, но если там ощутимая доля записи — уже всё, TPS проседает только так.


Ну и требования к ресурсам — то что можно получить по производительности на паре NVMe накопителей с ext4 и 32G RAM вы никогда не получите с ZFS — даже если увеличить память в два раза. Если же накопители совсем не SSD, то всё становится вообще очень печально, особенно для постоянно нагруженных по вводу-выводу приложений.


Не скажу за всю Одессу, но на сравнительно небольшой базе (~150G, около 200 клиентов и в среднем ~300 TPS, примерно 80% чтение 20% запись, HDD RAID-5) эксперимент был проведен — на ZFS (которой дали ровно такие же HDD для RAIDZ) среднее время отклика увеличилось в 4 с чём-то раза для записи и примерное вдвое для чтения, общая загрузка сервера выросла (CPU и I/O) — при том же самом железе (Xeon E5-2630, 96GB RAM). База правда примерно в пару раз ужалась, да — но это как бы не совсем важно уже было — так что всё вернули как было.

Вы сравнивали не Ext4 и ZFS, а RAID контроллер в котором аппаратно рассчитывается разбиение блоков на RAID-5 против той же задачи средствами центрального процессора для ZFS. Закономерно, это увеличивает нагрузку на процессор (кто-то же должен считать) и уменьшило отклик (безотносительно каких-либо метаданных). Отдельно напишу — я не считаю ZFS в общем случае значимо производителей, её функциональность имеет свою цену, однако полагать, что её использование даёт 4-х кратное падание отклика неверно.

Но даже это не отменяет мой комментарий, относительно вклада файловой системы, выигрыш от замены RAID-5 на RAID-10 будет существенней, чем от замены файловой системы. Для меня даже как-то дико, что кто-то держит базу на 5-м, учитывая вполне осязаемый риск вылета второго HDD раньше окончания перестроения тома и не очень высокую скорость.

В общем-то то что ZFS добавляет нехилый оверхед из-за метаданных — это как бы факт, исходящий из её архитектуры, она в принципе не может дать производительность на уровне близком к Ext4 — по определению, особенно при записи (когда метаданные расчитываются + производится компрессия и дедупликация). COW также не добавляет производительности — данные сильно фрагментируются в итоге, что сильно бьет если это не SSD.


Ext4 поверх softraid5 не сильно повышает использование CPU — для современных процессоров расчёт-проверка паритета это ничто (особенно когда много ядер), проблемой это было лет 10-15 назад, в ZFS намного больше нагрузки и без паритета (она несущественна только при чтении при условии что данные уже в кэше).


В любом случае — как я уже говорил — при прочих равных ZFS сожрёт больше ресурсов и уменьшит производительность (насколько — зависит от нагрузки), без вариантов.


С базой на RAID5 всё ок — она с репликами, а диски там небольшие (150G Velociraptor) так что ребилд очень шустрый, хотя ещё ни один не умер (меняли один раз с упреждением по истечении гарантии).

Не понимаю, почему вы упорно сравниваете Ext4 без дедупликации и компрессии с ZFS где они включены? В конце-концов они в ZFS даже в дефолтном состояние отключены. И учитывая, что данные в БД в целом и так сами по себе довольно фрагментированы, относительно запросов к ним, то COW далеко не так страшен. Особенно, если вы адаптируете размеры блоков ФС к блокам БД или наоборот.

Насчёт softraid5 — размер блока у ZFS по умолчанию 128Кб, у softraid5, если не ошибаюсь 32Кб. При случайной записи ZFS будет ~4 раза медленней просто из-за отсутствия адаптации к рабочей нагрузке, без относительно её собственных характеристик. Выше, вы кстати жаловались на рост латентности в 4 раза. У большинства аппаратных RAID дефолтный размер stripe блока тоже 32 Кб.

Если что, то на серверах СУБД у нас XFS и я не агитирую там использовать ZFS, но сравнение у вас действительно некорректно.

Если не использовать дедупликацию и компрессию, то что остается от ZFS? Журналирование всего и удобные снапшоты? Ну так и XFS и btrfs тоже их имеют. Опять-таки, все три (ZFS/XFC/btrfs) всё равно проигрывают ext4 в iops и скорости записи (при прочих равных) — даже без дедупликации и компрессии.


Вот только что провел эксперимент для наглядности — создал в памяти pool (zpool create tank /dev/shm/zps, zps размером 16GB, без компрессии и дедупликации) и тупо писал на него нули:


# time -p dd if=/dev/zero of=/zfs/nulls oflag=direct bs=1M status=progress count=8192
8264876032 bytes (8.3 GB, 7.7 GiB) copied, 15 s, 551 MB/s
8192+0 records in
8192+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 15.6483 s, 549 MB/s

Это память. Просто память — и всего 549 MB/s? При этом всё время проц был нагружен на 50%, если учесть что это Core i7-6700 то де-факто все четыре ядра были использованы на 100%.


А теперь с ext4 (тот же файл что и для пула но уже с ext4):


# time -p dd if=/dev/zero of=/zfs/nulls oflag=direct bs=1M status=progress count=8192
6994001920 bytes (7.0 GB, 6.5 GiB) copied, 2 s, 3.5 GB/s
8192+0 records in
8192+0 records out
8589934592 bytes (8.6 GB, 8.0 GiB) copied, 2.44143 s, 3.5 GB/s

Как говорится, почувствуйте разницу — и это банальная последовательная запись.


Думаете, с дисками будет иначе? Особенно если это NVMe? Вы потеряете существенную долю их производительности, а в случае HDD RAIDZ — скорее всего тоже, да ещё и проц будет нагружен — то есть меньше чем на 8 ядер это вообще ставить стрёмно.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий