2013-05-14 1 views
7

Il s'agit spécifiquement de maintenir la confiance dans l'utilisation de diverses solutions de réplication que vous seriez en mesure de basculer vers l'autre serveur sans perte de données. Ou dans une situation maître-maître que vous pourriez savoir dans un délai raisonnable si l'une des bases de données est tombée en désynchronisation.Vérification de la cohérence des données entre deux bases de données postgresql

Existe-t-il des outils pour cela, ou les gens dépendent-ils généralement du système de réplication lui-même pour prévenir les incohérences? Je suis actuellement le plus familier avec l'expédition postgresql WAL dans une configuration maître-veille, mais je considère une configuration maître-maître avec quelque chose comme PgPool. Cependant, comme cette solution est un peu moins directement liée à PostgreSQL (ma compréhension de base est qu'elle fournit la connexion qu'une application utiliserait, interceptant ainsi les diverses instructions SQL, et les enverrait ensuite à tous les serveurs de son pool) , ça m'a fait penser à vérifier la cohérence des données.

Exigences spécifiques:

  1. Je ne parle pas de la structure juste table. Je voudrais savoir que les données d'enregistrement sont les mêmes, afin que je sache si les enregistrements ont été corrompus ou manqués (dans ce cas, je vais réinitialiser la mauvaise base de données avec une sauvegarde récente + fichiers WAL avant de le ramener dans le pool)

  2. Les bases de données sont de l'ordre de 30-50 Go. Je doute que les requêtes SELECT brutes fonctionneraient très bien.

  3. Je ne vois pas le besoin de vérifier en temps réel (bien que ce serait, bien sûr, agréable). Horaire ou même quotidien serait mieux que rien.

  4. La vérification au niveau du bloc ne fonctionnerait pas. Ce serait deux bases de données avec un stockage indépendant.

Ou ce type de vérification n'est-il tout simplement pas réaliste?

+0

première pensée qui vient à l'esprit qui est la base de données agnostique est de hachage des lignes des deux côtés et savoir comment comparer les valeurs de hachage pour chaque ligne de db1 db2. La charge initiale de ce serait lente, mais si vous l'avez fait progressivement, ce n'est peut-être pas si mal. – Kuberchaun

+0

Voici un lien d'intérêt pour prolonger mon précédent commentaire. http: // stackoverflow.com/questions/9607063/checksum-champ-dans-postgresql-à-comparaison de contenu – Kuberchaun

Répondre

0

Si vous cherchez toute la table, vous devriez être en mesure de faire quelque chose comme ceci (en supposant une table qui correspond assez facilement dans la RAM):

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

Cela vous donnera un hachage sur la représentation de tuple sur les tables. Notez que vous pouvez diviser par plages, etc. Selon le type de réplication, vous pouvez même le diviser par plage de pages (pour la réplication en continu).

+0

Bien sûr, le ORDER BY doit aller dans le array_agg(), sinon cette requête ne fonctionnera pas du tout. – intgr

3

Vous pouvez vérifier les emplacements actuels WAL sur les deux machines ... Si elles représentent la même valeur, cela signifie que vos bases de données sous-jacentes sont compatibles les uns avec les autres ...

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

vous pouvez également vérifier avec l'aide des processus de walsender et 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 
Questions connexes