关于MySQL的学习,市面上经常有千万级优化,亿级优化等等,好坏我就不评论了,我想说的是,千里之行,始于足下。良好的基础是学习任何知识的前提。MySQL的内容不仅仅是增删改查,还有很多其他的东西加进来的时候,触发什么锁操作,检查的时候怎么优化,集群是怎么工作的。实现,如何实现高并发等等,一切都需要明确基本原理。如果不了解原理,对知识的理解只是表面的,不深入研究很容易忘记。死记硬背是不够的,在实际的项目开发中,你会遇到很多关于MySQL的瓶颈。今天我们要讲一个知识点,那就是MySQL的binlog日志。1:什么是binlog?MySQL中有几种日志。Binlog是最重要的日志。主要用于记录DDL(数据库定义语言)和DML(数据库操作)语句,以事件的形式记录,包括语句的执行时间,是事务安全的。简单想想,MySQL主要是用来存储数据的,表数据是存储在磁盘上的,在高可用架构中,往往会采用主从模式。任何一个系统都需要保证稳定性和数据安全,那么MySQL系统用什么样的方式来保证呢,很简单,主要是用日志来保存。前端培训对数据表的任何操作,包括create、alter、drop、update、insert、delete,这些语句都会以日志的形式保存。既然我们知道了binlog日志是用来保存数据库操作语句的,那么我们就可以衍生出binlog日志的两个主要功能,主从复制和数据恢复。主从复制是一种比较常见的高可用架构模型。master把它的binarylog传递给slaves数据库,实现数据的一致性。后面会详细讲解MySQL的主从复制。数据恢复主要使用mysqlbinlog日志工具来恢复数据。2:如何操作binlog日志//查看日志开启状态showvariableslike'log_%';//只查看第一个binlog文件的内容showbinlogevents;//查看所有binlogshowmasterlogs;//查看当前写入Enteredbinlogshowmasterstatus;//查看指定binlog文件的内容showbinlogeventsin'mysql_bin_000025';3:binlog写入机制binlog写入逻辑比较简单:在事务执行过程中,先将日志写入binlog缓存,事务提交时,将binlog缓存写入binlog文件时,一个事务的binlog不可反汇编,所以不管事务有多大,都必须写一次。因此,这里涉及到一个优化问题。在实际项目开发中,需要减少大事务的发生,因为在实际项目中,使用主从复制,大事务频繁发生,容易导致主从延迟,需要一次性的大写入binlog日志数量,导致性能下降。系统给binlog缓存分配了一块内存,每个线程一块。参数binlog_cache_size用于控制单线程中binlog缓存占用内存的大小。如果超过了这个参数指定的大小,就必须暂时保存到磁盘中。当事务提交时,执行器将binlog缓存中的完整事务写入binlog,并清空binlog缓存。每个线程都有自己的binlogcache,但是共享同一个binlogfile_web前端训练。//查看binlog日志相关的配置showglobalvariableslike'%binlog%';这里重点关注sync_binlog配置项,这个配置项的值可以是0、1,N值为0:表示每次事务只写,不fsync到磁盘。值为1:表示每提交一个事务,fsync的值为N:表示每提交一个事务,就写入,但是fsync是在累积N个事务后进行的。在实际项目开发中,一般设置sync_binlog=1,每次提交事务都会将数据持久化到磁盘。fsync的过程是一个消耗性能的过程,所以这里有一个优化点:在出现IO瓶颈的场景下,fsync_binlog可以设置一个比较大的值,可以提高性能。4:Binlog日志主从复制MySQL的主从复制,恐怕是面试经常遇到的问题,是出题率比较高的一个考察点。在实际的项目开发中,很多公司也是采用主从复制架构来实现的。面试题:1:主从复制是如何实现的?2:有没有遇到主从延迟,如何解决?如何实现主从复制?主从延迟是通过从数据复制主库的binlog日志来实现的,涉及三个MySQL线程。首先,主库将数据变化记录在二进制binlog日志中。从数据库会监控和检测主二进制日志是否发生变化,如果改变,启动一个I/O线程请求master二进制事件,master节点为每个I/O线程启动一个dump线程向其发送二进制事件,并将binlog日志保存到relaylog,从节点会启动SQL线程读取二进制日志,在本地重新执行,保持数据与master节点一致。最后,I/O和SQL线程会进入休眠状态,等待下一次唤醒。如何避免主从延迟?主从延迟的出现是不可避免的。当master库数据量过大时,会造成线程阻塞和延迟,对业务影响较大。根据业务场景,实时性要求高和实时性要求不高的场景。解决方案如下:1:业务中写入数据时,增加批量写入的时间间隔,比如写入500条数据后,sleep(1)时间2:业务中有短暂的延迟,这可以通过在前端加一个倒计时功能解决视觉上避免3:在业务上,如果请求量不是很大,可以短时间请求主库4:MySQL采用分库架构,服务并行扩展,分布式压力5:MySQL提高数据库版本,采用多线程复制Binlog日志6:改进服务器硬件设备,选择多核多内存的服务器7:增加缓存层,当MySQLmaster数据更新,将更新写入缓存,读取数据时先读取缓存层数据,过期后从数据库中读取数据。文章来自曼巴架构算法
