Eu tenho um grupo de volumes LVM existente com um volume lógico de 10 TB montado como um sistema ext4 que está em uso ativamente.
É seguro executar o comando lvconvert --type cache --cachepool storage/lvmcache-data storage/data
enquanto o sistema de arquivos ext4 já está montado storage/data
? (O storage/lvmcache-data
foi previamente configurado lvconvert --type cache-pool --cachemode writeback --poolmetadata storage/lvmcache-metadata storage/lvmcache-data
caso faça diferença.)
Eu diria que sim, é seguro adicionar cache dinamicamente ao volume online com sistema de arquivos montado, mas não consegui encontrar documentação de qualquer maneira.
Isso não foi claramente documentado em nenhum lugar pelos autores do LVM, mas de acordo com https://blog.delouw.ch/2020/01/29/using-lvm-cache-for-storage-tiering/
Isso significa que, desde que você esteja usando
dm-cache
módulo em vez dedm-writecache
módulo, deve ser seguro adicionar e remover o cache LVM enquanto o volume lógico já estiver montado.Observe que
cachemode
a configuração do LVMwriteback
é diferente dedm-writecache
.Além disso, a documentação do RedHat em https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.5/html/administration_guide/sect-lvm_cache#idm140401735629408 diz o seguinte:
Eu também verifiquei isso seguindo o teste:
Crie 4 dispositivos de armazenamento adicionais em uma máquina virtual:
sda
(2 GB),sdb
(4 GB),sdc
(4 GB),sdd
(1 GB). Os tamanhos desses dispositivos não são importantes. Usei dispositivos de tamanhos diferentes para ilustrar a flexibilidade do LVM aqui. Você pode fingir que o menorsdd
é o dispositivo mais rápido e será usado como cache.Construa um armazenamento LVM de sda, sdb, sdc usando todas as extensões de todos os dispositivos (o grupo de volumes é chamado
storage
e o volume lógico é chamadodata
para este exemplo):No mundo real, eu recomendaria criar partições um pouco mais curtas que todo o dispositivo e usar essas partições para o volume físico do LVM. Isso permite uma substituição mais fácil de um dispositivo porque dispositivos de “1 TB” de fabricantes diferentes podem diferir em alguns megabytes. Prefiro manter os últimos ~ 100 MB não particionados para que os SSDs possam criar partições de tamanho idêntico em diferentes dispositivos SSD. Como bônus, o dispositivo SSD pode usar essa área nunca usada do disco como área extra de nivelamento de desgaste. Se você usar unidades baratas, recomendo deixar 10–20% nunca usadas porque unidades baratas normalmente têm muito menos área de nivelamento de desgaste fora da área acessível ao usuário. Deixar alguma área acessível ao usuário intocada (ou liberada com
TRIM
) permite que o firmware tenha mais área de nivelamento de desgaste, o que prolonga a vida útil da unidade e normalmente melhora seu desempenho.Inicie dois loops de teste fio em paralelo em dois terminais separados no diretório
/root/test
:Primeiro ciclo:
Segundo loop (em outro terminal):
Estes criam dois arquivos chamados
fio-tempfile.dat
efio-tempfile2.dat
que são gravados e verificados continuamente com um total de 5 processos e o conteúdo dos arquivos é verificado. Testei comdd
isso que se você modificar um único byte, o loop detectará o erro:Assim que um erro for detectado, você pode reiniciar o loop e ele continuará testando e verificando o armazenamento até ser interrompido ou até que um erro seja encontrado.
Adicione um novo dispositivo de cache (
sdd
) a esse armazenamento existente enquanto os loops de teste acima estão em execução constante para demonstrar que o acesso ao sistema de arquivos é seguro:O último comando adiciona o dispositivo de cache LVM dinamicamente sem causar corrupção de dados. O cache também durará reinicializações do sistema sem problemas. A razão para alocar apenas 98% para o cache de dados e 50% do espaço restante (1%) para o cache de metadados é que construir um cachepool a partir deles requer um pouco de espaço livre no grupo de volumes ou falhará. Você também pode usar
cachevol
em vez dissocachepool
, mas software de terceiros normalmente só oferece suportecachepool
porque é o método mais antigo. Ambos têm desempenho idêntico ecachepool
são apenas mais complexos de construir, mas têm melhor interoperabilidade com software de reparo e diagnóstico de terceiros, por isso prefiro usá-los. Ocachepool
O modo também suporta o uso de dispositivos separados para metadados e dados, o que pode melhorar o desempenho se você tiver vários dispositivos realmente rápidos.Se você quiser remover o dispositivo de cache, poderá fazer o seguinte imediatamente, sem corrupção de dados:
Isso levará muito tempo se o cache LVM estiver em uso ativo (como no exemplo acima com os loops de teste em execução) e continuará exibindo status como
Parece que a descarga pode parar por um longo tempo e continuar exibindo a mesma quantidade de blocos não liberados, mas você só precisa continuar esperando. O sistema de arquivos montado no LVM continua funcionando o tempo todo.
Não verifiquei o que acontece se houver perda de energia durante a
uncache
operação. Eu presumo que o LVM inicializa com o cache ainda em uso e você pode simplesmente executaruncache
novamente a operação.Observe que após o
uncache
comando, os volumes lógicos do cache de dados e do cache de metadados serão perdidos (liberados sem qualquer histórico), portanto, se você quiser reconectar o dispositivo de cache, deverá construí-lo desde o início (todos os comandoslvcreate
elvconvert
para o passo 4). O dispositivo de cache ainda fará parte do grupo de volumes após auncache
operação, portanto não será necessário refazer isso.E como sempre, tenha sempre um backup atualizado, completo e verificado antes de mexer em qualquer dado importante!
A configuração do cache LVM acima será semelhante a
lsblk -sp
:Algumas dicas adicionais sobre o uso do cache LVM:
Você pode ajustar um pouco o cache do LVM, mesmo que a lógica para selecionar o que manter no cache seja totalmente automática. Veja
man lvmcache
para detalhes completos. Alguns exemplos:Liste as configurações atuais de cache (os valores padrão não serão listados):
Limpe todas as configurações de cache (use padrões para tudo):
Ajuste o cache para sempre começar a liberar o cache de gravação para o armazenamento de apoio quando mais de 10% do cache for usado para buffer de gravação:
Ajuste o cache para continuar liberando o cache de gravação quando houver algo para liberar depois que a liberação for iniciada por qualquer motivo:
Ajuste o cache para pausar automaticamente a liberação por 50 ms se o armazenamento de apoio for acessado (evite introduzir latência para liberação)
Descarregue automaticamente até mesmo uma pequena quantidade de dados para o armazenamento de apoio quando eles estiverem no cache por mais de 60 segundos: