
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
MySQL数据库开发架构是大多数Java程序员在开发软件的时候都需要熟练掌握的一个编程技术,而本文我们就通过案例分析来简单了解一下,MySQL架构实现原理分享。
MySQLReplication是官方提供的主从同步方案,用于将一个MySQL的实例同步到另一个实例中。Replication为保证数据安全做了重要的保证,是目前运用广的MySQL容灾方案。Replication用两个或以上的实例搭建了MySQL主从复制集群,提供单点写入,多点读取的服务,实现了读的scaleout。
mysql
上面的栗子,一个主库(M),三个从库(S),通过replication,Master生成event的binlog,然后发给slave,Slave将event写入relaylog,然后将其提交到自身数据库中,实现主从数据同步。
对于数据库之上的业务层来说,基于MySQL的主从复制集群,单点写入Master,在event同步到Slave后,读逻辑可以从任何一个Slave读取数据,以读写分离的方式,大大降低Master的运行负载,同时提升了Slave的资源利用。
优点:
1、通过读写分离实现横向扩展的能力,写入和更新操作在源服务器上进行,从服务器中进行数据的读取操作,通过增大从服务器的个数,能够极大的增强数据库的读取能力;
2、数据安全,因为副本可以暂停复制过程,所以可以在副本上运行备份服务而不会破坏相应的源数据;
3、方便进行数据分析,可以在写库中创建实时数据,数据的分析操作在从库中进行,不会影响到源数据库的性能;
实现原理
在主从复制中,从库利用主库上的binlog进行重播,实现主从同步,复制的过程中蛀主要使用到了dumpthread,I/Othread,sqlthread这三个线程。
IOthread:在从库执行startslave语句时创建,负责连接主库,请求binlog,接收binlog并写入relay-log;
dumpthread:用于主库同步binlog给从库,负责响应从IOthread的请求。主库会给每个从库的连接创建一个dumpthread,然后同步binlog给从库;
sqlthread:读取relaylog执行命令实现从库数据的更新。
来看下复制的流程:
1、主库收到更新命令,执行更新操作,生成binlog;
2、从库在主从之间建立长连接;
3、主库dump_thread从本地读取binlog传送刚给从库;
4、从库从主库获取到binlog后存储到本地,成为relaylog(中继日志);
5、sql_thread线程读取relaylog解析、执行命令更新数据。
不过MySQLReplication有个严重的缺点就是主从同步延迟。
因为数据是进行主从同步的,那么就会遇到主从同步延迟的情况。
为什么会出现主从延迟?
1、从库机器的性能比主库差;
2、从库的压力大;
大量查询放在从库上,可能会导致从库上耗费了大量的CPU资源,进而影响了同步速度,造成主从延迟。
3、大事务的执行;
有事务产生的时候,主库必须要等待事务完成之后才能写入到binlog,假定执行的事务是一个非常大的数据插入,这些数据传输到从库,从库同步这些数据也需要一定的时间,就会导致从节点出现数据延迟。
4、从库的复制能力较差;
如果从库的复制能力,低于主库,那么在主库写入压力很大的情况下,就会造成从库长时间数据延迟的情况出现。
如何解决?
1、优化业务逻辑,避免出现多线程大事务的并发场景;
2、提高从库的机器性能,减少主库写binlog和从库读binlog的效率差;
3、保证主库和从库的网络连接,避免出现网络延迟导致的binlog传输延迟;
4、强行读主库;
5、配合semi-sync半同步复制;
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。