[Bucardo-general] Foreign key consistency

Hans van der Riet hans at electude.nl
Fri Sep 20 21:02:48 UTC 2013


Hans van der Riet wrote:
> Is there any way to avoid / resolve this type of inconsistency?

After doing some reading, I think Bucardo's design may break referential 
integrity in multi-master replication.

This is how I understand Bucardo works: It sets session_replication_role 
to 'replica' in Postgres. When it syncs, it deletes changed rows from 
all other dbs and copies them over from the source.

Even if you have all relevant tables in the same sync this causes a 
problem in the following scenario. An insert that references a row in 
the first database happens at (around) the same time as that row is 
deleted in the second database. When replication kicks in:

- there is no conflict because different rows changed in both databases
- the new row is inserted in the second database succesfully, the 
existence of the referenced row is not checked (because 
session_replication_role is 'replica' )
- the referenced row is deleted successfully in the first database 
without deleting the new row, the foreign key constraint doesn't block 
or cascade (because session_replication_role is 'replica')

So referential integrity is broken and you end up with a new row 
referencing a non-existing one.

Are my assumptions correct?

If so, maybe it is viable to ensure integrity by creating some triggers 
(before delete on the referenced tables) that are configured as ENABLE 
REPLICA, so they are executed during sync. Obviously this will come at 
some performance cost.

Kind regards,
-- 
Hans van der Riet


More information about the Bucardo-general mailing list