通过参数来尽量保证主从同步的数据的安全
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压力比较大,所以
尽量将该信息写入到表的内部。
---------------------------------------------------------------------------




