postgresql - 验证两个postgresql数据库之间的数据一致性

标签 postgresql replication data-consistency

这特别是关于保持对使用各种复制解决方案的信心,您可以在不丢失数据的情况下故障转移到另一台服务器。或者在主对主的情况下,您可以在合理的时间内知道其中一个数据库是否不同步。

是否有任何工具可以解决这个问题,或者人们通常依赖复制系统本身来警告不一致?我目前最熟悉主-备设置中的 postgresql WAL 传输,但我正在考虑使用 PgPool 之类的主-主设置。然而,由于该解决方案与 PostgreSQL 本身的联系较少(我的基本理解是它提供应用程序将使用的连接,从而拦截各种 SQL 语句,然后将它们发送到其池中的任何服务器) ,它让我更多地考虑实际验证数据一致性。

具体要求:

  1. 我说的不只是表结构。我想知道实际记录数据是相同的,以便我知道记录是否损坏或丢失(在这种情况下,我会在将其恢复之前使用最近的备份 + WAL 文件重新初始化坏数据库入池)

  2. 数据库大约为 30-50 GB。我怀疑原始 SELECT 查询能否很好地工作。

  3. 我认为没有必要进行实时检查(当然,这会很好)。每小时甚至每天都比没有好。

  4. block 级检查不起作用。就是两个独立存储的数据库。

或者这种类型的验证根本不现实?

最佳答案

您可以检查两台机器上的当前 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

关于postgresql - 验证两个postgresql数据库之间的数据一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16550013/

相关文章:

postgresql 过程/触发器

ruby sequel gem - 如何使用 pg_array 扩展查询数组

postgresql - JPA 与很多 child 建立父/子关系

php - MySQL复制速度

asynchronous - 有哪些流行的框架可用于实现 CQRS、Event Sourcing 和 Saga 以实现数据一致性和分布式事务?

design-patterns - 跨微服务的数据一致性

postgresql - 如何设置 PostgreSQL 教程?

MongoDB,分片问题: fail mongos process after config server was crashed

postgresql - 带有 pglogical : ERROR: connection to other side has died 的 Postgres 复制

database - 数据完整性和数据一致性之间有什么区别吗?