Prevenção de gravação interrompida - Amazon Elastic Compute Cloud

Prevenção de gravação interrompida

A prevenção de gravação interrompida é um recurso de armazenamento em blocos desenvolvido pela AWS para melhorar a performance das workloads de banco de dados relacional com uso intenso de E/S e reduzir a latência sem afetar negativamente a resiliência dos dados. Bancos de dados relacionais que usam InnoDB ou XtraDB como mecanismo de banco de dados, como MySQL e MariaDB, se beneficiarão da prevenção de gravações interrompidas.

Normalmente, bancos de dados relacionais que usam páginas maiores do que a atomicidade de falha de energia do dispositivo de armazenamento usam mecanismos de log de dados para proteger contra gravações interrompidas. O MariaDB e o MySQL usam um arquivo buffer de gravação dupla para registrar dados em log antes de gravá-los nas tabelas de dados. No caso de gravações incompletas ou interrompidas, como resultado de falhas no sistema operacional ou perda de energia durante transações de gravação, o banco de dados pode recuperar os dados do buffer de gravação dupla. A sobrecarga adicional de E/S associada à gravação no buffer de gravação dupla afeta a performance do banco de dados e a latência da aplicação, além de reduzir o número de transações que podem ser processadas por segundo. Para obter mais informações sobre o buffer de gravação dupla, consulte a documentação do MariaDB e do MySQL.

Com a prevenção de gravações interrompidas, os dados são gravados no armazenamento em transações de gravação do tipo tudo ou nada, o que elimina a necessidade de usar o buffer de gravação dupla. Isso evita que dados parciais ou interrompidos sejam gravados no armazenamento em caso de falhas no sistema operacional ou perda de energia durante transações de gravação. O número de transações processadas por segundo pode ser aumentado em até 30%, e a latência de gravação pode ser reduzida em até 50%, sem comprometer a resiliência das workloads.

Definição de preço

Não há custos adicionais para o uso da prevenção de gravação interrompida.

Tamanhos de blocos e alinhamentos de limites de blocos compatíveis

A prevenção de gravação interrompida é compatível com operações de gravação para blocos de dados de 4 KiB, 8 KiB e 16 KiB. O endereço do bloco lógico inicial (LBA) do bloco de dados deve estar alinhado ao respectivo tamanho do limite do bloco de 4 KiB, 8 KiB ou 16 KiB. Por exemplo, para operações de gravação de 16 KiB, o LBA inicial do bloco de dados deve estar alinhado a um tamanho limite de bloco de 16 KiB.

A tabela a seguir mostra a compatibilidade de tipos de armazenamento e instância.

  Blocos de 4 KiB Blocos de 8 KiB Blocos de 16 KiB
Volumes de armazenamento de instâncias Todos os volumes de armazenamento de instância NVMe vinculados às instâncias da família I da geração atual. Instâncias i4i, Im4Gn e IS4gen compatíveis com SSD AWS Nitro.
Volumes do Amazon EBS Todos os volumes do Amazon EBS anexados a instâncias desenvolvidas no AWS Nitro System.

Para confirmar se sua instância e seu volume são compatíveis com prevenção de gravação interrompida, consulte se a instância é compatível com prevenção de gravação interrompida e outros detalhes, como tamanhos de blocos e limites compatíveis. Para ter mais informações, consulte Verifique o suporte e a configuração de prevenção de gravação interrompida.

Requisitos

Para que a prevenção de gravação interrompida funcione adequadamente, uma operação de E/S deve atender aos requisitos de tamanho, alinhamento e limite, conforme especificado nos campos NTWPU, NTWGU e NTWBU. Você deve configurar seu sistema operacional para garantir que o subsistema de armazenamento específico (sistema de arquivos, LVM, RAID etc.) não modifique as propriedades de E/S na pilha de armazenamento, incluindo mesclagens de blocos, divisões ou realocação de endereços de blocos, antes de ser enviada ao dispositivo.

A prevenção de gravação interrompida foi testada com a seguinte configuração:

  • Um tipo de instância e tipo de armazenamento que são compatíveis com o tamanho de bloco necessário.

  • Amazon Linux 2 com a versão de kernel 5.10 ou posterior.

  • ext4 com bigalloc habilitado e um tamanho de cluster de 16 KiB, e os utilitários ext4 mais recentes (e2fsprogs 1.46.5 ou posterior).

  • Modo de acesso a arquivos O_DIRECT para ignorar o cache do buffer do kernel Linux.

nota

Você não precisa desativar a mesclagem de E/S para workloads do MySQL e do MariaDB.

Verifique o suporte e a configuração de prevenção de gravação interrompida

Para confirmar se sua instância e volume são compatíveis com prevenção de gravação interrompida e para visualizar os dados específicos do fornecedor do namespace NVMe que contém informações de prevenção de gravação interrompida, use o comando a seguir.

$ sudo nvme id-ns -v device_name
nota

O comando retorna as informações específicas do fornecedor em hexadecimal com interpretação ASCII. Talvez seja necessário criar uma ferramenta, semelhante à ebsnvme-id, nas aplicações, que possa ler e analisar a saída.

Por exemplo, o comando a seguir retorna os dados específicos do fornecedor do namespace NVMe que contêm informações de prevenção de gravação interrompida para /dev/nvme1n1.

$ sudo nvme id-ns -v /dev/nvme1n1

Se sua instância e seu volume oferecerem suporte à prevenção de gravação interrompida, eles retornarão as seguintes informações de prevenção de gravação interrompida da AWS nos dados específicos do fornecedor do namespace NVMe.

nota

Os bytes na tabela a seguir representam a diferença em bytes do início dos dados específicos do fornecedor do namespace NVMe.

Bytes Descrição
0:31 O nome do ponto de montagem da conexão do dispositivo, por exemplo /dev/xvda. Você fornece isso durante a solicitação de anexo de volume e ele pode ser usado pela instância do Amazon EC2 para criar um link simbólico para o dispositivo de blocos NVMe (nvmeXn1).
32:63 O ID do volume. Por exemplo, .vol01234567890abcdef Esse campo pode ser usado para mapear o dispositivo NVMe para o volume anexado.
64:255 Reservado para uso futuro.
256:257 Tamanho da unidade de prevenção de gravação interrompida do namespace (NTWPU). Esse campo indica o tamanho específico do namespace da operação de gravação garantida para ser gravada atomicamente no NVM durante uma falha de energia ou condição de erro. Esse campo é especificado em blocos lógicos representados em valores baseados em zero.
258:259 Tamanho da granularidade de prevenção de gravação interrompida do namespace (NTWPG). Esse campo indica os incrementos de tamanho específico do namespace abaixo de NTWPU da operação de gravação garantida para ser gravada atomicamente no NVM durante uma falha de energia ou condição de erro. Ou seja, o tamanho deve ser NTWPG * n <= NTWPU onde n é um número inteiro positivo. O deslocamento do LBA da operação de gravação também deve estar alinhado com esse campo. Esse campo é especificado em blocos lógicos representados em valores baseados em zero.
260:263 Tamanho do limite de prevenção de gravação interrompida do namespace (NTWPU). Esse campo indica o tamanho do limite atômico desse namespace para o valor de NTWPU. Gravações nesse namespace que cruzam os limites atômicos não teê garantia de serem gravadas atomicamente no NVM durante uma falha de energia ou condição de erro. Um valor de 0h indica que não há limites atômicos para condições de falha ou erro de energia. Todos os outros valores especificam um tamanho em termos de blocos lógicos usando a mesma codificação do campo NTWPU.

Configure sua pilha de software para evitar gravações interrompidas

A prevenção de gravações interrompidas é habilitada por padrão em tipos de instância compatíveis com volumes compatíveis. Você não precisa habilitar nenhuma configuração adicional para habilitar seu volume ou instância para evitar gravações interrompidas.

nota

Não há impacto no performance em workloads que não são compatíveis com a prevenção de gravações interrompidas. Você não precisa fazer nenhuma alteração nessas workloads

As workloads que são compatíveis com prevenção de gravação interrompida, mas não estão configuradas para usá-la, continuam usando o buffer de gravação dupla e não recebem nenhum benefício de performance.

Para configurar sua pilha de software MySQL ou MariaDB para desativar o buffer de gravação dupla e usar a prevenção de gravação interrompida, conclua as seguintes etapas:

  1. Configure seu volume para usar o sistema de arquivos ext4 com a opção BigAlloc e defina o tamanho do cluster como 4 KiB, 8 KiB ou 16 KiB. O uso do BigAlloc com um tamanho de cluster de 4 KiB, 8 KiB ou 16 KiB garante que o sistema de arquivos aloque arquivos alinhados com o respectivo limite.

    $ mkfs.ext4 -O bigalloc -C 4096|8192|16384 device_name
    nota

    Para MySQL e MariaDB, você deve usar -C 16384 para corresponder ao tamanho da página do banco de dados. Definir a granularidade da alocação para um valor diferente de um múltiplo do tamanho da página pode resultar em alocações que podem ser incompatíveis com os limites de prevenção de gravação interrompida do dispositivo de armazenamento.

    Por exemplo:

    $ mkfs.ext4 -O bigalloc -C 16384 /dev/nvme1n1
  2. Configure o InnoDB para usar o método 0_DIRECT de descarga e desative a gravação dupla do InnoDB. Use seu editor de texto preferido para abrir /etc/my.cnf e atualize os parâmetros innodb_flush_method e innodb_doublewrite da seguinte forma:

    innodb_flush_method=O_DIRECT innodb_doublewrite=0
Importante

Se você estiver usando o Logical Volume Manager (LVM) ou outra camada de virtualização de armazenamento, certifique-se de que os deslocamentos iniciais dos volumes estejam alinhados em múltiplos de 16 KiB. Isso é relativo ao armazenamento NVMe subjacente para contabilizar os cabeçalhos de metadados e superblocos usados pela camada de virtualização de armazenamento. Se você adicionar um deslocamento ao volume físico do LVM, isso poderá causar desalinhamento entre as alocações do sistema de arquivos e os deslocamentos do dispositivo NVMe, o que invalidaria a prevenção de gravação interrompida. Para obter mais informações, consulte --dataalignmentoffset na página do manual do Linux.