故障现象:
有台物理机宕机,复制架构是master-master+半同步,期间触发了高可用容灾切换,后台显示成功切换到了备库。但是等旧主库起来后,主从状态正常,但是旧主库上却丢失了一部分数据,通过对比发现这些数据都是在宕机瞬间的写操作原因分析:
1 假设旧主库A丢失的数据记录为X,我们去A上解析发现宕机那段时间并无X记录的binlog信息,可确定在宕机瞬间该记录X没有binlog落盘;2 因为我们开了log_slave_updates,我们去新主库B上解析那段时间的binlog,发现存在binlog记录,并且server-id是A的,可确定这个X记录是旧主库A传给新主库B的,而不是B自己产生的
3 初步猜测,宕机瞬间旧主库A部分binlog没有落盘,但是却已经传到了新主库B,等旧主库通过redo异常恢复时,因为binlog中无X记录的操作,则直接回滚了该操作,导致A上无X记录,而X记录已经存在备库B的binlog中并成功执行,导致双主两边数据不一致
3 那么主要需要排查的就是:为什么主库binlog没有落盘的情况下,能否直接传给从库?
4 通过查看参数设置,发现A上将sync_binlog设置为0,即binlog落盘时间完全由操作系统决定,而不是每次操作都会将binlog落盘,这样旧主库A在宕机时就可能丢失部分binlog;
MYSQL_BIN_LOG::sync_binlog_file(bool force)
{
bool synced= false;
unsigned int sync_period= get_sync_p