MySQL主从同步延迟的原因及解决办法( 三 )


对于高并发事务的系统来说,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多 。所以很多MySQL DBA设置的sync_binlog并不是最安全的1,而是2或者是0 。这样牺牲一定的一致性,可以获得更高的并发和性能 。默认情况下,并不是每次写入时都将binlog与硬盘同步 。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能binlog中最后的语句丢失了 。要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使binlog在每N次binlog写入后与硬盘同步 。即使sync_binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性 。
2、innodb_flush_log_at_trx_commit (这个很管用)抱怨Innodb比MyISAM慢 100倍?那么你大概是忘了调整这个值 。默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的 。特别是使用电池供电缓存(Battery backed up cache)时 。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存 。日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新 。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据 。而值2只会在整个操作系统 挂了时才可能丢数据 。
3、ls(1) 命令可用来列出文件的 atime、ctime 和 mtime 。
atime 文件的access time 在读取文件或者执行文件时更改的ctime 文件的create time 在写入文件,更改所有者,权限或链接设置时随inode的内容更改而更改mtime 文件的modified time 在写入文件时随文件内容的更改而更改ls -lc filename 列出文件的 ctimels -lu filename 列出文件的 atimels -l filename 列出文件的 mtimestat filename 列出atime,mtime,ctimeatime不一定在访问文件之后被修改因为:使用ext3文件系统的时候,如果在mount的时候使用了noatime参数那么就不会更新atime信息 。这三个time stamp都放在 inode 中.如果mtime,atime 修改,inode 就一定会改, 既然 inode 改了,那ctime也就跟着改了.之所以在 mount option 中使用 noatime, 就是不想file system 做太多的修改, 而改善读取效能
(4)、MySql数据库从库同步其他问题及解决方案
1)、mysql主从复制存在的问题: ● 主库宕机后,数据可能丢失 ● 从库只有一个sql Thread,主库写压力大,复制很可能延时2)、解决方法: ● 半同步复制---解决数据丢失的问题 ● 并行复制----解决从库复制延迟的问题
3)、半同步复制mysql semi-sync(半同步复制)半同步复制: ● 5.5集成到mysql,以插件的形式存在,需要单独安装 ● 确保事务提交后binlog至少传输到一个从库 ● 不保证从库应用完这个事务的binlog ● 性能有一定的降低,响应时间会更长 ● 网络异常或从库宕机,卡主主库,直到超时或从库恢复4)、主从复制--异步复制原理、半同步复制和并行复制原理比较
a、异步复制原理:
b、半同步复制原理:
事务在主库写完binlog后需要从库返回一个已接受,才放回给客户端;5.5集成到mysql,以插件的形式存在,需要单独安装确保事务提交后binlog至少传输到一个从库不保证从库应用完成这个事务的binlog性能有一定的降低网络异常或从库宕机,卡主库,直到超时或从库恢复
c、并行复制mysql并行复制 ● 社区版5.6中新增 ● 并行是指从库多线程Apply binlog ● 库级别并行应用binlog,同一个库数据更改还是串行的(5.7版并行复制基于事务组)设置set global slave_parallel_workers=10;设置sql线程数为10
原理:从库多线程apply binlog在社区5.6中新增库级别并行应用binlog,同一个库数据更改还是串行的5.7版本并行复制基于事务组




推荐阅读