AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 341229
Accepted
Avinash Pawar
Avinash Pawar
Asked: 2024-07-27 14:59:21 +0800 CST2024-07-27 14:59:21 +0800 CST 2024-07-27 14:59:21 +0800 CST

Diferença entre liberação e sincronização e gravação em disco (MySQL)

  • 772

Fico confuso com a terminologia como liberar e gravar no disco e sincronizar no disco. Alguém poderia me explicar qual é a diferença entre liberar, gravar e sincronizar no disco, especialmente no contexto do MySQL.

Eu costumava pensar que ambas eram as mesmas operações, mas ao ler vários conceitos isso me confunde.

Por exemplo. A documentação diz para a variável rpl_semi_sync_source_wait_point que, se eu defini-la como AFTER_SYNC , a origem grava as transações primeiro no log bin e na réplica e, em seguida, sincroniza o log binário no disco.

https://dev.mysql.com/doc/refman/8.0/en/replication-options-source.html#sysvar_rpl_semi_sync_source_wait_point

AFTER_SYNC (the default): The source writes each transaction to its binary log and the replica, and syncs the binary log to disk. 

Esta afirmação é em si confusa. Primeiro diz source writes each transaction to its binary log and the replicae depois dizsyncs the binary log to disk.

Então, o que exatamente está acontecendo neste caso. O que exatamente é liberar, sincronizar e gravar no disco no contexto do MySQL? A questão não é sobre sync_binlog ou qualquer outro parâmetro no MySQL. A questão é sobre liberar, sincronizar e escrever e quando essas atividades acontecem?

Novamente quando tentei ler mais, no link a seguir, explica que existe um cache binlog, um cache de página e uma operação fsync. Assim, quando uma transação acontece, se bem entendi, o buffer fica sujo, o conteúdo da transação é gravado no cache do log binário (no nível do MySQL), que é um cache separado para cada sessão, então o cache do log binário é gravado no cache da página ( no nível Linux), dependendo do sync_binlogvalor, ele é liberado/gravado/sincronizado com os arquivos no disco.

https://betterprogramming.pub/understanding-mysqls-binlog-4ac8de4d20ee

mysql
  • 1 1 respostas
  • 48 Views

1 respostas

  • Voted
  1. Best Answer
    Severalnines
    2024-07-30T23:49:18+08:002024-07-30T23:49:18+08:00

    Este é um tema complexo, mas vamos tentar falar um pouco sobre ele. Quando se trata de gravações “regulares” (INSERTs, UPDATEs, DELETEs), o processo é o seguinte (e, para deixar claro, não vou esclarecer todos os detalhes, como buffer de gravação dupla e outros).

    1. O aplicativo executa algumas consultas. As linhas modificadas são armazenadas no buffer pool como páginas sujas

    2. As alterações são gravadas nos redo logs (redo log do InnoDB)

    3. As alterações também são armazenadas no log binário, se estiver habilitado

    4. Então, dependendo da sync_binlogconfiguração (1), os logs binários podem ser sincronizados (persistidos, liberados) no disco antes que o COMMIT aconteça, após cada gravação.

    5. COMMIT acontece

    6. Dependendo dos innodb_flush_logs_at_trx_commitredo logs são:

      um. Liberado (sincronizado) para o disco no COMMIT (1) b. Gravado no disco no COMMIT, mas liberado após 1 segundo (2) c. Gravado no disco e liberado após 1 segundo (0)

    7. Mais tarde, em algum momento, os dados do buffer pool do InnoDB são gravados nos espaços de tabela e persistem lá eventualmente (limpando páginas sujas no buffer pool)

    Agora, qual é a diferença entre gravação e liberação (sincronização)? Escrever é apenas escrever. MySQL grava em um arquivo. Ele vai então para o cache do sistema de arquivos do sistema operacional e permanece lá na memória. Portanto, as gravações não são persistentes. Eles eventualmente serão (cada sistema operacional eventualmente irá gravá-lo no próprio arquivo), mas não imediatamente. Esta é a gravação dos mais rápidos, pois é armazenada em cache na memória. Em seguida, sincronizamos os dados com o disco. Nesse caso, o MySQL tentará forçar a persistência da gravação no disco. Como isso acontece é definido na innodb_flush_methodvariável, padrão para O_DIRECT + fsync() na maioria das distribuições Linux. Nesse caso, a gravação ignora os buffers do sistema de arquivos do sistema operacional e é executada diretamente na unidade de disco. Ou pelo menos é o que o MySQL pensa.

    Na realidade, você também deve considerar a configuração do sistema operacional, do armazenamento em disco ou até mesmo das próprias unidades de disco. Se você tiver SAN ou algum tipo de controlador RAID, provavelmente a gravação liberada não persistirá no disco, mas no cache do controlador SAN ou RAID. Até mesmo o próprio disco pode “falsificar” a liberação de dados e apenas armazená-los em seu buffer de gravação.

    No caso do seu exemplo, se você tiver sync_binlog=1qualquer outro cache deverá ser irrelevante. Binlogs são persistidos após cada gravação. Se você tiver sync_binlog=N, o MySQL poderá armazenar em cache N gravações no cache do log binário antes que elas sejam persistidas no disco.

    Já rpl_semi_sync_source_wait_point, define quando o nó de origem está aguardando o ACK das réplicas semi-sincronizadas. É assim no lado do aplicativo:

    1. COMEÇAR

    2. Executar consultas

    3. COMPROMETER-SE

    A diferença está no ponto 3. Se for AFTER_SYNC, o COMMIT será executado somente após as réplicas confirmarem que os dados estão armazenados em uma réplica, garantindo que não importa qual conexão você use na fonte para ler os dados, você verá o mesmo conteúdo . Se for AFTER_COMMIT, COMMIT será executado enquanto os dados ainda estiverem sendo persistidos nas réplicas. Isso significa que se você se conectar à origem usando outra conexão, verá os dados confirmados, mesmo que o cliente que os cometeu ainda espere que as réplicas confirmem que receberam os dados.

    • 2

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve