我有几台服务器运行自己的特定MySQL
数据库实例,遗憾的是无法在复制/集群中设置。每个服务器将数据插入到几个与用户相关的表中,这些表之间有外键约束(例如user
,user_vote
)。以下是该过程的进行方式:
- 所有服务器都以相同的数据开始
- 每个服务器独立于其他服务器增长自己的数据集
- 定期地,来自所有服务器的数据手动合并在一起并应用回每个服务器(因此该过程从步骤 1 开始重复)。
这之所以成为可能,是因为除了其主键之外,该user
表还包含一个唯一email
字段,该字段允许识别每个数据库中已经存在哪些用户,并在更改主键和外键时合并新用户以避免冲突并维护正确的外键约束。它可以工作,但需要付出很大的努力,因为必须更改主键和外键以避免冲突,因此我的问题是:
有没有办法让每个服务器使用不与其他服务器冲突的主键来促进合并?
我最初想使用复合主键(例如server_id
,id
),但我使用Doctrine
的不支持由多个外键组成的主键,所以我的外键约束会出现问题。
我考虑过使用 aVARCHAR
作为 anid
并使用字符串的一部分作为前缀 (SERVER1-1,SERVER1-2, SERVER2-1, SERVER2-2 ...) 但我认为它会使数据库变慢我会必须对 id 进行一些操作(例如,在插入时,我必须解析现有 id 并提取最高值,增加它,将它与服务器 id 连接......)。
PS:另一种选择是通过从从属读取并写入到主控来实现复制,但由于复制滞后和主控上的单点故障等问题目前无法解决,因此该选项被丢弃。