Я подумываю переместить свои личные домашние данные в ZFS на ПК Debian, чтобы воспользоваться такими функциями ZFS, как целостность данных и контрольные суммы, дедупликация и снимки. Коробка должна быть чем-то большим, чем просто NAS, поэтому я не заинтересован в том, чтобы посвящать ее чему-то вроде FreeNAS.
При этом я также думаю о том, как собирать резервные копии данных каждую ночь и периодически переносить их за пределы сайта. Моя текущая настройка описана позже в этом посте. Буду признателен за все плюсы и минусы третьего подхода, описанного ниже для резервных копий.
(1) Поскольку я новичок в ZFS и незнаком с ней, я подумываю воспроизвести ее безопасно, поместив свои текущие данные в пулы ZFS, но продолжая использовать Dirvish для резервного копирования этих данных на диск для резервного копирования, отличного от ZFS.
(2) Я также узнал о настройке заданий cron для периодических снимков, которые могут быть такими же частыми, как ежечасные снимки, поэтому я подумал о том, чтобы настроить накопитель данных в режиме реального времени, делая ежечасные или ежедневные снимки, а затем отправлять / получать на резервный диск, который также отформатирован для ZFS.
(3) Наконец, недавно меня поразило, что мне может не понадобиться делать что-либо такое сложное с ZFS. Что если я настрою два моих диска в конфигурации зеркального отображения vdev, аналогичной RAID1, а затем настрою ежечасные снимки? Таким образом, кажется, у меня была бы мгновенная резервная копия, и я защищен от страшного RAID-is-not-a-backup:
/bin/rm -Rf /*
В # 3, если один из дисков выйдет из строя, у меня есть зеркало, чтобы продолжить. Как я упоминаю ниже, я могу жить без высокой доступности RAID, но в этом случае, похоже, я получаю его бесплатно.
Единственное, что меня беспокоит, это мой автономный дисковод, описанный ниже. Будет ли проблемой периодически поворачивать один зеркальный диск с запасным, срок службы которого несколько недель или месяцев?
Что касается моей текущей настройки, я в настоящее время храню все на коробке Ubuntu, вероятно, в обычном разделе ext3. Я больше не использую RAID; У меня нет личной потребности в высокой доступности; если что-то пойдет не так, я могу позволить себе время на восстановление из резервной копии.
Я использую Dirvish для резервного копирования моих данных, ноутбука и всего остального, имеющего ценность каждую ночь, с моментальными снимками, которые возвращаются примерно через два месяца.
Периодически я чередую резервные диски, чтобы перевести их в автономный режим и в автономный режим. Если я потеряю основной диск и накопитель для резервного копирования в реальном времени, по крайней мере, у меня все еще будет внешний диск, даже если ему несколько недель.
Я не рассматриваю поддержку множества дисков; Я бы предпочел иметь один диск для всех данных и еще один диск для всей резервной копии. Это позволяет мне периодически поворачивать один резервный диск вне сайта с подключенным резервным диском.
Благодарю.
РЕДАКТИРОВАТЬ: я дал jlliagre № 2 попробовать на виртуальной машине под управлением Debian с ZFS на Linux, установленной с помощью команд, описанных здесь:
http://www.bsdnow.tv/tutorials/zfs
Я начал с создания трех файлов для имитации моих трех дисков:
# cd /mnt/sda3
# truncate -s 2G primary
# truncate -s 2G rotating_mirror1
# truncate -s 2G rotating_mirror2
Как уже говорилось, я создал зеркальный пул, используя только один из файлов зеркал:
# zpool create mypool mirror /mnt/sda3/primary /mnt/sda3/rotating_mirror1
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
mypool 106K 1.95G 30K /mypool
# zpool status -v mypool
pool: mypool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
mypool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
/mnt/sda3/primary ONLINE 0 0 0
/mnt/sda3/rotating_mirror1 ONLINE 0 0 0
errors: No known data errors
Затем я попытался настроить автоматические снимки, используя скрипт, указанный здесь:
http://alblue.bandlem.com/2008/11/crontab-generated-zfs-snapshots.html
Я создал файл crontab для root:
# crontab -e
Я вставил и изменил следующее по ссылке выше. Я не эксперт по хронам, поэтому мне интересно, есть ли какое-либо условие гонки в этом:
@reboot /sbin/zpool scrub mypool
@daily /sbin/zpool scrub mypool
@hourly /sbin/zpool status mypool | /bin/egrep -q "scrub completed|none requested" && /sbin/zfs snapshot -r mypool@AutoH-`date +"\%FT\%H:\%M"`
@daily /sbin/zfs snapshot -r mypool@AutoD-`date +"\%F"`
@weekly /sbin/zfs snapshot -r mypool@AutoW-`date +"\%Y-\%U"`
@monthly /sbin/zfs snapshot -r mypool@AutoM-`date +"\%Y-\%m"`
@yearly /sbin/zfs snapshot -r mypool@AutoY-`date +"\%Y"`
# do a spot of housecleaning - somewhat assumes the daily ones have run ..
@hourly /sbin/zpool status mypool | /bin/egrep -q "scrub completed|none requested" && /sbin/zfs list -t snapshot -o name | /bin/grep mypool@AutoH- | /usr/bin/sort -r | /usr/bin/tail -n +26 | /usr/bin/xargs -n 1 /sbin/zfs destroy -r
@daily /sbin/zfs list -t snapshot -o name | /bin/grep mypool@AutoD- | /usr/bin/sort -r | /usr/bin/tail -n +9 | /usr/bin/xargs -n 1 /sbin/zfs destroy -r
@weekly /sbin/zfs list -t snapshot -o name | /bin/grep mypool@AutoW- | /usr/bin/sort -r | /usr/bin/tail -n +7 | /usr/bin/xargs -n 1 /sbin/zfs destroy -r
@monthly /sbin/zfs list -t snapshot -o name | /bin/grep mypool@AutoM- | /usr/bin/sort -r | /usr/bin/tail -n +14 | /usr/bin/xargs -n 1 /sbin/zfs destroy -r
Я не думаю, что это принесет мне мои двухмесячные резервные копии, но это начало.
В этот момент я начал играть с примера в первой ссылке, чтобы создать файл, создать моментальный снимок, а затем изменить файл.
Продолжая рекомендацию jlliagre, я хотел поменять местами Swing_mirror1 и заменить на Swing_Mirror2. (В реальной коробке я хотел бы выключить питание коробки, чтобы удалить диск SATA mirror1, чтобы заменить его на диск mirror2.)
# zpool split mypool mypool_bak /mnt/sda3/rotating_mirror1
# zpool status
pool: mypool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
mypool ONLINE 0 0 0
/mnt/sda3/primary ONLINE 0 0 0
errors: No known data errors
В этот момент у меня возникли проблемы; Я не мог ни импортировать mypool_bak, ни делать что-либо еще с вращением_mirror1. В итоге я попытался создать mypool_bak, увидел, что там ничего не было, уничтожил его, а затем прикрепил вращающийся_mirror1 обратно к основному.
# zpool create -f mypool_bak /mnt/sda3/rotating_mirror1
# zpool destroy mypool_bak
# zpool attach mypool /mnt/sda3/primary /mnt/sda3/rotating_mirror1
Я просто предполагаю, что вращающийся_миррор1 в этот момент синхронизирован с любыми изменениями в основной.
Я попытался снова разделить:
# zpool split mypool mypool2 /mnt/sda3/rotating_mirror1
Опять та же проблема, поэтому я снова подключил:
# zpool attach -f mypool /mnt/sda3/primary /mnt/sda3/rotating_mirror1
Пробовал снова с опцией -R. Похоже, это сработало лучше:
# zpool split -R /mypool2a mypool mypool2 /mnt/sda3/rotating_mirror1
# ls /mypool2a/mypool2/
file1.txt file2.txt file3.txt somefile
# zpool status
pool: mypool
state: ONLINE
scan: resilvered 566K in 0h0m with 0 errors on Wed Dec 3 00:18:28 2014
config:
NAME STATE READ WRITE CKSUM
mypool ONLINE 0 0 0
/mnt/sda3/primary ONLINE 0 0 0
errors: No known data errors
pool: mypool2
state: ONLINE
scan: resilvered 566K in 0h0m with 0 errors on Wed Dec 3 00:18:28 2014
config:
NAME STATE READ WRITE CKSUM
mypool2 ONLINE 0 0 0
/mnt/sda3/rotating_mirror1 ONLINE 0 0 0
errors: No known data errors
Следующий:
# zpool export mypool2
# rmdir /mypool2a
Похоже, теперь я должен быть в состоянии ввести вращение_mirror2:
# zpool attach mypool /mnt/sda3/primary /mnt/sda3/rotating_mirror2
# zpool status
pool: mypool
state: ONLINE
scan: resilvered 524K in 0h0m with 0 errors on Wed Dec 3 00:25:36 2014
config:
NAME STATE READ WRITE CKSUM
mypool ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
/mnt/sda3/primary ONLINE 0 0 0
/mnt/sda3/rotating_mirror2 ONLINE 0 0 0
errors: No known data errors
К этому моменту я создал еще пару файлов и снимков, чтобы имитировать использование дисков с течением времени.
Теперь я хотел удалить вращающийся_миррор2, но пока не хотел возвращать вращающий_миррор1.
# zpool split -R /mypool2a mypool mypool2 /mnt/sda3/rotating_mirror2
# zpool export mypool2
# rmdir /mypool2a
Я бы предположил, что если я попытаюсь вернуть вращающийся_миррор1 обратно в этот момент, все его содержимое будет уничтожено, а текущий первичный объект будет зеркально отображен на вращающемся_миррор1.
Что, если вместо этого основной ресурс вышел из строя и его нужно было восстановить из вращающейся_миррор1 на этом этапе? Как я могу использовать вращение_mirror1, чтобы перестроить основной?
# zpool destroy mypool
# zpool import -d /mnt/sda3/ -N mypool2 mypool
# zpool status
pool: mypool
state: ONLINE
scan: resilvered 524K in 0h0m with 0 errors on Wed Dec 3 00:25:36 2014
config:
NAME STATE READ WRITE CKSUM
mypool ONLINE 0 0 0
/mnt/sda3/rotating_mirror1 ONLINE 0 0 0
errors: No known data errors
# zfs set mountpoint=/mypool mypool
# ls /mypool
Смешной. На этом этапе я бы ожидал увидеть файлы, которые у меня были на первом зеркале, но вместо этого я ничего не вижу.
РЕДАКТИРОВАТЬ: я перезапустил шаги снова и сделал несколько незначительных изменений, теперь я знаю немного больше. Я не сделал все шаги ниже, но они все здесь для полноты. Я думаю, что получил это на этот раз.
# cd /mnt/sda3
# truncate -s 2G primary
# truncate -s 2G rotating_mirror1
# truncate -s 2G rotating_mirror2
# zpool create mypool mirror /mnt/sda3/primary /mnt/sda3/rotating_mirror1
# crontab -e
# echo (Paste crontab snippet from above.)
Используйте бассейн.
# echo QUESTION Should a snapshot be created here?
# zpool split -R /mypool2 mypool mypool2 /mnt/sda3/rotating_mirror1
# zpool export mypool2
# rmdir /mypool2
# zpool attach mypool /mnt/sda3/primary /mnt/sda3/rotating_mirror2
Используйте бассейн еще немного.
# echo QUESTION Should a snapshot be created here?
# zpool split -R /mypool2 mypool mypool2 /mnt/sda3/rotating_mirror2
# zpool export mypool2
# rmdir /mypool2
Сделайте что-нибудь достаточно плохое, чтобы восстановить его.
# echo QUESTION Should a backup of rotating_mirror2 be made prior to restoration in case something bad happens, or is there any way to bring in its contents read-only?
# zpool export mypool
# zpool import -d /mnt/sda3/ mypool2 mypool
# zpool attach mypool /mnt/sda3/rotating_mirror2 /mnt/sda3/primary
Обратите внимание, что после выполнения команды импорта и первичное, и вращающееся_миррор2 имеют одинаковое имя для пула, поэтому любые последующие команды импорта в этом примере не будут работать, как указано выше. Вместо этого пул необходимо будет импортировать по числовому идентификатору:
# zpool import -d /mnt/sda3/
pool: mypool
id: 17080681945292377797
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
mypool ONLINE
/mnt/sda3/rotating_mirror2 ONLINE
pool: mypool
id: 4810117573923218177
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
mypool ONLINE
/mnt/sda3/primary ONLINE
# zpool import -d /mnt/sda3/ 4810117573923218177
# zpool export mypool
# zpool import -d /mnt/sda3/ 17080681945292377797
Честно говоря, однако, это вызывает у меня некоторое грязное чувство, потому что импорт зеркала вызывает его изменение, так как его имя пула изменилось, и потому что оно теперь живое и может быть изменено, пока восстанавливается основной.
Я могу понять, что это нормально для зеркала, но помните, что я хочу рассматривать эти зеркала как живые резервные копии, когда они «подключены».
Я не пробовал это, но если нет никаких возражений, я думаю, что я бы предпочел не импортировать вращающий_миррор2, а вместо этого сделать что-то вроде:
# dd if=/mnt/sda3/rotating_mirror2 of=/mnt/sda3/primary bs=...
Когда это будет сделано, я надеюсь, что смогу импортировать основной файл напрямую, и все будут счастливы.
Последнее замечание: я узнал, что у меня может быть более одного зеркала, поэтому, если бы я действительно хотел, я мог бы установить четыре накопителя вместо трех, в которых два были бы всегда "живыми" "первичными" зеркалами друг друга, и вращающиеся_миррор1 и вращающиеся_миррор2 будет третий диск вместо второго диска.
Благодарю.