Esta é uma "continuação" da resposta de ewwhite:
Você precisaria reescrever seus dados no zpool expandido para reequilibrá-los
Eu escrevi um script PHP ( disponível no github ) para automatizar isso no meu host Ubuntu 14.04.
Basta instalar a ferramenta CLI do PHP sudo apt-get install php5-cli
e executar o script, passando o caminho para os dados de seus conjuntos como o primeiro argumento. Por exemplo
php main.php /path/to/my/files
Idealmente, você deve executar o script duas vezes em todos os dados no pool. A primeira execução equilibrará a utilização da unidade, mas os arquivos individuais serão excessivamente alocados às unidades que foram adicionadas pela última vez. A segunda execução garantirá que cada arquivo seja "razoavelmente" distribuído pelas unidades. Digo bastante, em vez de uniformemente, porque ele só será distribuído uniformemente se você não estiver misturando as capacidades da unidade, como eu estou com o meu ataque 10 de pares de tamanhos diferentes (espelho de 4 TB + espelho de 3 TB + espelho de 3 TB).
Razões para usar um script
- Eu tenho que corrigir o problema "no local". Por exemplo, não consigo gravar os dados em outro sistema, exclua-os aqui e escreva-os novamente.
- Enchi meu pool em mais de 50%, então não pude copiar todo o sistema de arquivos de uma só vez antes de excluir o original.
- Se houver apenas alguns arquivos que precisam ter um bom desempenho, é possível executar o script duas vezes sobre esses arquivos. No entanto, a segunda execução só será efetiva se a primeira executar com êxito no balanceamento da utilização das unidades.
- Eu tenho muitos dados e quero poder ver uma indicação do progresso que está sendo feito.
Como posso saber se é alcançada a utilização uniforme da unidade?
Use a ferramenta iostat por um período de tempo (por exemplo iostat -m 5
) e verifique as gravações. Se eles são os mesmos, você alcançou um spread uniforme. Eles não estão perfeitamente iguais na captura de tela abaixo porque estou executando um par de 4 TB com 2 pares de unidades de 3 TB no RAID 10, portanto os dois 4 serão gravados um pouco mais.
Se a utilização da sua unidade for "desequilibrada", o iostat mostrará algo mais parecido com a captura de tela abaixo, na qual as novas unidades estão sendo gravadas de maneira desproporcional. Você também pode dizer que elas são as novas unidades porque as leituras estão em 0, pois não possuem dados nelas.
O script não é perfeito, apenas uma solução alternativa, mas funciona para mim até que o ZFS um dia implemente um recurso de reequilíbrio como o BTRFS (dedos cruzados).