Solaris 11: ZFS Self Healing
O ZFS possui a capacidade de self healing, ou seja, auto correção. Quando outro Volume Manager espalharia uma possível corupção de dados, ele faz o contrário.
Para testar esta capacidade no pool test, primeiro verificamos que não há erros.
ricardo@solaris:~$ sudo zpool list
Password:
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
rpool 99.5G 22.5G 77.0G 22% 1.00x ONLINE -
test 9.94G 1.28G 8.66G 12% 4.18x ONLINE -
ricardo@solaris:~$ sudo zpool status test
pool: test
state: ONLINE
scan: resilvered 1.28G in 0h9m with 0 errors on Wed May 9 09:12:50 2012
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c3t3d0 ONLINE 0 0 0
c3t2d0 ONLINE 0 0 0
errors: No known data errors
Agora vamos criar um arquivo extra para testes, e verificar sua integridade.
ricardo@solaris:/test$ mkfile 1g /test/ArquivoTeste
ricardo@solaris:/test$ md5sum /test/ArquivoTeste > /test/ArquivoTeste.md5
ricardo@solaris:/test$ md5sum --check /test/ArquivoTeste.md5
/test/ArquivoTeste: OK
ricardo@solaris:/test$ ls -lh /test/
total 2097435
-rw------- 1 ricardo staff 1.0G May 9 09:49 ArquivoTeste
-rw-r--r-- 1 ricardo staff 53 May 9 09:49 ArquivoTeste.md5
drwxr-xr-x 3 ricardo staff 3 May 7 06:13 Docs01
drwxr-xr-x 3 ricardo staff 3 May 7 06:16 Docs02
drwxr-xr-x 3 ricardo staff 3 May 7 06:22 Docs03
drwxr-xr-x 3 ricardo staff 3 May 7 06:38 Docs04
ricardo@solaris:/test$ df -h /test/
Filesystem Size Used Available Capacity Mounted on
test 15G 6.2G 8.4G 43% /test
Agora vamos causar diversas corrupções em um dos discos, com o comando dd.
Fiz três gravações de dados aleatórios no disco, uma de 1MB, outra de 10MB, e depois uma de 100MB.
ricardo@solaris:/test$ sudo dd if=/dev/urandom of=/dev/dsk/c3t3d0 bs=1024 count=1024
Password:
1024+0 records in
1024+0 records out
ricardo@solaris:/test$ sudo dd if=/dev/urandom of=/dev/dsk/c3t3d0 bs=1024 count=10240
10240+0 records in
10240+0 records out
ricardo@solaris:/test$ sudo dd if=/dev/urandom of=/dev/dsk/c3t3d0 bs=1024 count=102400
102400+0 records in
102400+0 records out
Agora verificamos o estado do pool, e continua tudo em ordem.
ricardo@solaris:/test$ zpool status test
pool: test
state: ONLINE
scan: resilvered 1.28G in 0h9m with 0 errors on Wed May 9 09:12:50 2012
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c3t3d0 ONLINE 0 0 0
c3t2d0 ONLINE 0 0 0
errors: No known data errors
Como o ZFS faz um grande uso de cache em memória, acho que ele não detectou ainda a corrupção feita diretamente no disco físico. Vamos então desmontar e montar o pool, e refazer a verificação.
ricardo@solaris:/test$ sudo zpool export test
cannot unmount '/test': Device busy
ricardo@solaris:/test$ cd
ricardo@solaris:~$ sudo zpool export test
ricardo@solaris:~$ sudo zpool import test
ricardo@solaris:~$ zpool status test
pool: test
state: ONLINE
status: One or more devices has experienced an unrecoverable error. An attempt was made to correct the error. Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
using 'zpool clear' or replace the device with 'zpool replace'.
see: http://www.sun.com/msg/ZFS-8000-9P
scan: resilvered 1.28G in 0h9m with 0 errors on Wed May 9 09:12:50 2012
config:
NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c3t3d0 ONLINE 0 0 7
c3t2d0 ONLINE 0 0 0
errors: No known data errors
Agora sim o ZFS acusou o erro, mas como ele mesmo informa, foi feita uma tentativa de corrigir o erro, e aplicações não foram afetadas. Adicionalmente, o comando informa que deve ser melhor trocar o disco (ele não sabe que eu fiz o dd).
Conferindo a integridade do arquivo de teste, realmente ele continua ok.
ricardo@solaris:~$ ls -lh /test
total 2097435
-rw------- 1 ricardo staff 1.0G May 9 09:49 ArquivoTeste
-rw-r--r-- 1 ricardo staff 53 May 9 09:49 ArquivoTeste.md5
drwxr-xr-x 3 ricardo staff 3 May 7 06:13 Docs01
drwxr-xr-x 3 ricardo staff 3 May 7 06:16 Docs02
drwxr-xr-x 3 ricardo staff 3 May 7 06:22 Docs03
drwxr-xr-x 3 ricardo staff 3 May 7 06:38 Docs04
ricardo@solaris:~$ md5sum --check /test/ArquivoTeste.md5
/test/ArquivoTeste: OK
ricardo@solaris:~$