Настраиваем блочную дедупликацию на Synology
Предостережение:
На момент подготовки статьи, дедупликация данных не являлась встроенной функцией NAS-серверов Synology. Желая включить эту недокументированную опцию, вы действуете на свой страх и риск. Ни Synology, ни тем более HWP не несут ответственности за последствия, связанные с использованием инструкций, данных в этой статье.
Что потребуется:
- NAS Synology с DSM 6.1 или выше
- Раздел с файловой системой BTRF
- Возможность установки Docker из центра пакетов Synology
Пока вы делаете бэкапы перед тем, как приступить, немного теории, совсем чуть-чуть и общими словами.
Btrfs - ключ к блочной дедупликации
Если вы запишете на NAS в 10 папок 10 файлов windows.iso размером по 3 Гб, то вы займете 30 Гб свободного места. Обычная дедупликация способна выявить повторяющиеся файлы и показать вам, что их можно удалить, у Synology есть эта функция в пакете "анализатор хранения", но это - прошлый век. Блочная дедупликация сканирует каждый файл в поисках повторяющихся блоков (экстентов), и если находит в разных файлах идентичные блоки, то в одном из них она производит удаление дубля экстента, заменяя его ссылкой на такой же экстент в другом файле. Совсем грубо это выглядит так: допустим, есть 10 архивов, в каждом из которых лежит dx.dll, так вот из 9 архивов содержимое файла dx.dll будет удалено и заменено на ссылку, отправляющую к 10-му архиву, где этот файл сохранился. Конечно, на самом деле этот процесс куда более сложный, но смысл все равно остается тем же - ссылка на dx.dll, например, занимает 128 байт, а сам dx.dll - 300 мегабайт. Проведя дедупликацию, мы сэкономим 2700 мегабайт из 3000, и при этом все файлы останутся на месте, их можно копировать, открывать и удалять независимо друг от друга. При записи на другой носитель, например на компьютер, дедуплицированные данные снова займут 3000 мегабайт, так что экономим мы место только внутри NAS-а.

Современные NAS-ы Synology поддерживают файловую систему Btrfs, в которой вот такие "ссылки" на экстенты - есть основа всего, поэтому ядро операционной системы, умеющее работать с Btrfs поддерживает функцию дедупликации само по себе, без лишних инструментов. Но Btrfs сама не умеет проводить дедупликацию, как например ZFS, ни на лету, ни как-то иначе. Файловой системе нужно, чтобы кто-то просмотрел все файлы, нашел в них повторяющиеся блоки и указал, что их можно удалить, заменяя ссылками. Для этой цели существуют несколько программ, одна из которых - duperemove.
Поскольку поддержка Btrfs встроена в ядро операционных систем Synology DSM 6.x, то нам не важно, что в самой Synology DSM нет инструмента дедупликации, ведь все что нам нужно - это сообщить файловой системе, где лежат повторяющиеся блоки данных внутри файлов, а дальше Synology DSM все сделает сама.

Как вы уже поняли, раздел данных на вашем NAS-е должен иметь файловую систему Btrfs, а не EXT4.
Docker - ключ к duperemove
Начиная с версии DSM 6.x, компания Synology значительно усложнила написание и подготовку стороннего софта для запуска из-под своей ОС, мотивируя так: "хотите ставить софт - используйте Docker или виртуализацию" (см. нашу статью про гипервизор Synology). В принципе, это правильный шаг, гарантирующий целостность операционки. Гипервизор Synology Virtual Machine Manager не даст нам прямого доступа к файловой системе, а вот контейнерная виртуализация - даст. Поэтому мы будем использовать пакет Docker, внутри которого создадим контейнер и загрузим туда программу duperemove.
Установка Docker и образа Debian
Убедившись, что у вас на NAS-е файловая система Btrfs, открываем "Пуск - центр пакетов", листаем вниз и инсталлируем Docker.
Запускаем Docker и во вкладке "Реестр" выбираем образ debian:latest. Мы будем использовать именно этот образ, хотя точно так же должно работать и в Ubuntu и в Centos.
Переходим на вкладку "Образ", жмем "Запустить" - наш контейнер запущен. Останавливаем его, кликая на выключатель справа.
Выделив контейнер Debian1, жмем кнопку "Настройки". Нам надо предоставить контейнеру полный доступ к DSM, поэтому выбираем эту галочку, после чего настраиваем ограничение ресурсов. По умолчанию duperemove использует все ядра процессоров и может скушать всю память, доступную в системе. Сам процесс дедупликации очень ресурсоемкий и долгий, поэтому лучше ограничить ресурсы контейнеру, выделив не более половины ядер CPU и около половины используемого объема ОЗУ. Когда дедупликация закончится, все лишние данные из памяти будут удалены. Это вам не ZFS, тут хранить таблицы экстентов в памяти не нужно.
По умолчанию наш контейнер не видит файлы и директории, которые хранятся на NAS-е, и надо "пробросить" физические каталоги в его виртуальную среду. Жмем кнопку "дополнительные настройки", переходим в закладку "Том" и жмем кнопку "Добавить папку". Выбираем нужную нам папку, это может быть как корневая, так и любая вложенная, жмем "OK" и вводим путь внутри контейнера, куда будет смонтирована папка NAS-а, пусть это будет /tmp/hwp_vmware. Если нужно добавить несколько папок NAS-а, повторяем этот шаг несколько раз.
Вообще, как я говорил, дедупликация в Btrfs- очень тяжелый для системы процесс, поэтому имеет смысл проводить её выборочно, например только для папки с образами виртуальных машин или другими дублирующимися данными. Причем, лучше сделать несколько копий контейнера для разных папок и запускать, например, каждый из них отдельно по расписанию (как настроить запуск контейнеров по расписанию - ищите в гугле), а мы идем дальше.
Запускаем наш контейнер, нажав на выключатель справа. Нажимаем кнопку "Сведения", открывается новое окно. Нажимаем "Терминал", и чуть подождав, попадаем в интерфейс командной строки. У нас совершенно "голый" debian, в котором нет даже доступа по SSH, поэтому лучше и быстрее один раз ввести длинный URL с клавиатуры, чем пробрасывать порты внутрь контейнера и заходить из терминальной программы.
Заходим в папку, /tmp
cd /tmp
Включаем права root и устанавливаем wget
su
apt-get update
apt-get install wget nano
Update: программа Duperemove была включена в тестовый репозиторий buster, поэтому подключаем его.
nano /etc/apt/sources.list
добавляем в конец
deb http://deb.debian.org/debian buster main
apt-get update
apt-get install duperemove
Все, теперь все что нужно - у нас есть, пришло время запустить дедупликацию!
duperemove -rdh --hashfile=hwp_hash /hwp_vmware
, где
- -r - ходить по каталогам внутри (рекурсивно)
- -d - произвести дедупликацию
- -h - вывести отчет на человеческом языке
- --hashfile=hwp_hash - файл в котором будут храниться хэши на время дедупликации. Если его не указать, все хэши будут храниться в ОЗУ и это может привести к переполнению памяти и ошибке программы. По окончанию процесса, этот файл автоматически будет удален. На время процедуры он лежит в папке /tmp
- ./hwp_vmware - путь к смонтированному каталогу внутри контейнера, который ведет в каталог на NAS-е
Процесс дедупликации очень долгий - на процессорах серии Celeron он может занимать несколько дней или даже недель для папки объемом в 1 Тб. Сначала программа создаст набор хэшей для экстентов каждого файла внутри смонтированного каталога, а потом начнет удалять их из самих файлов. Если процесс прервать, придется начинать с самого начала. В случае если во время дедупликции сервер будет выключен (пропадет электричество или все повиснет) - после перезагрузки ничего не должно сломаться. Мы проверяли это 3 раза во время тестирования - данные были целы.
Файловая дедупликация
Один из более быстрых вариантов - файловая дедупликация. В отличии от блочной, она работает целиком с файлами, и если находит два одинаковых - один как бы удаляет, указывая файловой системе, что его содержимое можно взять по другому адресу. Для пользователя этот процесс никак не заметен - у вас по-прежнему будут доступны все одинаковые файлы, только места они будут занимать как один оригинал. Это гораздо менее ресурсоемкий процесс, но и не такой эффективный, как блочная дедупликация, но при наличии первой, вторая не требуется. Давайте вернемся в наш контейнер и запустим файловую дедупликацию. Открываем контейнер и заходим в терминал, как показано ранее.
Устанавливаем программу fdupes, которая составляет список дублирующихся файлов
apt-get install fdupes
Теперь запускаем поиск и дедупликацию в нашей папке, как в примере выше
fdupes -r -S ./hwp_vmware | duperemove --fdupes
Аналогично, программа пройдет по всем файлам указанного каталога, создаст для них хэши и попросит программу duperemove сообщить файловой системе о наличии дубликатов и провести очистку.
Ну что, давайте протестируем как оно работает?
Результаты тестирования
Мы записали в тестовую папку 397 Гб образов виртуальных машин, создав 6 копий одинаковых данных и положили туда же обычную папку с инсталляционными файлами различных программ и игр. До начала дедупликации на томе было 1.69 Гб свободных данных и 397 Гб тестовых образов (на скриншоте ниже видно, что файлы занимают 381 Гб, так как используется сжатие на уровне файловой системы Btrfs).
Файловая дедупликация обрадовала своей скоростью - уже через 5 часов на диске было 1.9 Тб свободного места, а занятое пространство сократилось до 175 Гб.
Блочную дедупликацию на том же объеме провести не удалось - за сутки работы программы из 785 000 экстентов обработаны было всего 1200, расчеты на коленках показали, что тест на таком объеме будет идти два года, и возможно более быстрый процессор решил бы нашу задачу. На тестовом объеме в 1 Гб, удалось добиться той же точной дедупликации, что и в файловом методе. Естественно, в реальной жизни эффективность может быть другой, как выше, так и ниже. Что неприятно, так это невозможность прервать работу Duperemove; какие-то экстенты она отрабатывает за считанные секунды, а на какие-то тратит часы. И пока программа обрабатывает экстент, остановить или перезапустить контейнер не получится. В нашей тестовой машине использовался 2-ядерный процессор Celeron J3355, и возможно на топовых NAS-ах Synology с Xeon-ами, блочная дедупликация больших объемов данных будет проходить за считанные дни или часы.
Заключение
Если вы знакомы с контейнерами, то сможете настроить автоматический запуск дедупликации по расписанию, не дожидаясь, пока Synology введет поддержку этой функции в DSM. Как уже было сказано выше, имеет смысл сделать отдельные контейнеры для отдельных папок и запускать их по очереди. Я тестировал работу блочной дедупликации на чистом Linux-е без контейнеров, и там этот процесс занимал на точно таком же процессоре всего несколько часов. Видимо, Docker является слишком толстой прослойкой, поглощающей ресурсы CPU.
Дедупликация не работает на зашифрованных папках.
Да, конечно Btrfs - это не ZFS, где дедупликация происходит на лету во время записи данных на диск. Но если достичь в DSM той же производительности, что на Debian 9, то можно проводить этот процесс еженедельно или по ночам, получая тот же эффект экономии, который дает ZFS.