2013-05-14 11 views
7

W szczególności chodzi o zachowanie pewności w używaniu różnych rozwiązań replikacji, które umożliwiłyby przełączenie awaryjne na inny serwer bez utraty danych. Lub w sytuacji master-master, którą możesz znać w rozsądnym czasie, jeśli jedna z baz danych nie jest zsynchronizowana.weryfikuje spójność danych między dwiema bazami danych PostgreSQL

Czy są na to jakieś narzędzia, czy ludzie na ogół zależą od samego systemu replikacji, aby ostrzec przed niespójnościami? Obecnie najlepiej poznałem wysyłkę WAL PostgreSQL w konfiguracji master-standby, ale rozważam konfigurację master-master z czymś podobnym do PgPool. Ponieważ to rozwiązanie jest nieco mniej bezpośrednio związane z samym PostgreSQL (moim podstawowym założeniem jest to, że zapewnia połączenie, z którego korzystałaby aplikacja, przechwytując różne instrukcje SQL, a następnie wysyła je do serwerów znajdujących się w puli) , skłoniło mnie to do zastanowienia się nad faktyczną weryfikacją spójności danych.

Szczególne wymagania:

  1. Nie mówię tylko o strukturze tabeli. Chciałbym wiedzieć, że rzeczywiste dane rekordów są takie same, więc wiedziałbym, czy rekordy zostały uszkodzone lub pominięte (w takim przypadku ponownie zainicjowałbym złą bazę danych za pomocą ostatnich kopii zapasowych + plików WAL przed ich przywróceniem do puli)

  2. Bazy danych są rzędu 30-50 GB. Wątpię, by surowe zapytania SELECT działały bardzo dobrze.

  3. Nie widzę potrzeby sprawdzania w czasie rzeczywistym (choć byłoby to oczywiście miłe). Godzinowe lub nawet codzienne byłoby lepsze niż nic.

  4. Sprawdzanie na poziomie bloku nie działa. Będą to dwie bazy danych z niezależną pamięcią masową.

Czy ten typ weryfikacji jest po prostu nierealny?

+0

pierwsza myśl, która przychodzi mi do głowy, że jest w bazie agnostyk jest hash wiersze z obu stron i dowiedzieć się, w jaki sposób porównać mieszań dla każdego wiersza w db1 do DB2. Początkowe obciążenie tego byłoby powolne, ale jeśli zrobiłeś to stopniowo, to może nie być tak źle. – Kuberchaun

+0

Oto link do interesującego mnie rozszerzenia mojego poprzedniego komentarza. http: // stackoverflow.com/questions/9607063/checksum-field-in-postgresql-to-content-comparison – Kuberchaun

Odpowiedz

0

Jeśli szukasz dla całej tabeli powinny być w stanie zrobić coś takiego (zakładając tabelę, która dość łatwo mieści się w pamięci RAM):

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

który daje hash na reprezentację krotki na stołach.

Należy zauważyć, że można to rozbić według zakresów itp. W zależności od typu replikacji można nawet podzielić go według zakresu stron (w przypadku replikacji strumieniowej).

+0

Oczywiście ORDER BY musi wejść do array_agg(), w przeciwnym razie zapytanie to w ogóle nie zadziała. – intgr

3

można sprawdzić aktualne lokalizacje WAL na obu maszynach ... Jeśli stanowią one taką samą wartość, to znaczy, czy bazy danych będące ich podstawą są zgodne ze sobą ...

$ 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) 

można również sprawdzić to z pomocą procesów walsender i 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 
Powiązane problemy