MYSQL中读写分离有什么样的好处呢,为什么一些人都选择读写分离?

现在绝大部分软件项目,都会使用到关系型数据库,比如MySQL、Oracle、DB2等等,目前这些数据库的单机性能已经是不断优化和提高了,但是随着数据增长的速度和并发访问量的增加,在某些公司、某些场景下,单机数据库已经很难满足业务的需要了,所以必须考虑数据库集群的方式来提高系统的可用性;最常见的两种方法:

  • 分库分表:把数据分散到不同的数据库上,每台数据库中存储的数据是不相同的(这里先不考虑每个库做备份或读写分离);分库分表既可以分散数据库访问的压力,也可以分散数据存储的压力;但是使用分库分表方案的时候,会带来扩容、事务、关联查询等问题和难点,具体这里就不展开讲了。

  • 读写分离:将数据库读操作和写操作分散到不同的节点上,通常是一台数据库做写操作,1到N台做读操作;读写分离的架构,每一台数据中的数据是相同的(这里先忽略延迟的问题),所以只分散了数据库访问的压力,并没有分散数据存储的压力;我们这里主要讲一讲读写分离。

MYSQL中读写分离有什么样的好处呢,为什么一些人都选择读写分离?

读写分离基本架构

MySQL读写分离的基本架构,可以参考下图:

MYSQL中读写分离有什么样的好处呢,为什么一些人都选择读写分离?

如上图,读写分离实现的基本步骤是:

  1. 数据库服务器搭建多台,一主N从(N大于等于1);

  2. 主数据库只负责写操作,从数据库只负责读操作;

  3. 主数据库复制数据到从数据库上;

  4. 客户端写操作路由到主数据库上,读操作路由到从数据库上。

读写分离还有另外一种架构,就是在MySQL数据库和客户端之间,增加一层中间代理层,客户端只连接代理, 由代理根据请求类型,把请求分发到不同的数据库上:

MYSQL中读写分离有什么样的好处呢,为什么一些人都选择读写分离?

  • 第一种架构,整体架构比较简单直接,性能会稍微高一些,但是如果才用直连的方式,客户端可能会稍微麻烦一些(通常需要引入一些组件,负责管理数据库);

  • 第二种架构,对客户端比较友好,因为客户端只需要和代理交互,并不用关注数据库的具体信息;但是因为多了一层代理,多多少少会对性能有一定的影响。

读写分离带来的好处

  • 读写分离结构中,会有两台甚至更多台数据库,这种冗余的设计,可以提高数据的安全性和系统的可用性;就算是在分库分表的架构中,每一台子库,也可以一主多备的部署方式;

  • 读写分离更多的时候使用在读操作远远大于写操作的场景下,这样可以保证写操作的数据库承受更小的压力,也可以缓解X锁和S锁争用;

  • 服务器数量的增加,意味着可以有效地利用多台服务器的资源;读操作被分摊,提高了系统的性能;

  • 如果写操作比读操作多,或者相近,可以采用双主相互复制的架构。

MYSQL中读写分离有什么样的好处呢,为什么一些人都选择读写分离?

读写分离会带来的问题

之前的文章,我也反复强调过,任何的架构、软件、框架、组件...在解决一部分问题的时候,一定会带来其他的问题;读写分离最大的一个问题就是,数据从主复制到从的过程中,可能会存在延迟的,如果客户端在执行完一个读操作后,立刻从存库中查询的话,可能会读取到旧数据的情况(我们不断优化,也只能缩短这个时间,并不能完全消除掉这个时间)。

那么针对这个问题,有哪些处理方法呢?

  • 根据具体场景进行评估,是否可以接收这个延迟(这好像是一句废话,但是大多数业务场景,是可以接收这点儿延迟的);

  • 对于实时性要求很高的场景(查询的数据必须是最新的结果),将这些请求强制路由到主库上;

  • 执行完写操作之后,在读操作发生之前,让中间的时间变长(也就是从业务操作角度来做一些控制,不一定操作完了立刻查询);

  • 判断主备无延迟,可以通过判断seconds_behind_master参数、对比GTID、对比位点等方式,判断从数据库是否和主数据库一致。

MYSQL中读写分离有什么样的好处呢,为什么一些人都选择读写分离?

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

MYSQL中读写分离有什么样的好处呢,为什么一些人都选择读写分离?

MYSQL中读写分离有什么样的好处呢,为什么一些人都选择读写分离?

数据库读写分离有哪些缺点?尤其是SqlServer数据库?

读写分离的缺点是,不能做到完全的实时同步。根据部署数据库的环境如服务器,网络,数据体量会有一定的数据延迟。

Mysql读写分离原理及主众同步延时如何解决?

我们知道,大型网站为了缓解高并发访问,往往会给网站做负载均衡,但这远远不够。我们还需要对数据库层做优化,因为大量的数据查询单靠一台数据库服务器很难抗得住,这时候我们就需要做读写分离了。

什么是读写分离?

所谓的“读写分离”是指将数据库分为了主库和从库,其中主库用来写入数据,(多个)从库用来读取数据。

MYSQL中读写分离有什么样的好处呢,为什么一些人都选择读写分离?

读写分离是为了解决什么问题的?

就大多数互联网项目而言,绝大多数都是“读多写少”,所以读操作往往会引发数据库的性能瓶颈,为了解决这个问题,我们就将对数据的读操作和写操作进行分离,避免读写锁带来的冲突,从而提升了数据库的性能。

通俗的说,读写分离是为了解决数据库的读写性能瓶颈的。

MySQL读写分离的原理

MySQL读写分离是基于主从同步的,因为读写分离是将数据读/写操作分流至不同的数据库节点服务器进行操作,这就涉及到了主库和从库的数据同步问题。

MySQL主从同步的原理是:主库将变更记录写入binlog日志(二进程日志),然后从库中有一个IO线程将主库的binlog日志Copy过来写入中继日志中,从库会从中继日志逐行读取binlog日志,然后执行对应的SQL,这样一来从库的数据就和主库的数据保持一致了。

MYSQL中读写分离有什么样的好处呢,为什么一些人都选择读写分离?

这里需要留意的是,从库同步数据时是串行而非并行操作的!!!即使在主库上的操作是并行的,那在从库上也是串行执行。所以从库的数据会比主库要慢一些,尤其是在高并发场景下延迟更为严重!

MySQL主从同步延时问题如何解决?

上面讲到了,之所以导致MySQL主从同步存在延迟的原因是从库同步数据时是串行而非并行执行的。

要解决主从同步延迟,有几个可行方案供大家参考:

1、我们可以使用并行复制来处理同步。什么是并行复制呢?并行复制指的就是从库开启多个线程并行读取relay log 中的日志;

2、对实时性要求严格的业务场景,写操作后我们强制从主库中读取;

以上就是我的观点,对于这个问题大家是怎么看待的呢?欢迎在下方评论区交流 ~ 我是科技领域创作者,十年互联网从业经验,欢迎关注我了解更多科技知识!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 xxx@163.com 举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论