MySQL主从复制(1)——基本概念

MySQL主从复制(1)——基本概念

MySQL主从复制允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。

一、主从复制的基本原理

MySQL之间数据复制的基础是二进制日志(binary log)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以【事件】的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志(relay log)中,然后slave的一个SQL线程会把相关的【事件】执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。主从复制的工作原理及工作过程如下图所示:
在这里插入图片描述
主从复制的工作过程:

step1、对master服务器的任何修改都会通过自己的I/O线程保存在二进制日志(Binary log)中;

step2、slave服务器上的I/O线程通过配置好的用户名和密码,连接到master服务器请求读取二进制日志,然后把读取到的二进制日志写到本地的中继日志(Realy log)中。同时把master返回的binlog文件名(master_log_file)和最新的位置(master_log_pos)信息写入master.info文件中;

step3、slave服务器的SQL线程会定时检查Realy log(relay log和binary log格式完全一样,也是二进制的),如果发现有更新,则立即把更新的内容在数据库上执行。

上述的主从复制的工作过程也可以用下图来表示:
在这里插入图片描述

说明:在主从复制架构中,所有的更新必须在主服务器上进行。否则会造成数据不一致问题。

二,mysql主从复制架构的优点

1、实现读写分离。将读和写应用在不同的数据库与服务器上。一个写入的数据库(主库,master),一个或多个读的数据库(从库,slave),各个数据库分别位于不同的服务器上,充分利用服务器性能和数据库性能。

2、提高系统的可靠性。当主数据库出现故障,从数据库可以替代主数据库继续工作,不影响业务。

3、实现负载均衡。当系统的并发量很大时,可以扩展从库的数量,并实现负载均衡。

三、MySQL支持的复制类型

MySQL主从复制的类型取决于主库的binlog日志的模式:

1、基于语句的复制。 在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。配置:binlog_format = ‘STATEMENT’。

2、基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。配置:binlog_format = ‘ROW’。

3、混合类型的复制。默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。配置:binlog_format = ‘MIXED’。

四、MySQL主从复制架构

1、搭建主从复制的基本原则

(1)每个Slave只能有一个Master;

(2)每个master和Slave必须制定一个唯一的服务器ID(server-id);

(3)每个Master可以有很多 Slave;

(4)通过设置log_slave_updates参数,一个Slave可以成为其他Slave的 Master(多级复制架构)。

2、一主多从复制架构

使用场景:在主库读取请求压力非常大的场景下,可以通过配置一主多从复制架构实现读写分离,把大量对实时性要求不是特别高的读请求通过负载均衡到多个从库上,降低主库的读取压力。在主库出现异常宕机的情况下,可以把一个从库切换为主库继续提供服务。

注意事项:
(1)当 Slave 增加到一定数量时,Slave 对 Master 的负载以及网络带宽会成为瓶颈;
(2)不同的 Slave 扮演不同的作用;
(3)用一个 Slave 作为备用 Master,只进行复制;
(4)用一个远程的 Slave,用于灾难恢复。

3、多级复制架构

使用场景:一主多从的架构能够解决大部分读请求压力特别大的场景需求,但主库的I/O压力和网络压力会随着从库的增加而增长,而使用多级复制架构就可以解决一主多从场景下,主库额外的I/O和网络压力。但多级复制场景下主库的数据是经历两次才到达读取的从库,期间的延时比一主多从复制场景下只经历一次复制的要大。

注意事项:可能存在延时较长的风险。

4、双主复制架构

使用场景:双主架构适用于写压力比较大的场景,或者DBA做维护需要主从切换的场景。

注意事项:最大问题是更新冲突。

五、配置主从同步

配置主从同步的过程,可以总结为如下的步骤:

step1、主服务器:(1)开启二进制日志(binary log);(2)配置server-id;(3)创建用于复制的用户。

step2、在每一个从服务器上:(1)开启中继日志(relay log);(2)配置server-id。

step3、在开始复制进程前,在主服务器上记录二进制文件的位置信息(show master status)。

step4、如果在开始复制之前,数据库中已经有数据,必须先把主服务器的数据导入到从服务器(可以使用mysqldump导出数据库,或者直接复制数据文件)。

step5、使用change master命令配置主从复制的信息。

step6、从复制开启主从复制(start slave),检查主从复制是否配置成功(show slave status)。

猜你喜欢

转载自blog.csdn.net/weixin_44377973/article/details/107135107