Na teoria de códigos, um código de apagamento (do inglês erasure code) é um código de correção antecipada de erros (FEC) sob a suposição de apagamentos de bits (em vez de erros de bits), que transforma uma mensagem de símbolos em uma mensagem mais longa (palavra-código) com símbolos, de tal forma que a mensagem original possa ser recuperada a partir de um subconjunto dos símbolos. A fração é chamada de taxa de código. A fração , onde denota o número de símbolos necessários para a recuperação, é chamada de eficiência de recepção. O algoritmo de recuperação pressupõe que se sabe quais dos símbolos foram perdidos.

História

editar

A codificação de apagamento foi inventada por Irving Reed e Gustave Solomon em 1960.[1]

Existem muitos esquemas diferentes de codificação de apagamento. Os códigos de apagamento mais populares são a codificação de Reed-Solomon, os códigos de verificação de paridade de baixa densidade (códigos LDPC) e os turbo códigos.[1]

A partir de 2023, sistemas modernos de armazenamento de dados podem ser projetados para tolerar a falha completa de alguns discos sem perda de dados, usando uma de 3 abordagens:[2][3][4]

  • Replicação
  • RAID
  • Codificação de Apagamento (Erasure Coding)

Embora o RAID possa ser tecnicamente visto como um tipo de código de apagamento,[5] o termo "RAID" é geralmente aplicado a um arranjo conectado a um único computador hospedeiro (que é um ponto único de falha), enquanto "codificação de apagamento" geralmente implica em múltiplos hospedeiros,[3] às vezes chamados de Redundant Array of Inexpensive Servers (RAIS). O código de apagamento permite que as operações continuem quando qualquer um desses hospedeiros para de funcionar.[4][6]

Comparada aos sistemas RAID de nível de bloco, a codificação de apagamento em armazenamento de objetos possui algumas diferenças significativas que a tornam mais resiliente.[7][8][9][10][11]

Códigos de apagamento ótimos

editar

Os códigos de apagamento ótimos têm a propriedade de que quaisquer dos símbolos da palavra-código são suficientes para recuperar a mensagem original (ou seja, eles possuem eficiência de recepção ótima). Códigos de apagamento ótimos são códigos separáveis de distância máxima (códigos MDS).

Verificação de paridade

editar

A verificação de paridade é o caso especial em que . A partir de um conjunto de valores , uma soma de verificação (checksum) é calculada e anexada aos valores de origem:

O conjunto de valores agora é consistente em relação à soma de verificação. Se um desses valores, , for apagado, ele poderá ser facilmente recuperado somando as variáveis restantes:

O RAID 5 é uma aplicação amplamente utilizada do código de apagamento de verificação de paridade usando a operação XOR (Ou Exclusivo).[1]

Superamostragem polinomial

editar

Exemplo: Err-mail ()

editar

No caso simples onde , símbolos de redundância podem ser criados amostrando diferentes pontos ao longo da reta entre os dois símbolos originais. Isso é ilustrado com um exemplo simples, chamado err-mail (correio com erros):

Alice quer enviar seu número de telefone (555629) para Bob usando o err-mail. O err-mail funciona exatamente como o e-mail, exceto que:

  1. Cerca de metade de todo o correio se perde.
  2. Mensagens com mais de 5 caracteres são ilegais.
  3. É muito caro (semelhante ao correio aéreo).

Em vez de pedir a Bob para confirmar o recebimento das mensagens que ela envia, Alice elabora o seguinte esquema:

  1. Ela divide seu número de telefone em duas partes e , e envia 2 mensagens – "A=555" e "B=629" – para Bob.
  2. Ela constrói uma função linear, , neste caso , de forma que e .

  1. Ela calcula os valores , e , e então transmite três mensagens redundantes: "C=703", "D=777" e "E=851".

Bob sabe que a forma de é , onde e são as duas partes do número de telefone. Agora suponha que Bob receba "D=777" e "E=851".

Bob pode reconstruir o número de telefone da Alice computando os valores de e a partir dos valores ( e ) que ele recebeu. Bob pode realizar esse procedimento usando quaisquer dois err-mails, então o código de apagamento neste exemplo tem uma taxa de 40%.

Note que Alice não pode codificar seu número de telefone em apenas um err-mail, porque ele contém seis caracteres, e o comprimento máximo de uma mensagem de err-mail é de cinco caracteres. Se ela enviasse seu número de telefone em pedaços, pedindo a Bob para confirmar o recebimento de cada pedaço, pelo menos quatro mensagens teriam que ser enviadas de qualquer maneira (duas da Alice e duas confirmações do Bob). Logo, o código de apagamento neste exemplo, que requer cinco mensagens, é bastante econômico.

Este exemplo é um pouco artificial. Para códigos de apagamento verdadeiramente genéricos que funcionem sobre qualquer conjunto de dados, precisaríamos de algo diferente da fornecida.

Caso geral

editar

A construção linear acima pode ser generalizada para a interpolação polinomial. Além disso, os pontos agora são computados sobre um corpo finito.

Primeiro escolhemos um corpo finito com ordem de pelo menos , mas geralmente uma potência de . O remetente numera os símbolos de dados de a e os envia. Em seguida, ele constrói um polinômio (de Lagrange) de grau de modo que seja igual ao símbolo de dados . Ele então envia . O receptor agora também pode usar a interpolação polinomial para recuperar os pacotes perdidos, desde que receba símbolos com sucesso. Se a ordem de for menor que , onde é o número de bits em um símbolo, então múltiplos polinômios podem ser usados.

O remetente pode construir os símbolos de a "em tempo real" (on the fly), ou seja, distribuir a carga de trabalho de forma uniforme entre a transmissão dos símbolos. Se o receptor quiser fazer seus cálculos "em tempo real", ele pode construir um novo polinômio , tal que se o símbolo for recebido com sucesso e quando o símbolo não for recebido. Agora seja . Em primeiro lugar, sabemos que se o símbolo foi recebido com sucesso. Em segundo lugar, se o símbolo foi recebido com sucesso, então pode ser calculado. Então, temos pontos de dados suficientes para construir e avaliá-lo para encontrar os pacotes perdidos. Portanto, tanto o remetente quanto o receptor exigem operações e apenas espaço para operar "em tempo real".

Implementação no mundo real

editar

Este processo é implementado pelos códigos de Reed-Solomon, com palavras-código construídas sobre um corpo finito usando uma matriz de Vandermonde.

A maioria dos códigos de apagamento práticos são códigos sistemáticos — cada um dos símbolos originais pode ser encontrado copiado, sem codificação, como um dos símbolos da mensagem.[12] (Códigos de apagamento que suportam compartilhamento de segredos nunca usam um código sistemático).

Códigos de apagamento quase ótimos

editar

Os códigos de apagamento quase ótimos requerem símbolos para recuperar a mensagem (onde ). A redução de pode ser feita ao custo de tempo de CPU. Os códigos de apagamento quase ótimos trocam capacidades de correção por complexidade computacional: algoritmos práticos podem codificar e decodificar com complexidade de tempo linear.

Os códigos fonte (Fountain codes, também conhecidos como códigos de apagamento sem taxa fixa) são exemplos notáveis de códigos de apagamento quase ótimos. Eles podem transformar uma mensagem de símbolos em uma forma codificada praticamente infinita, ou seja, podem gerar uma quantidade arbitrária de símbolos de redundância que podem ser todos usados para correção de erros. Os receptores podem iniciar a decodificação após terem recebido pouco mais de símbolos codificados.

Os códigos regeneradores tratam da questão de reconstruir (também chamado de reparar) fragmentos codificados perdidos a partir de fragmentos codificados existentes. Esse problema ocorre em sistemas de armazenamento distribuído, onde a comunicação para manter a redundância codificada é um problema.[12]

Aplicações da codificação de apagamento em sistemas de armazenamento

editar

A codificação de apagamento é agora uma prática padrão para armazenamento de dados confiável.[13][14][15] Em particular, várias implementações de codificação de apagamento de Reed-Solomon são usadas pelo Apache Hadoop, pelo RAID-6 embutido no Linux, Microsoft Azure, armazenamento frio (cold storage) do Facebook e Backblaze Vaults.[15][12]

A maneira clássica de se recuperar de falhas em sistemas de armazenamento era usar a replicação. No entanto, a replicação incorre em uma sobrecarga significativa em termos de bytes desperdiçados. Portanto, sistemas de armazenamento cada vez maiores, como os usados em data centers, usam armazenamento codificado por apagamento. A forma mais comum de codificação de apagamento usada em sistemas de armazenamento é o código Reed-Solomon (RS), uma fórmula matemática avançada usada para permitir a regeneração de dados ausentes a partir de pedaços de dados conhecidos, chamados blocos de paridade. Em um código RS , um dado conjunto de blocos de dados, chamados "pedaços" (chunks), é codificado em pedaços. O conjunto total de pedaços compõe uma "faixa" (stripe). A codificação é feita de tal forma que, desde que pelo menos dos pedaços estejam disponíveis, é possível recuperar todos os dados. Isso significa que um armazenamento codificado em RS pode tolerar até falhas. (Isso é diferente da notação RS padrão, com .)

RS(10,4)

editar

Exemplo: No código , que é usado no Facebook para o seu HDFS (agora parte do Apache Hadoop), 10 MB de dados de usuário são divididos em dez blocos de 1 MB. Em seguida, quatro blocos de paridade adicionais de 1 MB são criados para fornecer redundância. Isso pode tolerar até 4 falhas simultâneas. A sobrecarga de armazenamento aqui é .[16]

No caso de um sistema totalmente replicado, os 10 MB de dados de usuário teriam que ser replicados 4 vezes para tolerar até 4 falhas simultâneas. A sobrecarga de armazenamento nesse caso seria de vezes.

Isso dá uma ideia da menor sobrecarga de armazenamento do armazenamento com código de apagamento em comparação com a replicação total, e consequentemente, o porquê de ser atraente nos sistemas de armazenamento de hoje.

O esquema Hitchhiker pode ser combinado com a codificação RS para reduzir a quantidade de computação e transferência de dados necessárias para a reconstrução de blocos de dados. Ele também é implementado como um codec HDFS, embora uma política precise ser definida manualmente para que seja usado.[12]

Dados quentes (Hot data)

editar

Inicialmente, os códigos de apagamento eram usados para reduzir o custo de armazenamento eficiente de dados "frios" (pouco acessados); mas os códigos de apagamento também podem ser usados para melhorar o desempenho no fornecimento de dados "quentes" (acessados com mais frequência) em comparação com esquemas de redundância mais simples (espelhamento).[12]

O exemplo clássico da codificação de apagamento melhorando o desempenho é o RAID 5, que fornece a mesma proteção contra falha de um único drive enquanto requer menos discos rígidos em comparação com o RAID 1. Os discos rígidos extras podem então ser usados para armazenar mais dados e aproveitar o multiplicador aprimorado de velocidade de leitura/gravação no RAID 5. Isso também se aplica ao RAID 6 (redundância dupla: uma paridade e um código de apagamento), assumindo que o poder de processamento seja suficiente.[1] O RAID generalizado pode funcionar com qualquer número de discos de redundância. Existem duas notações para o RAID generalizado: RAID 7. refere-se a um sistema com discos de redundância, permitindo a recuperação quando até discos falham.[17] Alternativamente, RAID refere-se a discos de dados regulares com discos de redundância, sendo capaz de recuperar todos os dados quando quaisquer discos falham.[1]

Um exemplo mais avançado é o EC-Cache, um cache de cluster, ou seja, um cache distribuído entre vários nós. Tais sistemas podem sofrer de desequilíbrio de carga quando um nó hospeda itens mais populares, e um método comum para resolver esse problema é a replicação seletiva, ou seja, criar mais réplicas para objetos mais populares. No entanto, esse método é limitado pela quantidade de memória disponível. Dividindo individualmente cada objeto em partes e unidades de redundância, o balanceamento de carga perfeito pode ser alcançado em vez disso, com um mínimo de desperdício de memória.[12]

Exemplos

editar

Aqui estão alguns exemplos de implementações dos vários códigos:

Códigos de apagamento quase ótimos

editar

Códigos fonte (apagamento sem taxa fixa) quase ótimos

editar

Códigos de apagamento ótimos

editar

Ver também

editar

Referências

editar
  1. a b c d e «RAID vs. Erasure Coding. What's the Difference? | Blog | Xinnor». The Fastest and Most Reliable Software RAID | Xinnor (em inglês). 3 de setembro de 2023. Consultado em 18 de setembro de 2024 
  2. «Ceph.io — Erasure Coding in Ceph». ceph.io (em inglês). 7 de abril de 2014. Consultado em 18 de setembro de 2024 
  3. a b Lee, Brandon (26 de dezembro de 2023). «RAID vs Erasure Coding vs Replication». BDRSuite (em inglês). Consultado em 18 de setembro de 2024 
  4. a b O'Reilly, Jim. «RAID Vs. Erasure Coding». www.networkcomputing.com (em inglês). Consultado em 18 de setembro de 2024 
  5. Dimitri Pertin, Alexandre van Kempen, Benoît Parrein, Nicolas Normand. "Comparison of RAID-6 Erasure Codes". The third Sino-French Workshop on Information and Communication Technologies, SIFWICT 2015, Jun 2015, Nantes, France. ffhal-01162047f
  6. «Understanding IBM Spectrum Scale Erasure Code Edition fault tolerance». www.ibm.com (em inglês). Consultado em 18 de setembro de 2024 
  7. «Object Storage Erasure Coding vs. Block Storage RAID». MinIO Blog (em inglês). 27 de julho de 2021. Consultado em 18 de setembro de 2024 
  8. «Erasure coding vs Raid as a data protection method | Computer Weekly». ComputerWeekly.com (em inglês). Consultado em 18 de setembro de 2024 
  9. Kruth, Peter (4 de outubro de 2023). «Erasure Code: RAID As It Should Be – Huawei BLOG». Consultado em 18 de setembro de 2024. Cópia arquivada em 4 de outubro de 2023 
  10. «Erasure Coding 101». MinIO Blog (em inglês). 25 de abril de 2022. Consultado em 18 de setembro de 2024 
  11. Bhaskaran, Dinesh Kumar (6 de julho de 2018). «Why erasure coding is the future of data resiliency». Arquivado do original em 7 de agosto de 2020 
  12. a b c d e f Rashmi Vinayak. "Erasure Coding for Big-data Systems: Theory and Practice". 2016. p. 2: section "Abstract". p. 9: section "Systematic codes". p. 12: section "Regenerating codes".
  13. "Erasure Encoding—Practice and Principles". 2016.
  14. Matt Sarrel. "Erasure Coding 101". 2022.
  15. a b Brian Beach. "Backblaze Open-sources Reed-Solomon Erasure Coding Source Code". 2015.
  16. Xia, Mingyuan; Saxena, Mohit; Blaum, Mario; Pease, David A. (2015). A Tale of Two Erasure Codes in HDFS. FAST '15 (em inglês). pp. 213–226. ISBN 978-1-931971-20-1 
  17. Leventhal, Adam (dezembro de 2009). «Triple-Parity RAID and Beyond: As hard-drive capacities continue to outpace their throughput, the time has come for a new level of RAID.». ACM Queue. 7 (11): 30–39. doi:10.1145/1661785.1670144 
  18. Dimakis, Alexandros G.; Godfrey, P. Brighten; Wu, Yunnan; Wainwright, Martin J.; Ramchandran, Kannan (setembro de 2010). «Network Coding for Distributed Storage Systems». IEEE Transactions on Information Theory. 56 (9): 4539–4551. Bibcode:2010ITIT...56.4539D. CiteSeerX 10.1.1.117.6892Acessível livremente. arXiv:cs/0702015Acessível livremente. doi:10.1109/TIT.2010.2054295 
  19. «home [Erasure Coding for Distributed Storage Wiki]». 31 de julho de 2017. Consultado em 20 de agosto de 2023. Cópia arquivada em 31 de julho de 2017 

Ligações externas

editar

📚 Artikel Terkait di Wikipedia

Matriz (matemática)

in Context, ISBN 9780486809038, Dover  Roth, Ron (2006), Introduction to Coding Theory, ISBN 9780521845045, Cambridge University Press  Rowen, Louis Halle