MySQL主从复制的常见拓扑、原理分析以及如何提高效率
对于relay logs 文件的名称的命名规则默认使用的是 host_name-relay-bin.nnnnnn,以我的系统来说,其文件名默认为localhost-relay-bin.000001。对于索引文件的命名规则为host_name-relay-bin.index,同样在我的系统中的名称为localhost-relay-bin.index。这两个名称是可以通过—relay-log 和 –relay-log-index来改变的,其使用方式如下: mysqld_safe –user=mysql –relay-log=文件名 –relay-log-index=新索引文件名 & 在这里如果改变这两个名称的话,可能会引起‘不能打开relay log’文件和‘在初始化relay log 过程中不能发现目标log’等错误。这也算是mysql设计的一个bug,没有什么好的解决办法,如果我们不想使用默认的文件名称的话,唯一的办法就是我们可以预料到从服务器的主机名称可能在将来会发生改变,在开始初始化从服务器的时候就使用以上两个选项指定文件名,这样就可以使文件名不再依赖于服务器的主机名。 对于这些relay log文件并不是一直在增加的,当Slave SQL线程执行完一个relay log文件中所有的事件并且不再需要它的时候会把改relay log文件删除。由于是Slave SQL线程来做这些事情,所以也没有什么明确的规则来指定如何删除relay log文件 以上的所有内容大概描述了主从复制系统中从服务器的主要工作流程。 六、如何提高Mysql主从复制的效率? MySQL的主从复制,实际上就是Master记录自己的执行日志binlog,然后发送给Slave,Slave解析日志并执行,来实现数据复制。对于复制效率,binlog的大小是非常重要的因素,因为它涉及了I/O和网络传输 主从复制涉及到了两端:master/slave,看下这两端可以如何优化 (1)master 端 master端有2个参数可以控制 Binlog_Do_DB : 设定哪些数据库需要记录Binlog Binlog_Ignore_DB : 设定哪些数据库不要记录Binlog 这两项很重要,指定必要数据库,忽略不需要复制的数据库,可以减少binlog的大小,提高了I/O效率,加快网络传输。 但这两项也同样比较危险,需要谨慎使用,因为可能会有主从数据不一致和复制出错的风险。 因为MySQL判断是否须要复制某个Event,不是根据产生该Event的语句所在的数据库,而是根据执行时所在的默认数据库,也就是登录时指定的数据库,或运行“USE DATABASE”中所指定的数据库。 如果执行语句中明确指定了数据库名称,而这个数据库是被指定不记录Binlog的,那么这个语句在slave中执行时就会出错。 例如 garbage 库是被指定不记录日志的 product 库是指定要记录日志的 执行下面的语句 use product; delete from garbage.junk; delete语句会被发送给slave,但slave中没有garbage库,所以执行时报错,复制失败 (2)slave 端 slave端有6个参数可以控制 Replicate_Do_DB : 设定须要复制的数据库,多个DB用逗号分隔 Replicate_Ignore_DB : 设定可以忽略的数据库 Replicate_Do_Table : 设定须要复制的Table Replicate_Ignore_Table : 设定可以忽略的Table Replicate_Wild_Do_Table : 功能同Replicate_Do_Table,但可以带通配符来进行设置 Replicate_Wild_Ignore_Table : 功能同Replicate_Ig-nore_Table,可带通配符设置 slave端的配置优化效果要明显小于master端的,因为master端日志都写完了,日志也传过来了 但这几个参数可以帮助我们减少日志的应用量,因为设置了过滤,实际写入的sql数量变少了,slave端的复制也就加快了。 【编辑推荐】
点赞 0 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |