Mysql主从复制原理

来源:互联网 发布:制作淘宝店铺标志 编辑:程序博客网 时间:2024/05/15 19:09

对于一些访问量比较大的项目,我们常常采用数据库主从的方式进行读写分离,以分流用户操作,实现负载均衡。因此网上查找了相关的信息,做一个总结。下面的概念部分内容摘自百科或网络PPT,结尾的代码源自此次项目。


首先,需要在概念上进行了解:


负载均衡

负载均衡(Load Balance):将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,从而共同完成工作任务。主要分为两种类型:

1.集群(clustering)

单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,使系统处理能力得到大幅度提高。

2.分流

大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间,这主要针对Web服务器、FTP服务器、企业关键应用服务器等网络应用。主从架构就是这种类型的负载均衡。


主从架构的好处

1.负载均衡(读写分离,提升数据处理效率)

2.高可用和故障转移的能力(数据分布,稳定性提升。主服务器出现故障,还可以用从服务器支撑)

3.备份(本身不能备份,但是能提供一个备份机,便于实现数据库的容灾、备份、恢复等操作)

4.数据一致性,避免冲突

5.测试Mysql升级


Mysql的复制功能

1:支持一主多从机制。数据通过主服务器复制到从服务器上。

2:支持多级结构。主从,从从,主主(互为主从)。

3:支持过滤功能(可以只复制主服务器上的部分数据,而非全部)。


复制的类型

1. 基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的SQL语句。Mysql默认采用基于语句的复制,效率比较高。

2. 基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍(mysql5.0开始支持)。

3. 混合类型的复制:默认采用基于语句的复制。发现基于语句无法精确复制时,就会采用基于行的复制

相应的二进制日志也有三种:

1:STATEMENT

2:ROW

3:MIXED


服务器结构的要求

1:主从服务器中的表可以使用不同的表类型。另外:一台主服务器同时带多台从服务器,会影响其性能,可以拿出一台服务器作为从服务器代理,使用BLOCKHOLE表类型。只记录日志,不写数据,由它带多台服务器,从而提升性能。      

2:主从服务器中的表可以使用不同的字段类型。

3:主从服务器中的表可以使用不同的索引。主服务器主要用来写操作,所以除了主键和唯一索引等保证数据关系的索引一般都可以不加;从服务器一般用来读操作,所以可以针对查询特征设置索引。甚至:不同的从服务器可以针对不同的查询设置不同的索引。


复制流程

1:master服务器将改变记录到二进制日志文件(binary log)中,这些记录叫做二进制日志事件(binary log events)

2:slave服务器将master的binary log  events拷贝到他的中继日志(relay log)

3:slave重做中继日志的事件,将改变反映到它自己的数据。


Mysql Replication是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysqlinstance(我们称之 Slave)。在 Master Slave之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程) Slave端,另外一个线程(IO线程) Master端。


MySQL 复制的基本过程如下:

1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;

2. Master 接收到来自 Slave IO线程的请求后,通过负责复制的 IO线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave端的 IO线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master端的 BinaryLog文件的名称以及在 Binary Log中的位置;

3. Slave IO线程接收到信息后,将接收到的日志内容依次写入到 Slave端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我

4. Slave SQL线程检测到 Relay Log中新增加了内容后,会马上解析该 Log文件中的内容成为在 Master端真实执行时候的那些可执行的 Query语句,并在自身执行这些 Query。这样,实际上就是在 Master端和 Slave端执行了同样的 Query,所以两端的数据是完全一样的。


0 0
原创粉丝点击