[Bucardo-general] Primary Key Collisions in Multi-Master Environment

Joshua Tolley josh at endpoint.com
Mon Apr 12 23:40:13 UTC 2021


On Tue, Apr 13, 2021 at 08:30:29AM +1000, Michelle Sullivan wrote:
> The hard way is fix the software...  don’t rely on sequences for primary key
> generation unless you can ensure they are globally unique...  easy if you
> wrote the software yourself, not so easy if it’s someone else’s.

You can see if your primary keys are based on a sequence like this, in psql:

mydb=# \d mydb
                                           Table "public.mytable"
       Column  |           Type  | Collation | Nullable | Default
---------------+-----------------+-----------+----------+------------------------------------
 id            | integer         |           | not null | nextval('my_id_seq'::regclass)
...
 
Here the id column gets its default value from a sequence. It's possible to
define (or redefine) that sequence differently on each of your master servers,
so that each server generates primary keys taken from a unique set of possible
values. The easiest way I've seen to do this is with the INCREMENT BY option.
If I had two servers in a multi-master configuration, I'd define the sequence
like this on the first server:

CREATE SEQUENCE my_id_seq INCREMENT BY 2 START WITH 1;

This means it will generate ID values with only odd numbers: 1, 3, 5, etc. On
the other server, I'd do this:

CREATE SEQUENCE my_id_seq INCREMENT BY 2 START WITH 2;

This server will use only even numbers. Whereas before, the servers might
create records with the same ID under certain conditions, now they can't.

Some people might quite reasonably consider this a hacky solution. For
instance, it creates differences between the schema on one server compared to
the other. It may make maintenance more difficult. Another option might be to
use UUID values for primary keys. But as has already been noted, you will
probably need to do more than just depend on Bucardo to handle it for you.

-- 
Joshua Tolley
End Point Corporation
801 987 0252


More information about the Bucardo-general mailing list