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