暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 主从异步复制丢数据的原因

MySQLDBA运维零基础自学 2021-04-13
2236

通过参数来尽量保证主从同步的数据的安全

MySQL 异步复制
主库或者从库宕机的时候,容易丢数据

MySQL两阶段提交
innodb的redo日志的提交
innodb binlog的日志的提交

1.生成xid信息,以及将redo undo等写入内存的buffer

2.写binlog

3.将redo 日志真正的落盘


mysql内部的分布式的二阶段提交,第二阶段,binlog落盘就算是
提交成功



主库宕机情况
innodb_flush_log_at_trx_commit   sync_binlog没有配置双1
导致并不能严格保证每个事务的日志的写入,导致在主库的时候,提交的事务,并不一定已经写入硬盘,重启后,造成的日志的丢失
1.redo的trx_prepare未写入,但binlog写入,造成从库数据量比主库多。
2.redo的trx_prepare与commit都写入了,但是binlog未写入,造成从库数据量比主库少。


从库宕机的情况


mysql> select * from slave_master_info\G;
*************************** 1. row ***************************
       Number_of_lines: 25
       Master_log_name: mysql-bin.000001
        Master_log_pos: 154
                  Host: 192.168.3.10
             User_name: rep
         User_password: rep
                  Port: 3306
         Connect_retry: 60
           Enabled_ssl: 0
                Ssl_ca:
            Ssl_capath:
              Ssl_cert:
            Ssl_cipher:
               Ssl_key:
Ssl_verify_server_cert: 0
             Heartbeat: 30
                  Bind:
    Ignored_server_ids: 0
                  Uuid:
           Retry_count: 86400
               Ssl_crl:
           Ssl_crlpath:
 Enabled_auto_position: 0
          Channel_name:
           Tls_version:
1 row in set (0.00 sec)
------------------------------------------------------------------
mysql> select * from slave_relay_log_info\G;
*************************** 1. row ***************************
  Number_of_lines: 7
   Relay_log_name: home/mysql3306/mysql3306/mysql-relay.000002
    Relay_log_pos: 81248
  Master_log_name: mysql-bin.000001
   Master_log_pos: 81082
        Sql_delay: 0
Number_of_workers: 16
               Id: 1
     Channel_name:
1 row in set (0.00 sec)
-----------------------------------------------------------------------------------------------------------

可以配置

master_info
relay_log_info

可以放置到文件或者放置到表内部
MySQL5.7推荐大家把信息放置到MySQL的表内部

参数文件配置这两个信息的存放到表的内部
master_info_repository          = TABLE
relay_log_info_repository       = TABLE


如何保证主从数据一致性

---------------------------------------------------------------------------
IO线程高可靠性
IO线程接收一个个的event,将接收到的event,通过设置参数master_info_repository 可以将 master-info 信息(IO线程接收到的位置,Master_log_name和Master_log_pos )写入到文件( FILE )或者数据库( TABLE )中。
然后将 接收到的event写入relay log file
参数 sync_master_info=10000 表示  接收10000个event,写一次master-info


sync_master_info       10000
如果你配置的master_info放置到文件
IO线程同步多少event后,落盘一次master_info 文件


存在问题: master-info.log 和 relay-log 无法保证一致性。

relay-log-recover = 1
该参数表示当前接收到的relay-log全部删除,然后从SQL线程回放到的位置重新拉取(SQL线程通过配置后是可靠的)


SQL线程的安全性

sql线程造成的主从不一致
sync_relay_log_info    = 10000
就是有可能sql已经被应用,但是sync_relay_log_info在文件内部没有即使刷新,导致重启的时候
sql线程读取到了sync_relay_log_info没有更新的应用的位置,导致主从的数据不一致。


relay_log_info_repository=TABLE
可以将应用sql event和写入relay_log_info_repository的信息,划分到一个事务里面,
而事务是具有原子性的,那么就可以保证从库的sql线程的安全性。
配置relay_log_info_repository参数后,sync_relay_log_info = 10000失效

从库三个参数可以保证复制的安全性
relay-log-recover = 1 (IO线程)
relay_log_info_repository = TABLE(sql线程)
master_info_repository = TABLE


master_info_repository = TABLE
将IO同步的event位置信息写入到表里面,而不是文件内。
如果将master_info_repository = TABLE配置到表内部,可以大幅度提交主从的复制的效率。
5.7内部表级别的多线程的复制,如果存储于文件,对于文件的IO压力比较大,所以
尽量将该信息写入到表的内部。

---------------------------------------------------------------------------









最后修改时间:2021-04-14 09:14:55
文章转载自MySQLDBA运维零基础自学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论