当前位置: 首页 > 科技观察

基于日志(binlog),如何完成MySQL主从复制

时间:2023-03-21 20:31:07 科技观察

什么是MySQL主从复制?简单来说,就是保证主SQL(Master)和从SQL(Slave)的数据一致,向master插入数据。最后Slave会自动从Master同步修改后的数据(有一定的延时)。这种保证数据一致性的方式就是主从复制。MySQL主从可以解决什么问题?1.高可用因为数据是一样的,当Master挂掉的时候,可以指定一个Slave充当Master继续保证服务,因为数据是一致的(如果插入master,就会挂掉)可能会不一致,因为同步也是需要时间的),当然这个配置不是简单的用一个Slave作为Master,毕竟还需要考虑后续的Slave来同步Master,当然这个文章不是高可用配置,这里就不多说了。2.负载均衡因为读写分离也是一种负载均衡,所以就不单独写了,因为一般有多个Slave,所以读操作可以分配给Slave服务器(需要代码控制),然后再使用负载均衡来选择哪个Slave来提供服务。同时也可以将一些大规模的计算查询分配给某个Slave,这样就不会影响Master等查询的写入。3.数据备份一般我们都会做数据备份,可能是写定时任务,一些特殊行业可能还需要手动备份,有些行业要求备份的和原来的数据不能在同一个地方,所以主从可以很好的解决这个问题,不仅备份及时,而且多处备份,保证数据安全4.业务模块化。一个业务模块可以读取一个Slave,然后针对不同的业务场景创建数据库索引,根据业务选择MySQL存储引擎。5.高扩展(硬件扩展)主从复制支持两种扩展方式1.Scale-up向上扩展或垂直扩展,主要是提供比现在服务器性能更好的服务器,比如增加CPU和内存以及磁盘阵列等。因为有多台服务器,所以扩展性比单台服务器大2.Scale-out向外扩展或者水平扩展是指增加服务器数量的扩展,主要可以分散每台服务器的压力。主从复制的缺点1.增加成本无可厚非。搭建主从肯定会增加成本。毕竟一台服务器的成本和两台服务器的成本是完全不同的。另外,因为master和slave都必须开启binarylog,也会造成额外的性能消耗。2.数据延迟。slave从master复制过来,肯定有一定的数据延迟。因此,当刚插入后发生查询时,可能无法查询到。当然,如果插入者自己查询,可以直接向Master查询。当然,这也需要通过代码来控制。3.写入较慢Master-slavereplication主要针对读远多于写或对数据备份实时性要求较高的系统,因为Master在写入时需要较多的操作,而写入Master只有一个(因为我目前只会配置一个写Master),Master最多有一个Slave,用于Master挂掉后代替Master,一般不对外提供服务),写的压力无法分散.当然,如果你直接解决了这个问题,请留言指教和复制MySQL5.6中启动主从复制有两种方式:基于日志(binlog),基于GTID(全局事务标识符)。本文只涉及基于日志binlog的主从配置复制原理1.master将数据变化记录在二进制日志(binarylog)中,也就是配置文件log-bin指定的文件。这些记录被称为二进制日志事件(binarylogevents)2.Slave通过I/O线程读取Master中的二进制日志事件并写入其中继日志(relaylog)3.Slave重做Master中的事件relaylog,并在relaylog中写入一条event信息在本地执行一次,完成数据的本地存储,从而将变化反映到自己的数据中(数据重放)要求1.操作系统版本和编号主从服务器数量一致2.Master和Slave数据库版本必须一致3.Master和Slave数据库中的数据必须一致4.Master打开binarylog,Master和Slave的server_id必须是在局域网中独树一帜。我试过不同的版本,会不会有什么问题?有兴趣的可以试试),当然这个可以换成虚拟机或者Docker。我个人比较推荐使用Docker,比虚拟机消耗少很多。当然,它可能不如虚拟机。很方便,但是不需要一一配置。配置Master1、安装数据库2、配置my.cnf不同的系统,my.cnf的路径不同,这里只说明涉及修改的地方。添加配置[mysqld]##设置server_id,一般设置为IP,注意uniqueserver_id=100##Copyfilter:即指定哪些数据库不需要同步(mysql库一般不同步)binlog-ignore-db=mysql##开启二进制日志功能可以随意取,最好是有意义的(关键在这里)log-bin=edu-mysql-bin##为每个session分配的内存,用于存放二进制日志缓存duringthetransactionbinlog_cache_size=1M##主从复制的格式(mixed,statement,row,默认格式为statement)binlog_format=mixed##二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。expire_logs_days=7##跳过主从复制遇到的所有错误或指定类型的错误,避免从机复制中断。##例如:1062错误是指一些重复的主键,1032错误是因为主从数据库数据不一致:1.在Master上过滤binarylog中的事件2.在relaylog中过滤事件奴隶。Replicationtype1,statement-basedreplication在Master上执行的SQL语句,在Slave上执行相同的语句。MySQL默认使用基于语句的复制,效率更高。一旦发现不能准确复制,会自动选择row-basedreplication2.Row-basedreplication会将变化的内容复制到Slave中,而不是再次在Slave上执行命令。MySQL5.0起支持3.混合类型复制默认采用语句复制。一旦发现statement-basedreplication不能准确复制,就会使用row-basedreplication。3、创建数据同步用户CREATEUSER'slave'@'%'IDENTIFIEDBY'123456';GRANTREPLICATIONSLAVE,REPLICATIONCLIENTON*.*TO'slave'@'%';这里主要是给用户REPLICATIONSLAVE权限和REPLICATIONCLIENT权限配置Slave1,安装数据库2,配置my.cnf[mysqld]##设置server_id,一般设置为IP,注意uniqueserver_id=101##Copyfilter:即指定哪个数据库不需要同步(mysql数据库一般不同步)binlog-ignore-db=mysql##启用二进制日志功能进行备份当Slave是其他Slaves的Master时,log-bin=edu-mysql-slave1-bin##为每个会话分配的内存,用于存放二进制日志缓存binlog_cache_size=1M##主从复制的格式(mixed、statement、row,默认格式为statement)binlog_format=mixed##二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。expire_logs_days=7##跳过主从复制遇到的所有错误或指定类型的错误,避免从机复制中断。##例如:1062错误表示部分主键重复,1032错误是因为主从数据库数据不一致自己的二进制日志log_slave_updates=1##防止更改数据(特殊线程除外)read_only=1如果Slave是其他Slaves的Master,必须设置bin_log。配置完成后,重启mysql,完成Master和Slave的链接1.初始化数据,保证Master和Slave的数据一致,数据库不同步除外。2.查询Master状态。在Master中执行showmasterstatus;Value3.设置Slave中Master信息,执行changemastertomaster_host='192.168.1.100',master_user='slave',master_password='123456',master_port=3306,master_log_file='edu-mysql-bin.000001',master_log_posinSlave=攀上漂亮女局长之后1389上面执行的命令解释:master_host='192.168.1.100'##Master的IP地址master_user='slave'##同步数据的用户(Master中授权的用户)master_password='123456'##同步数据用户的密码master_port=3306##Master数据库服务端口masterlogfile='edu-mysql-bin.000001'##指定Slave开始读取和复制数据的日志文件(在MasterFile字段上执行命令的结果)masterlogpos=429##从哪个POSITIONnumbertostartreading(在Master上执行命令的结果的Position字段)masterconnectretry=30##重新建立主从连接时,如果连接建立失败,多久会重试。单位为秒,默认设置为60秒,同步延时调优参数。4、查看主从同步状态在Slave中执行showslavestatus命令;可以看到SlaveIOState为空,SlaveIORunning和SlaveSQLRunning为No,说明Slave还没有开始复制过程。反之,如果SlaveIORunning和SlaveSQLRunning都是Yes,就说明已经开始工作了。