MySQL数据库的主从复制方案类似于使用scp/rsync等命令的文件级复制。就是数据的远程传输,但是MySQL的主从复制是它自带的功能,不需要借助第三方工具。而且MySQL的主从复制并不是直接复制数据库磁盘上的文件,而是通过逻辑binlog日志复制到本地服务器进行同步,然后本地线程读取日志中的SQL语句,重新应用到MySQL数据库。1.1.1MySQL主从复制简介MySQL数据库支持单向、双向、链式级联、环形等不同业务场景的复制。复制过程中,一台服务器作为主服务器(Master),接收用户更新的内容,同时一台或多台服务器作为从服务器(Slave),从主服务器binlog文件中接收日志内容,解析出SQL重新更新到从服务器,使主从服务器数据一致。如果设置了链式级联复制,则从(slave)服务器本身不仅作为从服务器,而且作为它下面的从服务器的主服务器。链级复制类似于A→B→C的复制形式。1.1.2MySQL主从复制的企业应用场景MySQL主从复制集群功能使得MySQL数据库支持大规模、高并发读写成为可能,有效保护物理服务器情况下的数据备份停机时间。应用场景一:从服务器作为主服务器的实时数据备份。主从服务器架构的设置可以大大增强MySQL数据库架构的健壮性。例如:当主服务器出现问题时,我们可以手动或自动切换到从服务器继续提供服务。这时候从服务器的数据和主库宕机时的数据几乎一样。这类似于通过inotify+rsync将NFS存储数据同步到备份NFS服务器,只不过MySQL的复制方案是自带的工具。当使用MySQL的复制功能进行备份时,数据备份在硬件故障或软件故障的情况下有效,但是从库的备份功能在人为执行drop、delete等语句删除数据时无用.,因为从服务器也会执行删除语句。应用场景二:主从实时读写分离,从服务器实现负载均衡。主从服务器架构可以通过程序(PHP、Java等)或者代理软件(mysql-proxy、Amoeba等)实现用户(客户端)的请求和读、写分离,即让从服务器只处理用户选择查询请求,减少用户的查询响应时间和主服务器同时读写带来的访问压力。更新的数据(如update、insert、delete语句)仍然交给主服务器,保证主从服务器保持实时同步。应用场景三:根据业务重要性拆分多个从服务器Access可以根据公司业务拆分多个不同的从服务器。例如:有为外部用户提供查询服务的从服务器,有供内部DBA用于数据备份的从服务器,还有为开发人员提供内部人员访问、脚本、日志分析、查询等服务的从服务器。这样的拆分除了可以减轻主服务器的压力,还可以让数据库独立于外部用户浏览、内部用户业务处理、DBA备份。具体如下图所示:2.1MySQL主从读写分离实现方案(1)通过程序实现读写分离(性能最高,推荐)PHP和Java程序都可以通过以下方式轻松连接设置多个连接文件实现对数据库的读写分离,即当语句的关键字为select时,会连接到读数据库的连接文件,如果是update、insert、delete,它将连接到写入数据库的连接文件。通过程序实现读写分离的缺点是需要开发者修改程序使其对下层透明,但这种方式更易于开发和实现,适用于互联网业务场景。(2)通过开源软件实现读写分离MySQL-proxy、Amoda、Mycat、Altas等代理软件也可以实现读写分离功能。这些软件的稳定性和功能一般,不推荐生产使用。绝大多数公司往往采用应用端开发方案来实现读写分离。(3)大型门户独立开发DAL层综合软件百度、阿里等大型门户都有开发者会花大力气开发一系列适合自身业务的功能,如读写分离、负载均衡、监控等并报警,自动扩张,自动收缩。DAL层软件。3.1MySQL主从复制原理介绍MySQL的主从复制是一个异步复制过程(虽然一般感觉是实时的),数据会从一个MySQL数据库(我们称之为Master)复制到另一个MySQL数据库(我们称之为Slave),Master和Slave之间实现整个主从复制的过程是通过三个线程来完成的。Slave端有两个线程(SQL和IO线程),Master端还有一个线程(I/O线程)。要实现MySQL主从复制,必须先在Master端开启Binlog记录功能,否则无法实现。因为整个复制过程其实就是Slave从Master端获取BInlog日志,然后在Slave上按照相同的顺序执行获取到的binlog日志中记录的各种SQL操作。要启用MySQL的BInlog记录功能,可以通过在MySQL配置文件my.cnf中的mysqld模块中添加“log-bin”参数选项来实现。具体信息如下:[mysqld]log-bin3.2MySQL主从复制原理详细过程描述下面简单介绍一下MySQLReplication的复制原理过程。1)在Slave服务器上执行startslave命令打开主从复制开关,主从复制开始。2)此时Slave服务器的I/O线程会通过Master上的授权复制用户权限请求连接到Master服务器,并请求从指定位置读取指定的Binlog日志文件(log文件名和位置在配置master中)复制服务时执行changemaster命令后发送Binlog日志内容。3)Master服务器收到Slave服务器I/O线程的请求后,其上负责复制的I/O线程会根据I/O线程请求的信息,批量读取指定的Binlog日志文件从属服务器。Binlog日志信息,然后返回给Slave端的I/O线程。返回的信息除了Binlog日志的内容外,还包括Master服务器端记录的新Binlog文件的名称,以及新Binlog中下一次指定的更新位置。4)当Slave服务器的I/O线程获取到Master服务器上I/O线程发送的日志内容,日志文件和location点,就会将Binlog日志内容写入Slave的RelayLog端依次(即relaylog日志)文件(MySQL-relay-bin.xxxxxx),并在master-info文件中记录新的Binlog文件名和位置,以便下次读取新的Binlog日志在Master端,可以告诉Master服务器需要从新的Binlog日志的指定文件和位置开始请求新的Binlog日志内容。5)Slave服务器上的SQL线程会实时检测本地RelayLog中I/O线程新增的日志内容,然后及时将RelayLog文件中的内容解析成SQL语句,以及在自己的Slaveserver上解析SQL语句依次执行这些SQL语句,并在relay-log.info中记录当前应用relaylog的文件名和位置。经过以上过程,可以保证Master端和Slave端执行的是同一条SQL语句。当复制状态正常时,Master端和Slave端的数据是完全一样的。当然,MySQL的复制机制也有一些特例。详情请参考官方说明。在大多数情况下,您无需担心。下面重点总结一下MySQL主从复制的原理。主从复制是一种异步的逻辑SQL语句级复制。复制时,主库有1个I/O线程,从库有2个线程,I/O和SQL线程。所有被复制的MySQL节点的server-id不能相同。binlog文件只记录改变数据库的SQL语句(从数据库内容改变),不记录任何查询(select、slow)语句。5.6SQL多线程写入GTID(不用找location点)3.3主从复制实践1.准备主从server-id不同的主库log_bin2.准备主库mysql-S/data/3306/mysql.sockgrantreplicationslaveon*.*to'rep'@'172.16.1.%'identifiedby'oldboy123';刷新权限;3.从主库获取数据到从库。复制前让slave和master保持一致。mysql-S/data/3306/mysql.sockmysql>flushtablewithreadlock;无法关闭窗口mysql>showmasterstatus;+--------------------+----------+|File|Position|+-------------------+------------+|oldboy-bin.000002|405|single开窗mysqldump-A-B--master-data=2-S/data/3306/mysql.sock|gzip>/opt/3306.sql.gz原窗口mysql>unlocktable;从数据库恢复:gzip-d/opt/3306.sql.gzmysql-uroot-poldboy123-S/data/3307/mysql.sockCHANGEMASTERTOMASTER_HOST='172.16.1.51',MASTER_PORT=3306,MASTER_USER='rep',MASTER_PASSWORD='oldboy123',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=405;#查看MASTER_LOG_FILEusesed-n22p/opt/3306.sql#查看主库#从库6.打开同步开关,检查是否同步。mysql>startslave;mysql>showslavestatusGSlave_IO_Running:YesSlave_SQL_Running:YesSeconds_Behind_Master:0从库配置信息说明mysql>CHANGEMASTERTOMASTER_HOST='172.16.1.51',#这里是主库的ipMASTER_PORT=3306,#这里是主库的端口,从库的端口可以和主库不同MASTER_USER='rep',#这里是用户rpoMASTER_PASSWORD='oldboy123',##这里是rep用户的密码MASTER_LOG_FILE='mysql-bin.000001',###这里是showmasterstatus时查看的二进制日志文件名,注意空格不要多MASTER_LOG_POS=405;##这里是showmasterstatus时查看的二进制日志文件的偏移量,注意不要有多余的空格主从复制练习
