ZFS: Redistribuir o zvol em todos os discos no zpool?

12

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?

crescer
fonte

Respostas:

8

Você precisaria reescrever seus dados no zpool expandido para reequilibrá-los. Caso contrário, com o passar do tempo, suas gravações serão distribuídas por todo o pool.

ewwhite
fonte
Suponho que não há uma maneira rápida e fácil de fazer isso ...?
growse
7
zfs send | zfs recv
the-wabbit
Vou testar isso - não posso acreditar que algo tão simples faria isso. :)
growse
3
Relate, nunca fiz isso e também estou curioso.
StrangeWill
3

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.

jlliagre
fonte
4
Na minha experiência, isso não é verdade. Embora não haja 'pareamento fixo', o ZFS não moverá dados por vontade própria para fora das solicitações de E / S do cliente. Se você criar o cenário que descrevi, adicionar mais discos e executar algumas operações pesadas no LUN original, verá apenas atividade nos dois primeiros discos da matriz, porque é onde estão os dados. O ewwhite ressalta que, com o tempo, fica equilibrado, mas estou curioso para saber se existe uma maneira mais rápida de fazer isso.
growse
1
Desculpe se eu não era clara. Obviamente, os dados existentes não se moverão magicamente. Somente dados atualizados serão realocados uniformemente. Isso foi o que eu quis dizer com "novas IOs". No que diz respeito aos dados estáticos existentes, o armazenamento em cache também melhorará o desempenho, desde que os blocos sejam lidos mais de uma vez.
Jlliagre
0

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-clie 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. insira a descrição da imagem aqui

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. insira a descrição da imagem aqui

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

Programador
fonte
Ah, meu ... Uau ...
ewwhite
0

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

zfs send tank/bar > bar.zvol

zfs receive tank/bar < bar.zvol
cristão
fonte
-1

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

reco
fonte
3
Você pode elaborar?
ewwhite
@reco: zvols não são sistemas de arquivos, então você não pode excluir ou duplicar dados neles. Você pode sobrescrever dados, mas isso os corromperia, a menos que você o fizesse com o mesmo conteúdo que efetivamente se estenderia aos volumes subjacentes, mas é isso que o ewwhite já sugeriu um ano atrás.
Jlliagre
sim você está certo. eu estava olhando em volta e pesquisando o mesmo tópico. o que percebi é que, com o zfs, a redistribuição de dados pelo vdevs não é necessária. mas se você ainda quiser, por qualquer motivo, duplicar dados e excluir os originais acelerará o que o zfs faria com o tempo.
reco
1
A redistribuição de dados pelos vdevs é uma solicitação legítima. Receio que você ainda esteja perdendo a pergunta é sobre zvols, não sistemas de arquivos. Você não pode duplicar ou excluir dados em um volume, isso não faz sentido.
Jlliagre
oi jlliagre. Sim, você está arrependido
reco