Estou confuso sobre write_location e flush_location de pg_stat_replication view . O documento diz, write_location significa a última posição do log de transações gravada no disco por este servidor em espera, flush_location significa a última posição do log de transações liberada no disco por este servidor em espera, isso faz alguma diferença?
Consulte a exibição pg_stat_replication no banco de dados primário
sent_location : Last transaction log position sent on this connection
write_location: Last transaction log position written to disk by this standby server
flush_location: Last transaction log position flushed to disk by this standby server
replay_location: Last transaction log position replayed into the database on this standby server
postgres=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid | 23453
usesysid | 24619
usename | repuser
application_name | node1
client_addr | 192.168.2.37
client_hostname |
client_port | 58412
backend_start | 2015-09-07 20:56:13.141438+08
backend_xmin |
state | streaming
sent_location | 2/3D397B1C
write_location | 2/3D397B1C
flush_location | 2/3D397B1C
replay_location | 2/3D390954
sync_priority | 1
sync_state | sync
As duas colunas em pg_stat_replication estão basicamente apontando a diferença entre
write(2)
efsync(2)
Da página de
write(2)
manual:Na
fsync(2)
página de manual:Em operação normal por padrão, o PostgreSQL chama fsync (ou fdatasync, se você estiver no linux), para garantir que os dados em um segmento WAL sejam bem e verdadeiramente gravados no disco.
Em operação normal, quando uma chamada de gravação acontece, ela basicamente copia esses dados do PostgreSQL para o cache do sistema de arquivos, que é apenas mais um bit de RAM. Se o servidor travar, você ainda perderá esses dados, porque ainda estão na RAM, embora seja apenas uma parte diferente da RAM.
Em
COMMIT
, porém, o PostgreSQL chamafsync
, o que força os dados do segmento WAL a serem gravados no disco, não apenas no cache do sistema de arquivos na RAM. O que garante que, após uma falha, os dados confirmados ainda sejam confirmados e possam ser reproduzidos.Ele também tem a vantagem adicional de precisar chamar
fsync
menos vezes para os arquivos de dados, porque todos os dados necessários para reproduzir adequadamente as alterações nesses arquivos estão contidos nos segmentos WAL, que são persistidos de forma durável no disco.Uma boa descrição desse comportamento no Linux pode ser encontrada no artigo Flushing Disk Buffers .
O comportamento de sincronização pode ser controlado com wal_sync_method e fsync
Espero que ajude a responder sua pergunta. =)