27 | 主库出问题了,从库怎么办?
Page content
27 | 主库出问题了,从库怎么办?
一主多从情况下的主备切换问题

基于位点的主备切换
个人理解: 主备同步时是基于 log file 和 position 位点信息的,为了不丢数据,可以选择一个稍微靠前的位点,然后在备库上跳过已经执行过的事务。 那么主备切换时,我们可以等新的主库 A’ 同步完 relay log,将其设置成可读写状态,获取最新的 log file 和原主库 A 断电时刻对应的 position 位点信息,然后在其它从库上设置新的主库为 A’,从新的 log file + position 处开始同步
注:即使 A 和 A’ 的日志相同,在同一时刻,两者的位点信息也是不同的
缺陷 首先 position 信息不是绝对精确的,这可能会导致一些问题:插入数据的事务被重复执行报主键冲突错误、删除数据时找不到对应的行; 针对这些情况,可以选择在主备切换的过程中跳过这些错误
GTID,5.6 引入
全局事务 ID,不同于之前所说的那个 transaction_id,事务开始时分配的那个id是严格递增的,即使事务被回滚,这个id也会被占用,而 GTID 在事务提交时才会被分配,可以理解成一个事务日志的唯一ID
每个数据库实例都会维护一个自己的 GTID 集合,当执行 relay log 中的事务时,如果发现这条事务的 id 已经存在于自己的集合中,则跳过不再执行
基于 GTID 的主备切换
从库 B 发送自己的 GTID 集合 set_b 给 A’,A’ 用自己的集合与 set_b 比对,找到所有差集,并找出最早的一条事务日志发给 B,就从这条日志的位置开始同步