面试官:谈谈你对Mysql数据库读写分离的了解,而且有哪些注意事项?

这篇文章讲述的不是Mysql具体的如何实现读写分离,而是指何时须要上读写分离,及其相关的注意事项。java

由于用户的增多,数据的增多,单机的数据库每每支撑不住快速发展的业务,因此数据库集群就产生了!今天来讲说读写分离的数据库集群方式! 读写分离顾名思义就是读和写分离了,对应到数据库集群通常都是一主一从(一个主库,一个从库)或者一主多从(一个主库,多个从库),业务服务器把须要写的操做都写到主数据库中,读的操做都去从库查询。主库会同步数据到从库保证数据的一致性。 sql

主从集群
这种集群方式的本质就是 把访问的压力从主库转移到从库,也就是在单机数据库没法支撑并发读写的时候,而且读的请求不少的状况下适合这种读写分离的数据库集群。若是 写的操做不少的话不适合这种集群方式,由于你的数据库压力仍是在写操做上,即便主从了以后压力仍是在主库上和单机区别就不大了。

在单机的状况下,通常咱们作数据库优化都会加索引,可是加了索引对查询有优化,可是会影响写入,由于写入数据会更新索引。因此作了主从以后,咱们能够单独的针对从库(读库)作索引上的优化,而主库(写库)能够减小索引而提升写的效率。数据库

看起来仍是很简单的,可是有两点要注意:主从同步延迟、分配机制的考虑缓存

主从同步延迟

主库有数据写入以后,同时也写入在binlog(二进制日志文件)中,从库是经过binlog文件来同步数据的,这期间会有必定时间的延迟,多是1秒,若是同时有大量数据写入的话,时间可能更长。服务器

这会致使什么问题呢?好比有一个付款操做,你付款了,主库是已经写入数据,可是查询是到从库查,从库里尚未你的付款记录,因此页面上查询的时候你还没付款。那可不急眼了啊,吞钱了这还了得!打电话给客服投诉!并发

因此为了解决主从同步延迟的问题有如下几个方法:ide

一、二次读取

二次读取的意思就是读从库没读到以后再去主库读一下,只要经过对数据库访问的API进行封装就能实现这个功能。很简单,而且和业务之间没有耦合。可是有个问题,若是有不少二次读取至关于压力仍是回到了主库身上,等于读写分离白分了。并且若有人恶意攻击,就一直访问没有的数据,那主库就可能爆了。性能

二、写以后的立刻的读操做访问主库

也就是写操做以后,立马的读操做指定访问主库,以后的读操做采起访问从库。这就等于写死了,和业务强耦合了。优化

三、关键业务读写都由主库承担,非关键业务读写分离

相似付钱的这种业务,读写都到主库,避免延迟的问题,可是例如改个头像啊,我的签名这种比较不重要的就读写分离,查询都去从库查,毕竟延迟一下影响也不大,不会立马打客服电话哈哈。日志

分配机制的考虑

分配机制的考虑也就是怎么制定写操做是去主库写,读操做是去从库读。

通常有两种方式:代码封装、数据库中间件

一、代码封装 代码封装的实现很简单,就是抽出一个中间层,让这个中间层来实现读写分离和数据库链接。讲白点就是搞个provider封装了save,select等一般数据库操做,内部save操做的dataSource是主库的,select操做的dataSource是从库的。

优势:就是实现简单,而且能够根据业务定制化变化,为所欲为。

缺点:就是是若是哪一个数据库宕机了,发生主从切换了以后,就得修改配置重启。而且若是你的系统很大,一个业务可能包含多个子系统,一个子系统是java写的一个子系统用go写的,这样的话得分别为不一样语言实现一套中间层,重复开发。

代码封装数据访问层

二、数据库中间件 就是有一个独立的系统,专门来实现读写分离和数据库链接管理,业务服务器和数据库中间件之间是经过标准的SQL协议交流的,因此在业务服务器看来数据库中间件其实就是个数据库。

优势:由于是经过sql协议的因此能够兼容不一样的语言不须要单独写一套,而且有中间件来实现主从切换,业务服务器不须要关心这点。

缺点:多了一个系统其实就等于多了一个关心。。若是数据库中间件挂了的话对吧,并且多了一个系统就等于多了一个瓶颈,因此对中间件的性能要求也高,而且全部的数据库操做都要通过它。而且中间件实现很复杂,难度比代码封装高多了。

可是有开源的数据库中间件例如Mysql Proxy,Mysql Route,Atlas。

数据库中间件

总结

读写分离相对而言是比较简单的,比分表分库简单,可是它只能分担访问的压力,分担不了存储的压力,也就是你的数据库表的数据逐渐增多,可是面对一张表海量的数据,查询仍是很慢的,因此若是业务发展的快数据暴增,到必定时间仍是得分库分表。

可是正常状况下,只要当单机真的顶不住压力了才会集群,不要一上来就集群,没这个必要。有关于软件的东西都是越简单越好,复杂都是形势所迫。

通常咱们是先优化,优化一些慢查询,优化业务逻辑的调用或者加入缓存等,若是真的优化到没东西优化了而后才上集群,先读写分离,读写分离以后顶不住就再分库分表。


若有错误欢迎指正! 我的公众号:yes的练级攻略

相关文章
相关标签/搜索