MySQL的复制机制

                                        作者:尹正杰 

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.MySQL复制介绍

1>.MySQL复制允许将主实例(master)上的数据同步到一个或多个从实例(slave)上,默认情况下复制是异步进行的,从库也不需要一直连接主库来同步数据;

2>.MySQL复制的数据粒度可以是主实例上所有的数据库,也可以是指定的一个或多个数据库,也可以是一个数据库里的指定的表;

3>.MySQL复制带来的优势在于:

扩展能力:
通过复制可以将MySQL的性分到一个或多个slave上。这要求所有的写操作和修改操作都必须在Master上完成,而读操作可以被分配到一个或多个salve上。将读写分离到不同服务执行之后,MySQL的读写性能得到提升。 数据库备份:
  由于从实例时同步主实例的数据,所以可以将备份作业部署到从库。 数据分析和报表:
  同样,一些数据分析和报表的实现可以在从实例执行,以减少对主库的性能影响。 容灾能力:
  可以在物理距离较远的另一个数据建立slave,保证在主实例所在地区遭遇灾难时,在另一个数据中心能快速恢复。

二.MySQL复制有两种方法

1>.传统方式

  基于主库的bin-log将日志事件和事件位置复制到从库,从库再加以应用来达到主从同步的目的。

2>.Gtid方式

  global transaction identitifiers 是基于事物来复制数据,因此也就不依赖日志文件,同时又能更好的保证主从库数据一致性。

三.MySQL复制有多种类型

1>.异步复制

  一个主库,一个或多个从库,数据异步同步到从库。

2>.同步复制

  在MySQL cluster中特有的复制方式。

3>.半同步复制

  在异步复制的基础上,确保任何一个主库上的事物在提交之前至少有一个从库已经收到该事物并日志记录下来。

4>.延迟复制

  在异步复制的基础上,人为设定主库和从库的数据同步延迟时间,即保证数据延迟至少是这个参数。

四.MySQL复制原理

1>.MySQL的复制原理

  

  如上图所示,MySQL复制的原理大致总结如下:

1>.在Slave 服务器上执行sart slave命令开启主从复制开关,开始进行主从复制。

2>.此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容

3>.Master服务器接收到来自Slave服务器的IO线程的请求后,二进制转储IO线程会根据Slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了binlog日志内容外,还有在master服务器端记录的新的binlog文件名称,以及在新的binlog中的下一个指定更新位置。

4>.当Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(MySQL-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容

5>.Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点

2>.MySQL复制有三种核心格式

  复制的工作原理是数据库修改记录到bin log日志并传递到slave,然后slave在本地还原的过程。而时间记录到bin log的格式会有所不同。

基于语句的复制(statement based replication):
  基于主库将SQL语句写入到bin log中完成复制。 基于行数据的复制(row based replication):
  基于主库将每一行数据变化的信息作为时间写入到bin log中完成日志。默认就是基于行级别的复制,因为它相对语句复制逻辑更为严谨。 混合复制(mixed based replication):
  上述两者的结合。默认情况下优先使用基于语句的复制,只有当部分语句如果基于语句复制不完全的情况下才会自动切换为基于行数据的复制。
[root@node101 ~]# mysql -uroot -pyinzhengjie
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.25-log MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
mysql> SHOW VARIABLES LIKE '%BINLOG_FORMAT%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.01 sec) mysql>

mysql> SHOW VARIABLES LIKE '%BINLOG_FORMAT%';                #查看日志信息

[root@node101 ~]# mysql -uroot -pyinzhengjie
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.25-log MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
mysql> SHOW VARIABLES LIKE '%BINLOG_FORMAT%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.01 sec) mysql>
mysql>
mysql> SET binlog_format='STATEMENT';
Query OK, 0 rows affected (0.00 sec) mysql>
mysql> SHOW VARIABLES LIKE '%BINLOG_FORMAT%';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec) mysql>
mysql>

mysql> SET binlog_format='STATEMENT';                     #修改为基于语句即复制

五.MySQL复制使用场景

  MySQL复制可以作为数据库备份的一种解决方案,由于主库的数据会复制到备库,所以可以在备库数据库备份作业而不影响主库的性能。

  当数据库比较小时,可以采用mysqldump的方式。由于mysqlddump出来的文件内容是SQL语句,所以可以很方便的将其中的一部分复制出来应用到其他数据库里。在执行mysqldump之前,为了保证数据的一致性,最好是把salve进程停掉。

[root@node102 ~]# mysqladmin -uroot -p stop-slave
Enter password:
Slave stopped
[root@node102 ~]#
[root@node102 ~]# mysql -uroot -p -e 'STOP SLAVE SQL_THREAD'
Enter password:
[root@node102 ~]#
[root@node102 ~]#
[root@node102 ~]# mysqldump --all-databases -uroot -p > fulldb.dump
Enter password:
[root@node102 ~]#
[root@node102 ~]# ll -h fulldb.dump
-rw-r--r--. root root 782K Mar : fulldb.dump
[root@node102 ~]#
[root@node102 ~]# mysqladmin -uroot -p start-slave
Enter password:
Slave started
[root@node102 ~]#

案例实操

  当数据库比较大时,采用mysqldump方式的效率不高,所以可以使用物理文件拷贝的方式。为了保证数据的一致性,物理备份需要将备份关闭。

[root@node102 ~]# mysqladmin -uroot -p shutdown
Enter password:
[root@node102 ~]#
[root@node102 ~]# grep datadir /etc/my.cnf
datadir=/yinzhengjie/softwares/mysql/data/
[root@node102 ~]#
[root@node102 ~]# cd /yinzhengjie/softwares/mysql/
[root@node102 mysql]#
[root@node102 mysql]# tar zcf yinzhengjie-dbbackup.tar.gz ./data
[root@node102 mysql]#
[root@node102 mysql]# ll yinzhengjie-dbbackup.tar.gz
-rw-r--r--. root root Mar : yinzhengjie-dbbackup.tar.gz
[root@node102 mysql]#
[root@node102 mysql]# /etc/init.d/mysql.server start
Starting MySQL. SUCCESS!
[root@node102 mysql]#
[root@node102 mysql]#
[root@node102 mysql]#

案例实操

  MySQL复制可以用在主库和从库采用不同的存储引擎的情况下。这样做的 目的通常是在主库和从库分别利用不同存储殷勤的优势,比如在主库使用InnoDB是为了事务功能,而从库使用MyISAM因为是只读操作而不需要事务功能。

  当使用mysqldump方式来创建备库时,改变备库的表存储引擎的方式就是在应用dump文件之前修改文件里的所有关于表存储引擎的地方。

  如果是使用文件拷贝的方式来创建备库时,则唯一修改备库表存储引擎的方式就是启动备库之后使用ALTER TABLE命令修改。

[root@node102 ~]# mysql -uroot -pyinzhengjie
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is
Server version: 5.7.-log MySQL Community Server (GPL) Copyright (c) , , Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
mysql> use course;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql>
mysql>
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| course |
+------------+
row in set (0.00 sec) mysql>
mysql> SHOW TABLES;
+------------------+
| Tables_in_course |
+------------------+
| course |
| dept |
| score |
| students |
| teacher |
+------------------+
rows in set (0.00 sec) mysql>
mysql>
mysql> STOP SLAVE;
Query OK, rows affected (0.01 sec) mysql>
mysql>
mysql> ALTER TABLE students ENGINE = 'InnoDB';
Query OK, rows affected (0.12 sec)
Records: Duplicates: Warnings: mysql>
mysql> START SLAVE;
Query OK, rows affected (0.00 sec) mysql>
mysql>

案例展示

  MySQL复制可以用来做负载均衡(一般都是一主多从架构)功能的水平扩展,最主要是讲数据库的读压力分担导多个MySQL slave实例上,这样的情况适用在读多写少的环境中。比如,一个WEB架构。

  MySQL复制可以用在当需要将主库上的不同数据库复制到不同的slave上,以便在不用的salve上执行不同的数据分析任务时。

  可以在每个slave上配置不同的参数来约束复制过来的数据,通过replicate-wild-do-tale参数或者replicate-do-db参数。

  slave1上应该配置参数replicate-wild-do-table=databaseA.%

  slave2上应该配置参数replicate-wild-do-table=databaseB.%

  slave3上应该配置参数replicate-wild-do-table=databaseC.%

  每个slave其实是接收到完整的bin log日志,但在应用环节中会进行过滤,仅应用符合参数配置的事件。

  在配置完参数之后,通过mysqldump的方式将对应的数据库在slave应用起来,在启动slave线程。

六.MySQL 案例实操

1>.MySQL5.7基于binlog的复制

  详情请参考 :https://www.cnblogs.com/yinzhengjie/p/10425185.html

2>.MySQL5.7延迟复制

  详情请参考 :https://www.cnblogs.com/yinzhengjie/p/10434414.html

 

MySQL的复制机制的更多相关文章

  1. MySQL复制机制原理

    背景介绍 复制,就是对数据的完整拷贝,说到为什么要复制,首先能想到的是怕数据意外丢失,使得用户蒙受损失. 当完成了数据复制之后,会发现它的优势不止这一点,假如一台机器宕机了,可以启用备份在另一台机器的 ...

  2. 与MySQL传统复制相比,GTID有哪些独特的复制姿势?

    与MySQL传统复制相比,GTID有哪些独特的复制姿势? http://mp.weixin.qq.com/s/IF1Pld-wGW0q2NiBjMXwfg 陈华军,苏宁云商IT总部资深技术经理,从事数 ...

  3. mysql的Replication机制

    mysql的Replication机制 参考文档:http://www.doc88.com/p-186638485596.html Mysql的 Replication 是一个异步的复制过程. 从上图 ...

  4. 浅谈MySQL Replication(复制)基本原理

    1.MySQL Replication复制进程MySQL的复制(replication)是一个异步的复制,从一个MySQL instace(称之为Master)复制到另一个MySQL instance ...

  5. 使用MySQL组复制的限制和局限性

    本节列出和解释了组复制相关的要求和限制. 1.组复制的要求 要使用组复制,每个MySQL节点必须满足以下条件: 1.1 基本要求 InnoDB存储引擎:数据必须存储在事务型的InnoDB存储引擎中.事 ...

  6. 004.Heartbeat+HAProxy+MySQL半复制高可用架构

    一 基础环境 节点 系统版本 MySQL版本 业务IP 心跳IP Master CentOS 7.5 MySQL 5.6 192.168.88.100 192.168.77.100 Slave Cen ...

  7. Mysql组复制之单主模式(一)

    环境 系统:CentOS release 6.9 (Final) Mysql:5.7 机器: S1 10.0.0.7 lemon S2 10.0.0.8 lemon2 S3 10.0.0.9 lemo ...

  8. MySQL 并行复制演进及 MySQL 8.0 中基于 WriteSet 的优化

    MySQL 8.0 可以说是MySQL发展历史上里程碑式的一个版本,包括了多个重大更新,目前 Generally Available 版本已经已经发布,正式版本即将发布,在此将介绍8.0版本中引入的一 ...

  9. PostgreSQL主备流复制机制

    原文出处 http://mysql.taobao.org/monthly/2015/10/04/ PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在 ...

随机推荐

  1. 下拉列表模仿placeholder效果

    模仿placeholder效果 <select id="IsTop"> <option value="" disabled selected& ...

  2. JavaScript——JS屏蔽F12和右键

    键盘表 来源:http://www.phpweblog.net/kiyone/archive/2007/04/19/1138.html 通过onkeydowm监听键盘按下事件,并修改键盘码 //禁止F ...

  3. Git——Git的简单介绍【一】

    官方网站 Git官网 https://git-scm.com/ GitHub https://github.com GitLab https://about.gitlab.com/ SVN https ...

  4. Gym100496H-House of Representatives-树

    树上每个元素有一个p,元素之间有距离d,计算一个元素u,使得sigma(d(i,u)*pi)最小. 两次dfs,第一次计算本节点以下的sigma(),第二次利用sump求解出ans. #include ...

  5. 【XSY1301】原题的价值 第二类斯特林数 NTT

    题目描述 给你\(n,m\),求所有\(n\)个点的简单无向图中每个点度数的\(m\)次方的和. \(n\leq {10}^9,m\leq {10}^5\) 题解 \(g_n\)为\(n\)个点的无向 ...

  6. 【BZOJ4868】[六省联考2017]期末考试(贪心)

    [BZOJ4868][六省联考2017]期末考试(贪心) 题面 BZOJ 洛谷 题解 显然最终的答案之和最后一个公布成绩的课程相关. 枚举最后一天的日期,那么维护一下前面有多少天可以向后移,后面总共需 ...

  7. cf1061E Politics (费用流)

    看到数据范围,考虑网络流..但考的时候完全不知道怎么建图 考虑流量表示选的点个数,费用表示选点的收益,跑最大费用最大流 那么我用一个点x表示某树中的询问点x,刨去它子孙询问点的子树后的子树 对于树1, ...

  8. 【linux】vim常用操作及vim插件的安装使用

    vim是linux下一个非常好用的文本编辑器,在linux下开发的人员要熟练掌握vim常用命令. 1.  打开在第n行 vim +143 filename.txt 2. 只读模式打开 vim -R / ...

  9. thinkphp5中__PUBLIC__的使用

    在使用thinkphp5.1开发的时候遇到设置__PUBLIC__无法生效的问题.这次的版本升级有比较大的改动,很多写法已经被更改,下面说下怎么去解决这个问题. 工具/原料   phpstorm ln ...

  10. hdu2586How far away ?(LCA LCATarjan离线)

    题目链接:acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:有n个点,同n-1条带有权值的双向边相连,有m个询问,每个询问包含两个数x,y,求x与y的最短距离. ...