这是关于在使用各种复制解决方案时保持信心,使您能够在不丢失数据的情况下将故障转移到另一台服务器。或者在主-主的情况下,您可以在合理的时间内知道其中一个数据库是否失去同步。
是否有工具可以解决这个问题,或者人们通常依赖复制系统本身来警告不一致?我目前最熟悉的是postgresql WAL在主-备用设置中发布,但我正在考虑使用PgPool之类的主-主设置。然而,由于该解决方案与PostgreSQL本身没有直接联系(我的基本理解是它提供了一个应用程序将使用的连接,从而拦截各种SQL语句,然后将它们发送到其池中的任何服务器上),它让我更多地考虑实际验证数据一致性。
特定要求:我说的不仅仅是表格结构。我想知道实际的记录数据是相同的,这样我就知道如果记录被损坏或丢失(在这种情况下,我会重新初始化坏的数据库与最近的备份+ WAL文件,然后把它带回池)
数据库大小为30- 50gb。我怀疑原始SELECT查询是否能很好地工作。
我不认为有必要进行实时检查(尽管它当然会很好)。每小时甚至每天都比没有好。
块级检查不起作用。这将是两个具有独立存储的数据库。
或者这种类型的验证根本不现实?
您可以检查两台机器上的当前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
如果您正在寻找整个表,您应该能够做这样的事情(假设一个表很容易适合RAM):
SELECT md5(array_to_string(array_agg(mytable), ' '))
FROM mytable order by id;
这将给你一个表上元组表示的哈希值。
请注意,您可以将其按范围等进行分解。根据复制的类型,您甚至可以将其按页面范围进行分解(用于流式复制)。