Время задержки при репликации

Alf162
Дата: 06.02.2015 10:10:16
Добрый день!
Хочется посмотреть, насколько отстает запись в slave-таблицу от записи в master-таблицу при потоковой репликации в PostgreSQL 9.3. Для этого сделал таблицу test_time из 2 полей: id(integer), t(text). Добавил триггер:

my_time:=to_char(current_timestamp, 'HH12:MI:SS:MS:US');
update test_time set t=my_time where id=new.id;

И поставил этот триггер на after update. В итоге и на мастере, и на слейве время совпадает.
Подскажите, пожалуйста, где может быть ошибка или как сделать по-другому?
лопата
Дата: 06.02.2015 10:17:15
Alf162
Добрый день!
Хочется посмотреть, насколько отстает запись в slave-таблицу от записи в master-таблицу при потоковой репликации в PostgreSQL 9.3. Для этого сделал таблицу test_time из 2 полей: id(integer), t(text). Добавил триггер:

my_time:=to_char(current_timestamp, 'HH12:MI:SS:MS:US');
update test_time set t=my_time where id=new.id;

И поставил этот триггер на after update. В итоге и на мастере, и на слейве время совпадает.
Подскажите, пожалуйста, где может быть ошибка или как сделать по-другому?
ошибка в днк.

никакие триггера на слейве при потоковой репликации не работают.
//а вот при триггерной -- сколько угодно.

для реализации вашей задачи надо всё время читать чем-то внешним таблицы слейва, например
Alf162
Дата: 06.02.2015 10:31:02
лопата
Alf162
Добрый день!
Хочется посмотреть, насколько отстает запись в slave-таблицу от записи в master-таблицу при потоковой репликации в PostgreSQL 9.3. Для этого сделал таблицу test_time из 2 полей: id(integer), t(text). Добавил триггер:

my_time:=to_char(current_timestamp, 'HH12:MI:SS:MS:US');
update test_time set t=my_time where id=new.id;

И поставил этот триггер на after update. В итоге и на мастере, и на слейве время совпадает.
Подскажите, пожалуйста, где может быть ошибка или как сделать по-другому?
ошибка в днк.

никакие триггера на слейве при потоковой репликации не работают.
//а вот при триггерной -- сколько угодно.

для реализации вашей задачи надо всё время читать чем-то внешним таблицы слейва, например

Понятно. А штатными средствами типа pg_stat_replication и можно нельзя решить подобную задачу?
Гость_0
Дата: 06.02.2015 11:18:59
Alf162,
select pg_last_xact_replay_timestamp();
daevy
Дата: 06.02.2015 11:34:43
Alf162
Понятно. А штатными средствами типа pg_stat_replication и можно нельзя решить подобную задачу?

slave $> select now() - pg_last_xact_replay_timestamp() as lat_time;
master $> select pg_xlog_location_diff(sent_location,replay_location) as lag_bytes from pg_stat_replication;
Alf162
Дата: 06.02.2015 13:54:28
Гость_0
Alf162,
select pg_last_xact_replay_timestamp();

Спасибо, помогло. Вычисляя разницу между тем, что записал триггер в базу и значением pg_last_xact_replay_timestamp() как раз и получаю искомое время задержки.
Maxim Boguk
Дата: 06.02.2015 14:04:44
Alf162
Гость_0
Alf162,
select pg_last_xact_replay_timestamp();

Спасибо, помогло. Вычисляя разницу между тем, что записал триггер в базу и значением pg_last_xact_replay_timestamp() как раз и получаю искомое время задержки.


надо понимать что если на мастер не идет никакой записи то pg_last_xact_replay_timestamp() на реплике не меняется так как нет транзакций к replay и визуально кажется что лаг репликации растет хотя этого на практике не наблюдается...
рекомедуется заодно смотреть в pg_stat_replication на мастере