我们从应用的视角出发整理抽象了我们在访问、使用数据库时场景的一些稳定性治理、性能优化、提效等方面的实战经验,对于每一个后端应用来说,数据库无疑是重中之重,我们希望通过我们的数据库治理能力,可以帮助到大家更好地使用数据库服务。
MSE 数据库治理完整解决方案
本文将详细介绍 MSE 数据库治理的热点功能,动态读写分离的设计与实现。
数据库动态读写分离的常见场景:
可以了解到的是数据库读写分离方案可以满足阿里云上大多数公司的稳定性治理、性能提升以及数据库扩容的需求。
如果了解读写分离实现的同学一定会关注以下这些问题:
读写分离也就是将数据库拆分为主库和从库,即主库负责处理事务性的增删改操作,从库负责处理查询操作的数据库架构。单单看读写分离的概念,第一感觉就是对业务的侵入性一定不小,那么 MSE 是如何做到无侵入的呢?
MSE 数据库治理能力通过 JavaAgent 技术,动态增加用户的数据源,注入动态读写分离能力,支持运行时动态将弱读请求路由至只读实例。
MSE 在数据源层面实现了抽象,其中 DynamicConnection、DynamicStatement 会根据具体规则从而实现 Master/Slaver 的切换,做到根据 SQL 的读写类型、事务的状态以及用户的业务规则来做 SQL 的路由,将符合条件的读 SQL 请求转发至 RDS 只读实例中。
很多时候我们通过编写 DAO 访问数据库,那么在一些复杂应用的场景下,我们很可能只知道 DAO 接口,在一些复杂场景下我们只知道微服务的接口,内部甚至搞不清楚到底调用的哪个 DAO 接口、SQL 语句,甚至如果是运维角色参与设计,我们很可能不知道哪个微服务接口导致的读请求导致数据库抖动,我们只知道入口应用的某个 uid。那么我们如何做到对业务接口内的读请求路由至只读实例呢?
MSE 数据库治理提供了应用层面完整的 callStack 信息,可以让我们站在应用的视角上清晰地看到哪些接口内部执行了哪些 SQL。
MSE 通过链路传递技术,支持在入口微服务、微服务接口、DAO 层面标记弱读请求的标记,支持标记的当前线程内的 SQL 调用、当前微服务内的 SQL 调用、符合流量条件的请求链路级别的所有 SQL 调用等多个层面的弱读标记传递,最终传递给读写分离组件的路由引擎进行 SQL 的路由依据的判断。
当数据库负载很高时,例如对大表执行 DDL(如加字段)操作或大批量插入数据的时候,延迟会非常严重,从而导致无法从只读实例中读取最新数据。MSE 提供了一些策略解决如上问题,某些接口或者某些业务对一致性比较非常高,我们可以通过规则配置告诉 MSE 在特定场景下,某些读接口标记为强读请求。MSE 内部会通过一些机制保证读写分离的强一致性效果。
有读写分离能力,那么我们如何知道读写分离的执行情况,到底哪些应用,哪些请求被分离至了只读实例?MSE 白屏化能力提供了一套完整的 AccessLog。
MSE 从应用的视角出发,结合微服务治理通用的技术,MSE 推出的是完整的数据库治理解决方案,从 SQL 洞察、SQL 流控降级与容错、连接池治理到数据库灰度、动态读写分离。我们希望通过数据库治理能力可以帮助用户的微服务可以更好地使用数据库,降低数据库使用的成本,提升数据库访问的稳定性。
MSE 的数据库治理能力也需要更多更加深入的客户场景与落地实践,如果您对 MSE 的数据库治理能力感兴趣,欢迎联系我们,只有经过客户打磨的产品才会愈发历久弥新。
在建设数据库治理能力的同时,我们也通过 OpenSergo 在与社区共同建设数据库治理的标准。
作者:十眠
本文为阿里云原创内容,未经允许不得转载。