假设我有一个汽车数据库。我有制作和模特(FK制作)。我打算让用户跟踪他们的汽车。每辆车都有FK到型号。现在,我有很多用户,我想分割我的数据库来分配负载。 Makes和Models表不会发生太大变化,但需要跨分片共享。我的想法是使用从复制品和模型的主数据库到每个从数据库的MySQL复制。我的问题是:我可以安全地写入从数据库,假设我不写入主数据库上的那些表吗?
在这个问题上,无论如何都要保证一个从数据库有最新的数据?例如,有人刚刚添加了“金牛座”制作,然后想要添加他们的汽车。我可以确保他们使用的从数据库具有最新的主数据吗?
答案 0 :(得分:6)
是的,一般情况下,您可以安全地写入未在主服务器上写入的从服务器上的表。如果您在从属设备上和主设备上执行诸如插入auto_increment
行之类的操作,那么您当然会遇到问题。您应该将该表配置为完全从复制中排除。
为了检查您是否拥有最新数据,SHOW SLAVE STATUS
包含一个字段Seconds_Behind_Master
,告诉您该奴隶是否是最新的。显然你希望它为零。当然,要确保插入和复制的数据存在,您需要等待一秒钟,然后然后看到Seconds_Behind_Master
为零。
答案 1 :(得分:5)
这是我在搜索时收集到的一个很好的解决方案
我在这里列出了主要观点:
MySQL主 - 主复制和自动增量索引
如果您正在使用主从复制,那么您很可能会设计应用程序,以便从主服务器或从服务器或多个从服务器读取主服务器。但是当您使用主 - 主复制时,您将读取和写入任何主服务器。因此,在这种情况下,自动增量索引的问题将会增加。当两个服务器都必须将记录(每个服务器同时不同)添加到同一个表中时。每一个都会为它们分配相同的索引并尝试复制到salve,这将产生一个碰撞。简单的技巧将允许避免MySQL服务器上的这种冲突。
在Master 1 / Slave 2上添加到/etc/my.cnf:
auto_increment_increment= 2
auto_increment_offset = 1
在Master 2 / Slave 1上添加到/etc/my.cnf:
auto_increment_increment= 2
auto_increment_offset = 2