1、什么是mysql主从同步?
当master(主)库的数据发生变化的时候,变化会实时的同步到slave(从)库。
2、主从同步有什么好处?
3、主从同步的原理是什么?
首先我们来了解master-slave的体系结构。
如下图:
不管是delete、update、insert,还是创建函数、存储过程,所有的操作都在master上。当master有操作的时候,slave会快速的接收到这些操作,从而做同步。
但是,这个机制是怎么实现的呢?
在master机器上,主从同步事件会被写到特殊的log文件中(binary-log);在slave机器上,slave读取主从同步事件,并根据读取的事件变化,在slave库上做相应的更改。
如此,就实现了主从同步了!
下面我们来详细的了解。
3.1主从同步事件有哪些
上面说到:
在master机器上,主从同步事件会被写到特殊的log文件中(binary-log);
主从同步事件有3种形式:statement、row、mixed。
3.2在master机器上的操作
当master上的数据发生改变的时候,该事件(insert、update、delete)变化会按照顺序写入到binlog中。
binlog dump线程
当slave连接到master的时候,master机器会为slave开启binlog dump线程。当master 的 binlog发生变化的时候,binlog dump线程会通知slave,并将相应的binlog内容发送给slave。
3.3在slave机器上的操作
当主从同步开启的时候,slave上会创建2个线程。
3.4如何在master、slave上查看上述的线程?
使用SHOW PROCESSLIST命令可以查看。
如图,在master机器上查看binlog dump线程。
如图,在slave机器上查看I/O、SQL线程。
4、讲了这么多,一图以蔽之
1、Introduction
之前写过一篇文章:Mysql主从同步的原理。
相信看过这篇文章的童鞋,都摩拳擦掌,跃跃一试了吧?
今天我们就来一次mysql主从同步实战!
2、环境说明
os:ubuntu16.04
mysql:5.7.17
下面的实战演练,都是基于上面的环境。当然,其他环境也大同小异。
3、进入实战
工具
2台机器:
master IP:192.168.33.22
slave IP:192.168.33.33
master机器上的操作
1、更改配置文件
我们找到文件 /etc/mysql/mysql.conf.d/mysqld.cnf
。
配置如下:
?
1 2 3 |
|
2、重启mysql,以使配置文件生效。
?
1 |
|
3、创建主从同步的mysql user。
?
1 2 3 4 5 6 7 8 9 10 |
|
4、为MYSQL加读锁
为了主库与从库的数据保持一致,我们先为mysql加入读锁,使其变为只读。
?
1 2 |
|
5、记录下来MASTER REPLICATION LOG 的位置
该信息稍后会用到。
?
1 2 3 4 5 6 7 |
|
6、将master DB中现有的数据信息导出
?
1 |
|
7、接触master DB的读锁
?
1 |
|
8、将步骤6中的dbdump.sql文件copy到slave
?
1 |
|
slave机器上的操作
1、更改配置文件
我们找到文件 /etc/mysql/mysql.conf.d/mysqld.cnf
。
更改配置如下:
?
1 2 3 |
|
2、重启mysql,以使配置文件生效
?
1 |
|
3、导入从master DB。 导出的dbdump.sql文件,以使master-slave数据一致
?
1 |
|
4、使slave与master建立连接,从而同步
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
MASTER_LOG_FILE='mysql-bin.000001'与MASTER_LOG_POS=613的值,是从上面的 SHOW MASTER STATUS 得到的。
主从形式
mysql主从复制 灵活
用途及条件
mysql主从复制用途
主从部署必要条件:
主从原理
mysql主从复制原理
从库生成两个线程,一个I/O线程,一个SQL线程;
i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
问题及解决方法
mysql主从复制存在的问题:
解决方法:
半同步复制
mysql semi-sync(半同步复制)
半同步复制:
主从复制--异步复制原理
半同步复制原理:
并行复制
mysql并行复制
设置
set global slave_parallel_workers=10;
设置sql线程数为10
其他
部分数据复制
主库添加参数:
binlog_do_db=db1 binlog_ignore_db=db1 binlog_ignore_db=db2
或从库添加参数
replicate_do_db=db1 replicate_ignore_db=db1 replicate_do_table=db1.t1 replicate_wild_do_table=db%.% replicate_wild_ignore_table=db1.%
联级复制(常用)
A->B->C
B中添加参数:
log_slave_updates B将把A的binlog记录到自己的binlog日志中
复制的监控:
show slave status \G
复制出错处理
常见:1062(主键冲突),1032(记录不存在)
解决:
总结
参考文献:
【1】Mysql主从同步的实现原理
【2】详解Mysql主从同步配置实战
【3】mysql 主从复制原理