MySQL-主从详细解说版

一.高可用架构方案

1.负载均衡

有一定高可用性
LVS 
Nginx

2.主备系统

有高可用性,但是需要切换
Keepalived
MHA
MMM

3.真正高可用

Oracle RAC
innoDB cluster (MGR)
NDB Cluster
Sysbase cluster 

二. 主从复制

1.主从复制简介

a.基于二进制日志复制的
b.主库的修改操作会记录二进制日志
c.从库会请求新的二进制日志并回放,最终达到主从数据同步
d.主从复制优势:处理物理损坏
  逻辑损坏:drop,delete,truncate(数据库内部误操作)
  物理损坏:磁盘,数据,系统(数据库外部损坏)

2.主从复制核心作用

a.辅助备份,处理物理损坏
b.扩展新型的架构:高可用,高性能,分布式架构等

3.主从复制前提

a.两台以上mysql实例 ,server_id,server_uuid不同
b.主库开启二进制日志
c.专用的复制用户
d.保证主从开启之前的某个时间点,从库数据是和主库一致(补课)
e.告知从库,复制user,passwd,IP port,以及复制起点(change master to)
f.线程(三个):Dump thread  IO thread  SQL thread 开启(start slave)

三. 搭建主从

1.主授权

grant replication slave on *.* to repl@'10.0.0.%' identified by '123';

2.将主库全备

mysqldump  -S /data/3307/mysql.sock -A -R --triggers -E --master-data=2 --single-transaction >/tmp/full.sql
(有账户和密码记得 -uroot -p)
(-R 存储过程)
(--triggers 触发器)
(-E 触发事件)
(--single-transaction 基于快照备份)

3.进从库进行导入

a.临时关闭日志
set sql_log_bin=0
b.进行备份数据
source /tmp/full.sql
c.开启从库设置参数
CHANGE MASTER TO
  MASTER_HOST='10.0.0.205',
  MASTER_USER='repl',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3307,
  MASTER_LOG_FILE='mysql-bin.000004',
  MASTER_LOG_POS=1394,
  MASTER_CONNECT_RETRY=10;
d.开启从库
start slave

四.主从复制牵扯的东东

1.主从复制过程中涉及到的文件

a.主库:
  二进制日志(binlog)
b.从库:
  中继日志(relaylog)
  master.info(主库信息)
  relay-loh.info(中继日志信息)

2.主从复制过程中涉及到的线程

a.主库:
  Binlog_Dump_Thread(DT)
b.从库:
  Slave_IO_Thread     (IT)
  Slave_SQL_Thread  (ST)

3.主从故障

1.IO线程故障

a.连接主库
  IP
  Port
  用户信息
  防火墙 
  网络
  连接数上限
b.请求和接受二进制日志
  日志不全

2.主从延时

a.主库做了修改操作,从库比较长时间才能追上
b.外在因素
  网络
  主从硬件差异较大
  版本差异
  参数因素

1.主库问题

  1.二进制日志写入不及时
  2.CR的主从复制中,binlog_dump线程,事件为单元,串行传送二进制日志(5.5/5.6版本)
  3.主从并发量事务大,主库亦可以并行,传送时串行
  4.主库由于串行传送,会产生阻塞后续事务
d.解决方案
  5.6开始,开启GTID实现GC(group commit)机制,可以并行传输日志给从库IO
  5.7开始,不开启GTID,胡自动维护匿名的GTID,也能实现GC,我们建议还是人为开启GTID
  大事务拆成多个小事务,可以有效的减少主从延时

2.从库问题

a.SQL线程导致的主从延时
  在CR复制情况下: 从库默认情况下只有一个SQL,只能串行回放事务SQL
  1.主库如果并发事务量较大,从库只能串行回放
  2.主库发生了大事务,会阻塞后续所有事务运行
b.解决方案
  1. 5.6版本开启GTID后,加入SQL多线程特性,但是只能针对不同库下的事务进行并发回放
  2. 5.7版本开启GTID后,在SQL方面基于逻辑时钟(logical_clock),主库同一时段,binlog记录时加入seq_no机制,从而时间事务级别并发回放 
  (多线程从库 MTS)

3.SQL线程功能:

(1)读写relay-log.info 
(2)relay-log损坏,断节,找不到
(3)接收到的SQL无法执行

4.导致SQL线程故障原因分析:

1. 版本差异,参数设定不同,比如:数据类型的差异,SQL_MODE影响
2.要创建的数据库对象,已经存在
3.要删除或修改的对象不存在  
4.DML语句不符合表定义及约束时.  
归根揭底的原因都是由于从库发生了写入操作.
Last_SQL_Error: Error 'Can't create database 'db'; database exists' on query. Default database: 'db'. Query: 'create database db'

5.处理方法(以从库为核心的处理方案):

方法一:
stop slave; 
set global sql_slave_skip_counter = 1;
将同步指针向下移动一个,如果多次不同步,可以重复操作。
start slave;
方法二:
/etc/my.cnf
slave-skip-errors = 1032,1062,1007
常见错误代码:
1007:对象已存在
1032:无法执行DML
1062:主键冲突,或约束冲突
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容