Existe uma maneira pela qual o ZFS possa ser solicitado a redistribuir um determinado sistema de arquivos em todos os discos em seu zpool?
Estou pensando em um cenário em que tenho um volume ZFS de tamanho fixo que é exportado como um LUN sobre FC. O zpool atual é pequeno, apenas dois discos espelhados de 1 TB e o zvol é de 750 GB no total. Se eu subitamente expandisse o tamanho do zpool para, digamos, 12 discos de 1 TB, acredito que o zvol ainda estaria efetivamente 'alojado' apenas nos dois primeiros eixos.
Dado que mais spindles = mais IOPS, que método eu poderia usar para 'redistribuir' o zvol em todos os 12 spindles para aproveitá-los?
zfs send | zfs recv
Não há razão para o zvol ser armazenado apenas nos dispositivos iniciais. Se você aumentar o pool, o ZFS abrangerá os dados atualizados em todos os dispositivos subjacentes disponíveis. Não há particionamento fixo com o ZFS.
fonte
Esta é uma "continuação" da resposta de ewwhite:
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 exemplophp 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
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).
fonte
Bem, isso é um pouco complicado, mas, como você parou a máquina usando o zvol, o zfs pode enviar o sistema de arquivos para um arquivo local no localhost chamado bar.zvol, e então você recebe o sistema de volta ao arquivo novamente. Isso deve reequilibrar os dados para você.
fonte
a melhor solução que encontrei foi duplicar metade dos seus dados no pool expandido e excluir os dados duplicados originais.
fonte