请教下各位大佬,关于 mysql 的双主复制问题

2019-07-02 17:24:40 +08:00
 demos
做双主复制时按照网上的教程,为了防止自增主键冲突
设置了
auto-increment-increment = 2 //每次增长 2
auto-increment-offset = 1 //设置自动增长的字段的偏移量,即初始值为 1

B 设置了
auto-increment-increment = 2 //每次增长 2
auto-increment-offset = 2 //设置自动增长的字段的偏移量,即初始值为 2

这样 A 数据的自增主键就变成了 1、3、5、7 ....
B 数据的自增主键就变成了 2、4、6、8 ...

现在有个问题的是,这个主键同时也是外键,被别的表给引用,例如用户表的主键 id,代表用户 ID
在记录用户登录记录时 insert loginlog(userid, time, ip) values(1,xxx,xxx)
这条语句被同步到 B 的时候,userid 也是 1,但实际上,用户在 B 上的 ID 是 2。

这样 B 表的数据就会错乱,请问这种问题怎么解决,因为之前的业务没考虑这种复制问题,想在想到的解决办法是,用个新的 userid 字段代表用户 ID,但是这种改动太大了, 请问各位大佬还有没有其它办法,或者是我的双主复制做的有问题呢,谢谢。
5648 次点击
所在节点    MySQL
24 条回复
sujin190
2019-07-03 17:20:38 +08:00
@lannoooW #18
@demos #19 mysql 主从还有发 sql 的,难道不应该主库提交之后把数据发给从库么?否则像 update a set updated_at=now() 这样的语句岂不是主从得到的时间不一致了,怎么可能啊
lannoooW
2019-07-03 17:48:45 +08:00
@demos 看了下确实 mixed 模式下默认是 statement 模式。官方的解释是这样的:
“ With statement-based replication, there may be issues with replicating nondeterministic statements. In deciding whether or not a given statement is safe for statement-based replication, MySQL determines whether it can guarantee that the statement can be replicated using statement-based logging. If MySQL cannot make this guarantee, it marks the statement as potentially unreliable and issues the warning, Statement may not be safe to log in statement format.

You can avoid these issues by using MySQL's row-based replication instead.”
也就是说用 MIXED 的模式或者 statement 模式不能保证两边数据是没问题的,像你这种场景还是 row 模式复制比较合适
lazyfighter
2019-07-03 17:52:20 +08:00
看的我一脸懵逼,不是复制吗咋 id 还变了呢
lazyfighter
2019-07-03 18:14:36 +08:00
@lazyfighter 我孤陋寡闻了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/579370

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX