Você precisaria reescrever seus dados para o zpool expandido para reequilibrá-los. Caso contrário, com o passar do tempo, suas gravações serão distribuídas em todo o pool.
Existe uma maneira na qual o ZFS pode ser solicitado a redistribuir um determinado sistema de arquivos sobre 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 1TB e o zvol é de 750 GB no total. Se de repente eu expandisse o tamanho do zpool para, digamos, 12 discos de 1TB, 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 sobre todos os 12 spindles para aproveitá-los?
Não há razão para o zvol ser armazenado apenas nos dispositivos iniciais. Se você ampliar o pool, o ZFS abrangerá os dados atualizados em todos os dispositivos subjacentes disponíveis. Não há particionamento fixo com o ZFS.
Esta é uma "continuação" da resposta do ewwhite:
You would need to rewrite your data to the expanded zpool in order to rebalance it
Eu escrevi um script PHP ( disponível no github ) para automatizar isso no meu host Ubuntu 14.04.
Apenas é necessário instalar a ferramenta CLI do PHP com sudo apt-get install php5-cli
e executar o script, passando o caminho para os dados do seu conjunto 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 alocados excessivamente às unidades que foram adicionadas por último. A segunda execução garantirá que cada arquivo seja "razoavelmente" distribuído entre as unidades. Eu digo razoavelmente ao invés de uniformemente porque ele só será distribuído uniformemente se você não estiver misturando capacidades de drive como eu estou com meu raid 10 de pares de tamanhos diferentes (4tb mirror + 3TB mirror + 3TB mirror).
Use a ferramenta iostat durante um período de tempo (por exemplo, iostat -m 5
) e verifique as gravações. Se eles são os mesmos, então você conseguiu um spread uniforme. Eles não são perfeitos mesmo na imagem abaixo porque eu estou executando um par de 4 TBs com 2 pares de drives de 3 TB no RAID 10, então os dois 4s serão escritos para um pouco mais.
Seautilizaçãodesuaunidadefor"desequilibrada", o iostat mostrará algo mais parecido com a captura de tela abaixo, na qual as novas unidades estão sendo gravadas de forma desproporcional. Você também pode dizer que são as novas unidades porque as leituras são 0, pois não contêm dados.
O script não é perfeito, apenas uma solução alternativa, mas funciona para mim enquanto o ZFS implementa um recurso de rebalanceamento como o BTRFS (dedos cruzados).
Bem, isso é um truque, mas dado que você parou a máquina usando o zvol, você poderia zfs enviar o sistema de arquivos para um arquivo local em localhost chamado bar.zvol, e então você recebe o sistema de arquivos novamente . Isso deve reequilibrar os dados para você.
zfs send tank/bar > bar.zvol
zfs receive tank/bar < bar.zvol
a melhor solução que encontrei foi duplicar metade dos seus dados no pool expandido e, em seguida, excluir os dados originais duplicados.