2013-05-14 1 views
7

Это касается уверенности в использовании различных решений репликации, которые вы могли бы переустановить на другой сервер без потери данных. Или в ситуации мастер-мастера, которую вы могли бы знать в течение разумного промежутка времени, если одна из баз данных выпала из синхронизации.Проверка согласованности данных между двумя базами данных postgresql

Есть ли какие-либо инструменты для этого, или люди вообще зависят от самой системы репликации, чтобы предупреждать о несоответствиях? В настоящее время я больше всего знаком с доставкой Postgresql WAL в настройке master-standby, но я рассматриваю установку master-master с чем-то вроде PgPool. Однако, поскольку это решение немного меньше напрямую связано с самим PostgreSQL (мое основное понимание заключается в том, что он обеспечивает соединение, которое приложение будет использовать, перехватывая различные операторы SQL и затем отправляя их на все серверы в своем пуле) , это заставило меня больше думать о фактической проверке согласованности данных.

Особые требования:

  1. Я не говорю о просто структура таблицы. Я бы хотел знать, что фактические данные записи одинаковы, поэтому я знаю, были ли повреждены или пропущены записи (в этом случае я бы повторно инициализировал поврежденную базу данных с помощью последних файлов резервной копии + WAL, прежде чем вернуть их обратно в бассейн)

  2. Базы данных находятся в заказе 30-50 ГБ. Я сомневаюсь, что необработанные запросы SELECT будут работать очень хорошо.

  3. Я не вижу необходимости в проверке в реальном времени (хотя это, конечно, было бы неплохо). Почасовой или даже ежедневный был бы лучше, чем ничего.

  4. Проверка уровня блока не будет работать. Это были две базы данных с независимым хранилищем.

Или этот тип проверки просто не реалистичен?

+0

Первая мысль, которая приходит в голову, что это агностик база данных хэш строки с обеих сторон и выяснить, как сравнить хэши для каждой строки в DB1 к db2. Первоначальная загрузка этого будет медленной, но если вы делаете это постепенно, это может быть не так уж плохо. – Kuberchaun

+0

Вот ссылка, интересная для распространения моего предыдущего комментария. Http: // StackOverflow.com/questions/9607063/checksum-field-in-postgresql-to-content-сравнение – Kuberchaun

ответ

0

Если вы ищете для всей таблицы, вы должны быть в состоянии сделать что-то вроде этого (предполагая, что таблица, которая довольно легко помещается в оперативной памяти):

SELECT md5(array_to_string(array_agg(mytable), ' ')) 
    FROM mytable order by id; 

Это даст вам хэш представления кортежа на таблицах.

Обратите внимание, что вы можете разбить это на диапазоны и т. Д. В зависимости от типа репликации вы можете даже сломать его по диапазону страниц (для потоковой репликации).

+0

Конечно, ORDER BY должен пройти внутри array_agg(), иначе этот запрос не будет работать вообще. – intgr

3

Вы можете проверить текущее расположение WAL на обеих машинах ... Если они представляют то же значение, что означает, что ваши основные базы данных согласуются друг с другом ...

$ psql -c "SELECT pg_current_xlog_location()" -h192.168.0.10 (do it on primary host) 
pg_current_xlog_location 
-------------------------- 
0/2000000 
(1 row) 

$ psql -c "select pg_last_xlog_receive_location()" -h192.168.0.20 (do it on standby host) 
pg_last_xlog_receive_location 
------------------------------- 
0/2000000 
(1 row) 

$ psql -c "select pg_last_xlog_replay_location()" -h192.168.0.20 (do it on standby host) 
pg_last_xlog_replay_location 
------------------------------ 
0/2000000 
(1 row) 

вы также можете проверить это с помощью walsender и walreceiver процессов:

[do it on primary] $ ps -ef | grep sender 
postgres 6879 6831 0 10:31 ?  00:00:00 postgres: wal sender process postgres 127.0.0.1(44663) streaming 0/2000000 

[ do it on standby] $ ps -ef | grep receiver 
postgres 6878 6872 1 10:31 ?  00:00:01 postgres: wal receiver process streaming 0/2000000 

 Смежные вопросы

  • Нет связанных вопросов^_^