ZFS: Redistribui zvol sobre todos os discos no zpool?

12

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?

    
por growse 16.12.2011 / 11:04

5 respostas

8

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.

    
por 16.12.2011 / 11:15
3

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.

    
por 16.12.2011 / 11:18
0

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).

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, excluí-lo aqui e gravá-lo novamente.
  • Eu preenchi meu pool com mais de 50%, então não pude simplesmente copiar o sistema de arquivos inteiro de uma vez antes de excluir o original.
  • Se houver apenas alguns arquivos que precisam ser bem executados, é possível executar o script duas vezes nesses arquivos. No entanto, a segunda execução é apenas eficaz se a primeira execução for bem-sucedida no balanceamento da utilização das unidades.
  • Eu tenho muitos dados e quero ver uma indicação do progresso que está sendo feito.

Como posso saber se a utilização da unidade mesmo é alcançada?

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).

    
por 02.01.2015 / 16:09
0

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
    
por 24.11.2012 / 02:34
-1

a melhor solução que encontrei foi duplicar metade dos seus dados no pool expandido e, em seguida, excluir os dados originais duplicados.

    
por 23.11.2012 / 19:01

Tags