19 марта 2012 г.

ZFS на BACKUP1 - сервере хранения резервных копий завода.

ZFS - вещь.
Сегодня немного о проверке целостности и "очистке" (Scrub).

Для начала читаем Handbook, раздел,посвященный ZFS: http://www.freebsd.org/doc/ru/books/handbook/filesystems-zfs.html
Находим там пример:

19.2.2.4. Проверка данных

Как уже было сказано ранее, ZFS использует контрольные суммы для проверки целостности сохраненных данных. Подсчет и сохранение контрольных сумм включается автоматически во время создания файловых систем и может быть отключен при помощи команды:
# zfs set checksum=off storage/home
Отключение подсчета контрольных сумм -- не очень хорошая идея; особенно ввиду того, что они занимают мало места, а также при их использовании нет существенных расходов ресурсов системы. Пока подсчет включен, возможно выполнять проверки целостности данных ZFS, используя контрольные суммы. Этот процесс известен как ''очистка (scrubbing)''. Чтобы проверить целостность данных пула storage, выполните следующую команду:
# zpool scrub storage
Этот процесс может занять значительное время в зависимости от количества сохранённых данных. Очистка (scrubbing) порождает интенсивный ввод/вывод, поэтому только один экземпляр этой операции может выполняться в один момент времени. После завершения очистки (scrubbing) статус обновится, его можно просмотреть выполнив следующий запрос:
# zpool status storage
 pool: storage
 state: ONLINE
 scrub: scrub completed with 0 errors on Sat Aug 30 19:57:37 2008
config:

 NAME        STATE     READ WRITE CKSUM
 storage     ONLINE       0     0     0
   raidz1    ONLINE       0     0     0
     da0     ONLINE       0     0     0
     da1     ONLINE       0     0     0
     da2     ONLINE       0     0     0

errors: No known data errors
Время завершения отображается в простом виде в этом примере. Очистка помогает удостовериться в целостности данных на протяжении длительного времени.
В этом разделе была освещена лишь малая часть возможностей ZFS. За более подробной информацией обратитесь к страницам справочника zfs(8) и zpool(8).
И начинаем работу на сервере:
1. Смотрим,что у нас вообще за система, что накручено по zfs:

22:18 root@backup1 /usr/home/yakuzzza# uname -aFreeBSD backup1.frunze.local 8.2-RELEASE-p2 FreeBSD 8.2-RELEASE-p2 #1: Mon Sep  5 23:57:25 EEST 2011     
root@backup1.frunze.local:/usr/obj/usr/src/sys/HAMMER  amd64
22:18 root@backup1 /usr/home/yakuzzza# zpool listNAME      SIZE   USED  AVAIL    CAP  HEALTH  ALTROOTstorage  7.25T  4.45T  2.80T    61%  ONLINE  -
2.  Я, как будет видно из вывода команды zpool storage scrub запускал в воскресенье, но доработало оно все аж сегодня в 13:10 (простите бекапы за торможение выполнения, как будет показано дальше не зря я это делал и чуйка моя продолжает работать ;). Время выполнения 18 часов 11 минут на пуле RAIDZ из 4 дисков:
22:18 root@backup1 /usr/home/yakuzzza# zpool status  pool: storage state: ONLINE scrub: scrub completed after 18h11m with 0 errors on Mon Mar 19 13:10:02 2012config:
        NAME        STATE     READ WRITE CKSUM        storage     ONLINE       0     0     0          raidz1    ONLINE       0     0     0            aacd2   ONLINE       0     0     0            aacd3   ONLINE       0     0     0  85.5K repaired            aacd4   ONLINE       0     0     0            aacd5   ONLINE       0     0     0
errors: No known data errors
 Опля. Были проблемы. Ищем их. Находим по dmesg на проблемном диске aacd3. Попутно для поигрывания мышцами ищем что такое aacd - http://www.freebsd.org/doc/ru/books/handbook/disks-naming.html:

Диски RAID
aacd для Adaptec® AdvancedRAID, mlxd и mlyd для Mylex®, amrd для AMI MegaRAID®, idad для Compaq Smart RAID,twed для 3ware® RAID.
Ну и глянем на это чудо:
22:29 root@backup1 /usr/home/yakuzzza# grep Adaptec /var/run/dmesg.bootaac0: mem 0xdc200000-0xdc3fffff irq 16 at device 0.0 on pci1aac0: Adaptec 5805, aac driver 2.1.9-1
3. Так вот. Вернемся к нашему dmesg:
22:29 root@backup1 /usr/home/yakuzzza# dmesg | grep aacd3aacd3: on aac0aacd3: 1904630MB (3900682240 sectors)aacd3: hard error cmd=read 3536013824-3536013951aacd3: hard error cmd=read 3761425023-3761425085aacd3: hard error cmd=read 3536013851-3536014021
Ну то есть нашли проблемы, которые scrub исправил. Дальше будем следить за этим диском. 
Ну и еще момент. Идем по ссылке лучших практик по ZFS: http://www.solarisinternals.com/wiki/index.php/ZFS_Best_Practices_Guide
Находим кусок:
Run zpool scrub on a regular basis to identify data integrity problems. If you have consumer-quality drives, consider a weekly scrubbing schedule. If you have datacenter-quality drives, consider a monthly scrubbing schedule. You should also run a scrub prior to replacing devices or temporarily reducing a pool's redundancy to ensure that all devices are currently operational. 
Ну не SAS и не RAID Edition и не Enterprise SATA диски. Поэтому необходимо еще оставить работу для головы и наблюдательности: Когда запускать scrub по крону. Ведь активно переливаются бекапы и на выходных. Особенно делаются Full-бекапы систем. Это оставим на закуску в сегодняшнем выпуске.
Воистину RTFM.


Закуска.
Типа такого бекапа самой системы:

22:37 root@backup1 /usr/home/yakuzzza# grep dump /etc/crontab40      3       *       *       6       root    /root/scripts/dump.sh
22:37 root@backup1 /usr/home/yakuzzza# cat /root/scripts/dump.sh#!/bin/sh
data=`date '+20%y-%m-%d %H:%M'`backup="/storage/fs0/BACKUP_UNIX/BACKUP1/dump"root="/dev/ad10s1a"usr="/dev/ad10s1f"var="/dev/ad10s1d"
echo "$data NO Dumping SRC,ports,jails,obj,squid" >> $backup/$1-$2-$3-backup1.logchflags -R nodump /usr/srcchflags -R nodump /usr/portschflags -R nodump /usr/objchflags -R nodump /usr/local/squid
echo "$data Dumping $root - ROOT to $backup" >> $backup/backup1.logdump -0Lauf - $root  > $backup/dump_ad10s1a_root.imgecho "$data Dumping $usr - USR to $backup" >> $backup/backup1.logdump -0Lauf - $usr > $backup/dump_ad10s1f_usr.imgecho "$data Dumping $var - VAR to $backup" >> $backup/backup1.logdump -0Lauf - $var > $backup/dump_ad10s1d_var.imgecho "$data End dumping BACKUP1 server."

Скрипту много лет, рисовали еще вместе с Николаем.

Удачи.
Плюсуем в G+ и жду вопросов как всегда по почте a.yakimenko@gmail.com.

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