Archive for the ‘file system’ tag
Truncando um arquivo aberto que foi deletado
As vezes acontece de termos um arquivo aberto que foi deletado mas que ainda está sendo usado por algum processo. Muitas vezes este processo é de uma aplicação que não podemos reiniciar, seja por ser uma aplicação muito crítica, ou em muito dos casos você tenha “receio” de reiniciar e ocasionar algum problema. Só que você precisa liberar o espaço livre que este processo está “segurando”.
No exemplo abaixo, tenho uma partição com 141G ocupados e “apenas” 34G livres.
root@dbserver:~# df -h Filesystem Size Used Avail Use% Mounted on rootfs 15G 1.1G 13G 8% / udev 10M 0 10M 0% /dev tmpfs 1.2G 264K 1.2G 1% /run /dev/mapper/VolGroup00-lv_root 15G 1.1G 13G 8% / tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.4G 0 2.4G 0% /run/shm /dev/mapper/VolGroup00-lv_tmp 3.8G 72M 3.5G 2% /tmp /dev/mapper/VolGroup00-lv_var 184G 141G 34G 81% /var root@dbserver:~#
Verificando o tamanho de todos os diretórios dentro do /var.
root@dbserver:/var# du -shc * 3.9M backups 85M cache 7.3G lib 4.0K local 12K lock 282M log 16K lost+found 431M mail 4.0K opt 172K run 108K spool 4.0K tmp 16K www 8.0G total root@dbserver:/var#
Reparem no exemplo acima que temos apenas 8.0G ocupados. Então, o que está consumindo tanto espaço em disco? Usando o lsof conseguimos descobrir quem é:
root@dbserver:/var# lsof /var/ | grep deleted mysqld 1850 mysql 10w REG 253,2 141891360059 2424897 /var/log/mysql/mysql.log.1 (deleted)
Um único arquivo de log do mysql consumindo mais de 130G de espaço é complicado não é mesmo? Com o número do processo, conseguimos saber qual arquivo iremos truncar:
root@dbserver:/var# ls -latr /proc/1850/fd/ | grep -i deleted lrwx------ 1 root root 64 Mar 12 01:01 7 -> /tmp/ibz7M8HX (deleted) lrwx------ 1 root root 64 Mar 12 01:01 6 -> /tmp/ibT0GdaA (deleted) lrwx------ 1 root root 64 Mar 12 01:01 5 -> /tmp/ibuilBCc (deleted) lrwx------ 1 root root 64 Mar 12 01:01 4 -> /tmp/ibKEdZ4O (deleted) lrwx------ 1 root root 64 Mar 12 01:01 11 -> /tmp/ibotm0Yo (deleted) l-wx------ 1 root root 64 Mar 12 01:01 10 -> /var/log/mysql/mysql.log.1 (deleted) root@dbserver:/var# > /proc/1850/fd/10
Nos comando acima, primeiro verificamos o número do FD (file descriptor) do arquivo e logo na sequência, truncamos todo o conteúdo do arquivo.
Obs: Muito cuidado pois um determinado processo utiliza vários FDs, você tem que ter certeza absoluta de qual arquivo irá truncar, pois pode “sem querer” apagar um arquivo válido e neste caso já era. Apenas o backup lhe salvará.
root@dbserver:/var# df -h Filesystem Size Used Avail Use% Mounted on rootfs 15G 1.1G 13G 8% / udev 10M 0 10M 0% /dev tmpfs 1.2G 264K 1.2G 1% /run /dev/mapper/VolGroup00-lv_root 15G 1.1G 13G 8% / tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 2.4G 0 2.4G 0% /run/shm /dev/mapper/VolGroup00-lv_tmp 3.8G 72M 3.5G 2% /tmp /dev/mapper/VolGroup00-lv_var 184G 8.2G 166G 5% /var
Depois do arquivo truncado, agora o espaço da partição está ok.
GlusterFS – Um sistema de arquivos para alta disponibilidade
Depois de um longo tempo sem publicar nada no blog, estou de volta com um assunto interessante: GlusterFS.
Neste artigo irei mostrar como instalar e configurar o GlusterFS para criar um sistema de armazenamento de alta disponibilidade utilizando 2 servidores. Ambos os servidores serão client e server e cada servidor será espelho do outro onde os arquivos serão replicados automaticamente entre eles, ou seja, uma espécie de raid 1 via rede.
GlusterFS é um sistema de arquivos distribuído, capaz de escalar vários petabytes. Ele trabalha sob infiniband RDMA ou tcp/ip. Os desenvolvedores recomendam os sistemas de arquivos Ext3 e Ext4. Outros sistemas de arquivos, como ZFS, ReiserFS, btrfs, JFS, também funcionam, mas não foram amplamente testados. XFS tem vários problemas de desempenho devido a sua implementação atributos estendidos, se você optar por usar XFS seu desempenho utilizando Gluster será reduzido em pelo menos 60%.
Para seu funcionamento, você não precisa de nada em especial, pode utilizar seu hardware já existente, como por exemplo servidores com discos Sata/Sata-II ou ISCSI/SaS.
Os dados dos servidores a serem utilizados neste artigo são:
Servidor 01: 192.168.0.10 Servidor 02: 192.168.0.11 diretório a ser compartilhado: /var/www
É interessante você adicionar as seguintes entradas no /etc/hosts de cada servidor:
192.168.0.10 servidor01 192.168.0.11 servidor02
Como em artigos anteriores, este aqui também é baseado em debian. Os pacotes que iremos utilizar são glusterfs-client e glusterfs-server e a instalação segue o mesmo procedimento:
apt-get install glusterfs-client glusterfs-server
Depois de instalar os pacotes, entre no diretório /etc/glusterfs, nele você verá os seguintes arquivos:
glusterfs.vol glusterfsd.vol
O primeiro arquivo é responsável pela configuração do client e o segundo do server. Como os servidores serão client e server ao mesmo tempo, a configuração destes arquivos precisa ser idêntica em ambas as máquinas.
Renomeie os arquivos e adicione .default ao final de cada um deles:
cd /etc/glusterfs mv glusterfs.vol glusterfs.vol.default mv glusterfsd.vol glusterfsd.vol.default
Crie o arquivo /etc/glusterfs/glusterfs.vol com o seguinte conteúdo:
# /etc/glusterfs client configuration file # volume client01 type protocol/client option transport-type tcp/client option remote-host servidor01 option remote-subvolume brick end-volume volume client02 type protocol/client option transport-type tcp/client option remote-host servidor02 option remote-subvolume brick end-volume volume replicate type cluster/replicate subvolumes client01 client02 end-volume volume writeback type performance/write-behind option aggregate-size 1MB subvolumes replicate end-volume volume cache type performance/io-cache option page-size 512MB subvolumes writeback end-volume
Crie o arquivo /etc/glusterfs/glusterfsd.vol com o seguinte conteúdo:
# /etc/glusterfs server configuration file # volume posix type storage/posix option directory /var/www end-volume volume locks type features/locks subvolumes posix end-volume volume brick type performance/io-threads option thread-count 8 subvolumes locks end-volume volume server type protocol/server option transport-type tcp option auth.addr.brick.allow 192.168.0.10,192.168.0.11 subvolumes brick end-volume
Para entender melhor as opções usadas nas configurações, sugiro dar uma lida na página de translators.
Com os arquivos configurados, inicie o daemon com o seguinte comando:
/etc/init.d/glusterfs-server start
Adicione a seguinte entrada no /etc/fstab de ambos os servidores:
/etc/glusterfs/glusterfs.vol /var/lib/glusterfs glusterfs defaults 0 0
Crie o diretório /var/glusterfs e monte o diretório:
mkdir /var/glusterfs mount -a
Agora com tudo pronto em ambos os servidores, vamos realizar os seguintes testes:
- No servidor 01: Salve alguns arquivos no /var/glusterfs. - Conecte no servidor 02 e veja se os arquivos estão lá. - Execute um reboot no servidor 01. - Veja se tudo está ok no servidor 02. - Salve alguns arquivos no servidor 02. - Quando o servidor 01 voltar, verifique no /var/glusterfs se os arquivos que você salvou quando ele estava fora foram replicados. - Repita o procedimento mudando a ordem do servidores.
Você deve estar se perguntando porque estou me baseando no diretório /var/glusterfs e não no /var/www, isto porque para a replicação funcionar, os dados precisam ser gravados no /var/glusterfs.
E isto é tudo. Estando todos os testes ok, você agora tem um raid 1 vai rede :).