page contents

架构:数据库读写分离

当业务发展到一定阶段,数量上去之后,数据库可能会成为性能的瓶颈。此时就需要一些架构调整去优化数据库的访问,而数据库的读写分离就是其中的一种手段。不过要注意的是读写分离会增加系统的复杂性。在使用读写分离之前,先进行单机优化,比如sql语句的优化,表设计的优化或者增加缓存等。在充分利用单机性能之后,再考虑读写分离。另外,读写分离也是有适用场景的。

attachments-2023-03-nISdVGIG64058af99fdad.jpeg

当业务发展到一定阶段,数量上去之后,数据库可能会成为性能的瓶颈。此时就需要一些架构调整去优化数据库的访问,而数据库的读写分离就是其中的一种手段。不过要注意的是读写分离会增加系统的复杂性。在使用读写分离之前,先进行单机优化,比如sql语句的优化,表设计的优化或者增加缓存等。在充分利用单机性能之后,再考虑读写分离。另外,读写分离也是有适用场景的。


数据库读写分离适用于读多写少的场景。整体的架构思路是,将数据库的读和写拆分开,数据库整体以一台主库负责写请求,多台从库负责读请求的方式对外提供服务。这样,在大量读的业务中,可以利用增加从库的方式扩展数据库读的性能。但是如果业务的写请求量也很大,那么写请求依然存在瓶颈。为什么我们不提供多台服务器进行写呢?这里面涉及一致性的问题。在多个库支持写时,数据很难保持一致性,很可能存在数据的覆盖。

3575282efbfb456a9f41b2991bcc7564~noop.image?_iz=58558&from=article.pc_detail&x-expires=1678689553&x-signature=%2F9VroXKkle%2BW81h8jBpRCanbtIc%3D

读写分离还具有这些特点,用的时候需要注意。写请求是直接落在主库上,主库再同步给从库。这样就会存在一个问题,用户更新了数据之后,马上去查,可能这个时候数据还没有同步到从库,看不到更新的数据。对于这个问题,可以从如下几个方向去考虑解决:


1.对于同一个用户,写之后的访问也落在主库上,这样可以保证更新的数据一定能被查询上来。但是这么设计可扩展性不是很好。


2.“双读”。在读取插入的数据时,如果第一次没有查询到结果,就去主库再查一遍。这种方法不安全,容易被黑客利用。当查询大量不存在的数据的时候,会导致主库性能下降。


3.业务拆分,对于可以容忍的业务从从库读取,而不能容忍延迟更新的业务,在更新之后从主库读数据。


对于读写分离之后的数据库访问,有两种方式,一种是在客户端中增加逻辑,判断是读还是写,再访问不同的数据库。另一种方式是提供一个代理服务,服务器统一访问代理,由代理进行请求的分发。

416f099df7674123bbd5b7c0b5825889~noop.image?_iz=58558&from=article.pc_detail&x-expires=1678689553&x-signature=bTAehM5iQHYRPPTfqfgI3bBol4k%3D

8f8aa2e735f64cd18640b9197397f995~noop.image?_iz=58558&from=article.pc_detail&x-expires=1678689553&x-signature=dRWnBPWzJK1T64VFkqnHnI3GVrw%3D

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

关注下方微信公众号:java圈子,获取价值999元全套java入门到进阶的学习资料以及教程,还有java技术交流群一起交流学习哦。

attachments-2023-03-UfDMfGOs64058b926a534.jpg

  • 发表于 2021-12-15 09:19
  • 阅读 ( 506 )
  • 分类:Java开发

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章