0、引言html
MySQL主从复制的原理及搭建,故障分析mysql
1、MySQL主从同步的架构及原理sql
原理:安全
1)Slave链接到master,主从数据一致,开启同步,开始同步数据微信
2) 用户在主上写入数据,日志储存到binlog,master上IO thread读取主库binlog,而后把信息传递给从库上的IO thread网络
3)从库上的IO thread再把部分信息存储在master.info(存储链接位置信息)和relay log里(存储binlog信息)架构
4)从库上的SQL thread监测到relay log有更新,把更新的信息恢复到从库,而后把位置点信息记录下来函数
2、MySQL实现主从同步的几种方式及使用价值工具
一、MySQL主从复制的几种实现方式性能
l 基于binlog+position的传统复制
l 基于事务的GTID复制
l 多源复制
l Group replication(5.7新特性)
l 半同步
二、MySQL主从复制的使用价值
l 利用从库作高可用
l 利用从库作读写分离
l 利用从库作升级
3、MySQL基于binlog三种模式下的复制
一、基于statement格式的复制
优势:binlog文件小,节省磁盘IO,只记录执行的SQL,方便阅读统计
缺点:对MySQL特殊函数不能复制,可能会致使主从不一致
二、基于row格式的复制
优势:详细记录每一行的修改信息(上下文信息),不会出现某些特定状况下函数、触发器、存储过程不执行的状况,方便flashback
缺点:binlog文件会更大,不能直接看到用户执行的SQL语句
三、基于mixed格式的复制
汇合使用row格式和statement格式,对于DDL记录会statement格式,对于table里的行操做记录为row格式。可是bug较多,不建议使用
4、MySQL的主从配置
一、创建用于同步的帐号(权限replication slave)
二、确保server-id全局惟一,并开启log-bin
三、备份主库,恢复到从库,确保主从数据一致
四、查看主库位置信息并配置链接,开启主从
Tips:
一、若是库表较多,可使用percona-tools工具集进行主从校验
二、也能够看slave status输出,了解同步情况
>show slave status\G;关注下面几个信息
Slave_IO_Running:从库I/O线程是否工做
Slave_SQL_Running:从库SQL线程是否工做
Seconds_Behind_Master:同步延迟时间,单位秒
Master_Log_File:主库上的I/O线程目前读到的binlog
Read_Master_Log_Pos:主库上的I/O线程目前读到的binlog的点
Relay_Master_Log_File:从库SQL线程目前执行到的主库binlog
Exec_Master_Log_Pos:从库SQL线程目前执行到的主库binlog的点
Relay_Log_File:从库SQL线程目前执行的relay log
Relay_Log_Pos:从库SQL线程目前执行的relay log的点
5、MySQL主从复制怎么保证数据一致性
在MySQL中,一次事务提交后,须要写undo、写redo、写binlog,写数据文件等等。在这个过程当中,可能在某个步骤发生crash,就有可能致使主从数据的不一致。那么如何保证复制数据一致性呢?
一、在master上修改配置,设置双一,保证每次提交后,日志落盘
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
二、在slave上修改配置,前两个选项是确保slave上和复制相关的元数据表也采用innoDB引擎,受到innoDB事务安全的保护,后一个选项是开启relay log自动修复机制,尽量避免数据丢失
master_info_repository = "TABLE"
relay_log_info_repository = "TABLE"
relay_log_recovery = 1
经过以上两个方式基本能够保证主从环境里数据一致性,若是仍是出现主从数据不一致,可经过pt-table-checksum 和 pt-table-sync 工具来进行数据的校验和修复。
6、MySQL主从复制常见问题及处理
MySQL同步中断常见是由两个方面引发:
I/O中断 :网络问题、主机宕机、受权改变
SQL中断:执行的SQL出错
一、主从复制过程当中,修改用于复制帐号的密码,致使主从不一样步
原来主从正常运行,后来修改用于复制帐号的密码,修改完后从新执行
change master to master_host='xxx.xxx.xxx.xxx', master_user='replication user', master_password='passwd', master_port=xxxx, master_log_file='mysql-binlog.000xxx', master_log_pos=xxx;
悲剧了,若是指定MASTER_HOST与MASTER_PORT参数,slave会认为master与以前的不是同一个(即使MASTER_HOST 与 MASTER_PORT所带的参数与以前相同),以前指定的master的binlog文件名及位置将再也不适用。
所以,更新密码后,只须要
change master to master_user='replication user', master_password='new passwd';
二、同步延时
seconds_behind_master>0
可能的缘由:
l 主库在大量导入数据
l 从库硬件跟不上,致使性能降低
l 从库读负载较大
l RAID卡充放电
三、常见的error code及意义
1062错误:
主键冲突,通常能够跳过此类错误或者在配置文件中设置slave-skip-errors=1062
1032错误:
找不到这条记录,能够在从库手动插入数据。或者跳过这个错误,要视状况而定。
1050错误:
从库上表存在了,直接删除这个表便可
参考文档:
FAQ系列 | 如何保证主从复制数据一致性
http://imysql.com/2015/11/20/mysql-faq-how-make-sure-replicate-data-consistant.shtml
为了方便你们交流,本人开通了微信公众号,和QQ群291519319。喜欢技术的一块儿来交流吧