“读写分离”技术实现、适用场景及典型路线解析.docxVIP

“读写分离”技术实现、适用场景及典型路线解析.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

1.读写分离:概述

1)何为读写分离

读写分离,从字面理解就是将对数据库的读操作与写操作分离的一种优化手段。其最早起源于互联网快速发展时期,面对海量用户访问问题,通过这一技术来解决数据库性能瓶颈问题。目前已经成为非常常见的一种数据库访问优化技术。

2)读写分离好处

提高访问性能

通过引入读写分离技术,将之前集中于单点的访问压力,分散到更多节点。即可利用更多的资源,支撑业务系统,可有效提升整体访问性能。

提高稳定性

通过将读取与写入操作的分离,可有效规避由于异常操作所带来的风险。常见如一个大查询语句,因访问数据规模巨大占用大量CPU资源。通过承载端分离,可避免影响更为重要的写入操作。

提高资源利用率

为了更好地保护数据,数据库系统通常采用多副本技术冗余保护数据,但其备用副本如无法提供业务访问,将是一种资源浪费,而读写分离可有效利用只读副本,提升整体资源利用率。

提高可用性

通过引入更多节点来承载读写操作,结合负载均衡与高可用探查技术,可避免单点故障引发可用性问题。

提高访问效率

通过利用不同节点分别承载读取与写入,还可缓解因为锁带来的争用问题,提高单节点的访问效率。

更大优化空间

针对读取操作的特殊性,可通过分离后的独立资源采取特有的优化技术,进一步提升访问效率。

2.读写分离:技术实现

1)常用方案

目前业界流行的读写分离方案,通常都是基于上述主从模式的数据库架构,通过引入数据访问代理层,来实现访问动作的读写分离。引入数据访问代理的好处是源程序不需要做任何改动就可以实现读写分离,坏处是由于多了一层中间件做中转代理,性能上会有所下降,数据访问代理也容易成为性能瓶颈,并且还存在一定维护成本。还有另一种方式,是将数据访问代理层前置到应用侧,通过SDK方式与应用集成在一起,可避免独立一层所带来的性能损耗和维护成本高的问题。但这种方式对开发语言有一定要求,存在适用性问题。

2)技术要点

读写分离功能的好与不好,主要是在易用性和灵活度问题。前者是关心如何让业务开发像操作单个主库一样,无需过多关注主从读写分离的细节,只需要做好相应读写配置后,就无需考虑写主读从的细节。后者是解决用户多变的业务场景和拓扑变化,并可实现自动适应。这其中是需要解决一系列技术问题,如下面这些常见的问题。

??判断读写操作

如何判断读写操作,是读写分离面临的首要问题。判断方式可大致分为自动和手动两种,前者是通过显式的方式由用户来指定;后者则是自动进行判断,用户无需关心。这两种判断方式往往是互补的,可配合来使用。下面是常见判断逻辑及处理:

基于不同端口连接

该实现方式就读写分离功能而言不是太好,因为此方式与应用自己实现没有明显差别,只是将直接连接不同数据库的逻辑变成了连接中间件服务器的不同端口,并没有对应用系统开发带来实质性的简化工作。

基于SQL匹配

采用正则表达式匹配是比较容易实现的方案,可以无需应用的修改,只需要在中间件添加正则匹配的规则,即可将读、写分发的逻辑在中间件完成。读写分离的效果,取决于中间件的正则匹配规则的编写质量。

基于Hint

应用系统发送SQL时,可以添加Hint,显示的告诉中间件想要将该SQL发送到何处。中间件解析特定规则的Hint,即可实现对带有不同Hint的语句分发到不同的数据库节点。

基于语法解析

当中间件获取到应用发送的SQL字符串时,对其进行完整的语法解析,可以最大程度的获取SQL字符串中的信息,例如类型、操作对象等。基于语法的判断,就能够自动针对不同语句类型进行读写分发,可以最大限度的减少应用的适配工作。

使用语法解析是相对来说较为友好的方式,无需开发人员感知即可实现读写操作分离。但这其中存在难点,就是如何准确判断出只读操作存在一定困难,例如使用函数、存储过程、触发器或诸如“SELECT...FORUPDATE”类的操作。此时,是需要引入辅助机制进行判断,可采取配置名单方式来辅助分析;或者通过Hint、API的方式强制指定走写库或读库。除此之外,还有些命令也需要规范是否可在备库执行,如COPY、SHOW、SET、BEGIN...END等。

??如何处理事务

事务类操作,往往意味着数据变化,在读写分离中如何处理呢?通常有两种思路,一种是简单粗暴方式,将所有事务及关联操作全部发送到主机;一种是更为精确的处理,即分析事务内的语句序列,将事务中先写后读的对象进行关联,一起发送到主机,确保数据正确,而把和写操作无关的读操作,进行拆分,发送到备机执行。后一种处理方式能最大限度的利用读写分离,当然需要解决对象前后关系这一问题。

??解决主备延迟

基于副本方式的延迟是常见的,也是读写分离在设计之初就需考虑的问题。其通常的处理思路可以有多种:

强制读写走主库

这类解决方案最简单粗暴,也是实际工作中最常用的方案。通过对主备节点延迟情况

文档评论(0)

外卖人-小何 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档