Que unidades usaram para medir a localização do xlog?

2

Para monitorar o atraso de replicação de um servidor PostgreSQL para outro, estou usando um script simples que executa a consulta "SELECT pg_current_xlog_location ()" no servidor mestre e "SELECT pg_last_xlog_receive_location ()" no escravo. Em seguida, converto os resultados de hexadecimal em decimal e calculo a diferença para obter o atraso de replicação.

Meu problema é que não consigo descobrir em que unidades este xlog_location está retornado. Alguém pode explicar isso?

    
por NickTX 14.06.2012 / 17:20

2 respostas

2

"As unidades não importam" (mas se você está curioso, as unidades estão posição no log de transações - há um pouco de discussão aqui ).

É importante notar que existe NO correlação positiva entre a posição do registro e o tempo.
Grandes transações podem fazer com que o log avance muito em um curto período.
Os bancos de dados usados levemente podem ficar no mesmo ponto de registro por horas (ou mais).

Tudo o que você pode saber dessa medida é o quão longe está no log (ou seja, que você está ou não sincronizado com o mestre e aproximadamente a quantidade de dados que precisa ser enviada / reproduzida).

Há mais algumas discussões aqui no Postgres Wiki , mas a julgar pela sua pergunta, acho que você já leu Página - Pode valer a pena perguntar na lista de discussão pgsql-admin do Postgres para obter esclarecimentos (e você pode aparecer uma resposta melhor do que a que eu dei a você, e talvez seja capaz de atualizar o Postgres Wiki também: -)

    
por 14.06.2012 / 18:12
1

A unidade de registro está em bytes (embora sejam relativos - então eles não são úteis para medir nada além de "offsets", e às vezes pode haver "saltos" onde há muitos bytes ignorados), com o valor sendo computado como:

Se você pegar a saída de: SELECT pg_current_xlog_location (), você verá algo como:

70/A9002358

A parte antes do "/" é multiplicada por 'ff000000' e adicionada à segunda parte:

na linguagem python (convertendo o hex para dentro com a função int ('HEX', 16)) que pode se parecer com isto:

int('ff000000',16)*int('70',16) + int('A9002358',16)

Você pode localizar o nome do arquivo WAL em uso usando:

select pg_xlogfile_name(pg_current_xlog_insert_location());

Tecnicamente, é "possível" que um escravo alcance o mestre se os arquivos de log que o escravo precisa ainda estiverem disponíveis no mestre. É claro que, se o escravo estiver repetindo lentamente, ele pode nunca acompanhar - mas você pode medir se ele está "alcançando" ou "ficando para trás" (mais ou menos) usando a consulta abaixo:

No escravo, você pode ter uma ideia do atraso usando a consulta:

SELECT extract(epoch from (now()-
              pg_last_xact_replay_timestamp())) AS time_lag;

No entanto, o número retornado lá é na verdade o "tempo desde a última transação repetida do mestre" - então se o mestre não teve uma transação por um tempo que o "tempo" pode fazer parecer que o escravo está ficando para trás (quando é realidade, é pego, mas não houve transações no mestre.)

    
por 07.12.2015 / 17:38

Tags