segunda-feira, 4 de maio de 2015

ZFS sobre volume iscsi (initiator com open-iscsi). ZVOL entregue sob iscsi (target com iscsitarget). Isto no novíssimo Debian Jessie.

Temos um storage que pensei em dar uma incrementada e prover uma solução de backup e preservação de dados utilizando ZFS. A ideia foi "por que não criar um pool ZFS em um volume do storage e entregar um ZVOL através de iscsi para uso, seja pelo servidor de arquivos ou XenServer?"

Como não posso atualizar o sistema operacional do storage, para isto precisaria de um host intermediário com duas interfaces de rede, uma ligada ao storage, outra para o initiator.

Neste host intermediário instalei o novíssimo Debian Jessie (https://www.debian.org/CD/http-ftp/#stable) e ZoL (http://zfsonlinux.org/debian.html).

Instalei os pacotes open-iscsi e iscsitarget. Depois disto foi só alterar alguns arquivos de configuração.

Logo depois de instalado o open-iscsi e antes dos comandos iscsiadm para descoberta de luns, alterei o arquivo /etc/iscsi/iscsid.conf, substituindo a linha "node.startup = manual" por "node.startup = automatic".

Com o advento do systemd, tive que fazer muita experimentação até conseguir fazer com que a ordem de execução dos daemons open-iscsi, zfs e iscsitarget ocorressem exatamente nesta ordem:

1º open-iscsi para conexão à lun do storage;
2º zfs para importação do pool criado e descrito em /etc/zfs/zpool.cache;
3º iscsitarget para disponibilizar volumes iscsi para outros initiators a partir de dispositivos ZFS, os ZVOLs.

Eis as alterações necessárias nos daemons para que se cumpra esta ordem:
1º open-scsi:
não exige alteração alguma;
2º zfs:
alteração do arquivo /lib/systemd/system/zfs-mount.service:
adicionar comentário na linha "#Before=local-fs.target";
adicionar a linha "After=open-iscsi.service"
3º iscsitarget:
adicionar "zfs-mount nas linhas
# Required-Start:    $remote_fs $syslog $network $time procps zfs-mount
# Required-Stop:     $remote_fs $syslog $network $time procps zfs-mount

Finalizando, já havia tido alguma experiência com falta de memória para o sistema operacional, devido ao cache do ZFS (provavelmente), que consegui contornar com a seguinte linha em /etc/sysctl.conf:
"vm.min_free_kbytes=1048576 "

Pronto! Reiniciando e tudo estando disponível automaticamente logo após o boot, basta fazer uso da lun pelos initiators. Depois basta criar snapshots e exportá-los, para preservação de dados e criação de backups.