Muitos recursos na Internet contêm informações conflitantes sobre a lógica de leitura/gravação de blocos RAID.
Esta resposta contém as seguintes informações (aparentemente conflitantes):
Um tamanho de bloco de 512 KB não exige que o sistema grave, por exemplo, 512 KB para cada gravação de 4 KB ou leia 512 KB da superfície do dispositivo para uma leitura de aplicativo de 4 KB.
[Ao ler um bloco de 16 KiB do RAID com um tamanho de bloco de 64 KiB] o RAID executará uma operação de leitura/modificação/gravação ao gravar esse arquivo de 4 KiB/bloco de 16 KiB porque a menor unidade de armazenamento do RAID é 64 -KiB.
Por outro lado, este recurso contém as seguintes informações:
Por exemplo, se você tiver um arquivo de texto de 10 KB e o tamanho do bloco for 256 KB, esses 10 KB de dados serão armazenados em um bloco de 256 KB, deixando o restante do bloco vazio. Por outro lado, com blocos de 16 KB, há muito menos desperdício de espaço ao armazenar esse arquivo de 10 KB.
Em particular, tenho as seguintes perguntas:
- Ao ler/gravar alguma unidade de dados menor que o tamanho do bloco RAID usando um esquema sem paridade, isso requer uma operação de leitura/modificação/gravação para todo o bloco ou apenas a parte do bloco que é modificada?
- Ao usar um esquema RAID com paridade, isso muda alguma coisa na resposta à pergunta 1?
- Conforme mencionado na segunda referência, escrever uma unidade de dados menor que o bloco RAID de alguma forma deixa o restante do bloco RAID vazio? Isso me parece incorreto, mas gostaria de esclarecer, pois este recurso afirma isso de forma bastante inequívoca.
- Alguma dessas respostas muda dependendo da implementação do RAID (kernel Linux, RAID de hardware, etc.)?
Se possível, fornecer algum tipo de referência oficial (alguma especificação de RAID, código-fonte, etc.) seria incrível.
Desde já, obrigado!
O tamanho do bloco determina principalmente como os dados são distribuídos entre os dispositivos (qual dispositivo físico e deslocamento procurar se você quiser ler o byte 1234567890 no seu dispositivo RAID).
Não afeta diretamente o algoritmo RAID, que no caso do RAID 5 é uma operação XOR simples, também conhecida como XOR bit a bit . Matematicamente, isso opera em bits e, como tal, não depende de bytes, setores ou pedaços. O RAID 6 é um pouco mais complexo, mas ainda assim bastante semelhante.
Como tal, não há necessidade de processar todo o pedaço.
Para Linux mdadm RAID, você pode tentar verificá-lo experimentalmente:
Crie algumas unidades virtuais (usando arquivos esparsos):
Coloque um mdadm RAID 6 em cima (usando
--assume-clean
para que não grave nada, além de metadados):Gravação pequena em um deslocamento aleatório:
Resultado:
Todas as imagens têm 1 extensão (para metadados mdadm), então você pode ignorá-la. Apenas 3 imagens possuem 2 extensões (dados, paridade 1, paridade 2). Portanto, apenas estes foram escritos.
Como você pode ver, a extensão é um único setor, não um pedaço.
Os dados brutos são assim:
Como todos os dados são zero, a paridade do RAID 5
TEST
ainda éTEST
. Para paridade RAID6,TEST
transformado em)$Y)
.Você pode estender esse experimento preenchendo a matriz com dados aleatórios e, em seguida, escrever apenas {4,16,512,4096,16384} bytes de zero no deslocamento desejado para apenas um ou vários desses 3 dispositivos e, em seguida, repetir o experimento.
Dessa forma, você pode determinar que o mdadm não está operando em resolução de nível de byte único (mas ainda não indo além dos setores, sem mencionar pedaços inteiros).
Você também pode notar que ele grava a paridade errada se a paridade já estiver errada antes da gravação (paridade atualizada usando paridade em vez de recalcular a partir dos dados).