четверг, 10 сентября 2009 г.

Резервирование и восстановление ZFS III

Во вчерашней статье мы восстанавливали датасет ZFS из архивированного стрима, неожиданно натанцевались с кучей команд - снапшоты, клоны, promote, переименования... А как быть, когда мы хотим восстановить целый ZFS-пул, зарезервированный нашим скриптом zfs_backup.sh?

Итак, вообразим себе гипотетический случай. У нас есть пул data сложной структуры, живущий на отдельном диске/слайсе:

server5# zfs list
NAME USED AVAIL REFER MOUNTPOINT
data 270M 19.3G 70.0M /data
data/work1 100M 19.3G 19K /data/work1
data/work1/user1 100M 19.3G 100M /data/work1/user1
data/work2 100M 19.3G 19K /data/work2
data/work2/user2 100M 19.3G 100M /data/work2/user2
rpool 14.6G 12.7G 93K /rpool
rpool/ROOT 6.60G 12.7G 18K legacy
rpool/ROOT/zfsroot 6.60G 12.7G 6.50G /
rpool/ROOT/zfsroot/var 100M 12.7G 100M /var
rpool/dump 4.00G 12.7G 4.00G -
rpool/export 117K 12.7G 20K /export
rpool/export/home 97K 12.7G 97K /export/home
rpool/swap 4G 16.6G 130M -

server5# ls -al /test
total 781
drwxr-xr-x 2 root root 3 Sep 10 11:40 .
drwxr-xr-x 26 root root 34 Sep 10 11:41 ..
-rw-r--r-- 1 root root 280588 Sep 10 11:40 server5.data.0.zfs.gz
server5# ls -al /data
total 143424
drwxr-xr-x 4 root root 6 Sep 10 11:42 .
drwxr-xr-x 26 root root 34 Sep 10 11:41 ..
-rw------T 1 root root 20971520 Sep 10 11:42 file1_1.data.test
-rw------T 1 root root 52428800 Sep 10 11:39 file1.data.test
drwxr-xr-x 3 root root 3 Sep 10 11:38 work1
drwxr-xr-x 3 root root 3 Sep 10 11:38 work2
server5# ls -al /data/work1/user1
total 204863
drwxr-xr-x 2 root root 3 Sep 10 11:39 .
drwxr-xr-x 3 root root 3 Sep 10 11:38 ..
-rw------T 1 root root 104857600 Sep 10 11:39 file2.data.work1.user1.test
server5# ls -al /data/work2/user2
total 204863
drwxr-xr-x 2 root root 3 Sep 10 11:39 .
drwxr-xr-x 3 root root 3 Sep 10 11:38 ..
-rw------T 1 root root 104857600 Sep 10 11:39 file3.data.work2.user2.test

Допустим, мы его потеряли, причем вместе с диском. У нас есть архив server5.data.0.zfs.gz всего пула. И мы хотели бы восстановить весь пул, со всем содержимым, причем, по-возможности, сделать это попроще.

Давайте сначала приговорим наш существующий пул:

server5# zpool destroy data

server5# zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 14.6G 12.7G 93K /rpool
rpool/ROOT 6.60G 12.7G 18K legacy
rpool/ROOT/zfsroot 6.60G 12.7G 6.50G /
rpool/ROOT/zfsroot/var 100M 12.7G 100M /var
rpool/dump 4.00G 12.7G 4.00G -
rpool/export 117K 12.7G 20K /export
rpool/export/home 97K 12.7G 97K /export/home
rpool/swap 4G 16.6G 130M -

server5# zpool create data c0t0d0s6

server5# zpool status data
pool: data
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
data ONLINE 0 0 0
c0t0d0s6 ONLINE 0 0 0

errors: No known data errors

server5# zfs list
NAME USED AVAIL REFER MOUNTPOINT
data 89.5K 19.6G 1K /data
rpool 14.6G 12.7G 93K /rpool
rpool/ROOT 6.60G 12.7G 18K legacy
rpool/ROOT/zfsroot 6.60G 12.7G 6.50G /
rpool/ROOT/zfsroot/var 100M 12.7G 100M /var
rpool/dump 4.00G 12.7G 4.00G -
rpool/export 117K 12.7G 20K /export
rpool/export/home 97K 12.7G 97K /export/home
rpool/swap 4G 16.6G 130M -

Восстанавливаем содержимое пула:

server5# gzcat server5.data.0.zfs.gz | zfs receive -vdF data
receiving full stream of data@snapshot into data@snapshot
received 50.1MB stream in 2 seconds (25.1MB/sec)
receiving full stream of data/work2@snapshot into data/work2@snapshot
received 15.0KB stream in 1 seconds (15.0KB/sec)
receiving full stream of data/work2/user2@snapshot into data/work2/user2@snapshot
received 100MB stream in 3 seconds (33.4MB/sec)
receiving full stream of data/work1@snapshot into data/work1@snapshot
received 15.0KB stream in 1 seconds (15.0KB/sec)
receiving full stream of data/work1/user1@snapshot into data/work1/user1@snapshot
received 100MB stream in 3 seconds (33.4MB/sec)

server5# zfs destroy -r data@snapshot

Все? Кажется, действительно все. Проверяем:

server5# zfs list
NAME USED AVAIL REFER MOUNTPOINT
data 250M 19.3G 50.0M /data
data/work1 100M 19.3G 19K /data/work1
data/work1/user1 100M 19.3G 100M /data/work1/user1
data/work2 100M 19.3G 19K /data/work2
data/work2/user2 100M 19.3G 100M /data/work2/user2
rpool 14.6G 12.7G 93K /rpool
rpool/ROOT 6.60G 12.7G 18K legacy
rpool/ROOT/zfsroot 6.60G 12.7G 6.50G /
rpool/ROOT/zfsroot/var 100M 12.7G 100M /var
rpool/dump 4.00G 12.7G 4.00G -
rpool/export 117K 12.7G 20K /export
rpool/export/home 97K 12.7G 97K /export/home
rpool/swap 4G 16.6G 130M -
server5#

server5# ls -al /data
total 102447
drwxr-xr-x 4 root root 5 Sep 10 11:39 .
drwxr-xr-x 26 root root 34 Sep 10 11:47 ..
-rw------T 1 root root 52428800 Sep 10 11:39 file1.data.test
drwxr-xr-x 3 root root 3 Sep 10 11:38 work1
drwxr-xr-x 3 root root 3 Sep 10 11:38 work2

Вуаля. "Реконструкция завершена."

Как видите, восстанавливать пулы целиком не просто - а очень просто. Всего в два действия (создание пула заново и прием в него снапшотов из бэкапа).

PS. Суть такого приема в том, что при восстановлении снапшотов на самый верхний уровень иерархии - в ZFS-пул - никаких фокусов с клонированием и переименованием по-сути не нужно. Операция receive на уровне пула выполняется как рекурсивное клонирование с одновременным переименованием всех снапшотов стрима. Причем восстановление (прием снапшотов) может выполняться как в пустой пул, так и в пул с данными (не уничтоженный), при этом данные на диске будут перезаписаны.