微服务治理热门技术揭秘:动态读写分离

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 本文将详细介绍 MSE 数据库治理的热点功能,动态读写分离的设计与实现。

作者:十眠


我们从应用的视角出发整理抽象了我们在访问、使用数据库时场景的一些稳定性治理、性能优化、提效等方面的实战经验,对于每一个后端应用来说,数据库无疑是重中之重,我们希望通过我们的数据库治理能力,可以帮助到大家更好地使用数据库服务。


1.png

MSE 数据库治理完整解决方案


本文将详细介绍 MSE 数据库治理的热点功能,动态读写分离的设计与实现。


读写分离的概述


数据库动态读写分离的常见场景:


  • 一个大客户的请求过来,查询数据库返回上万条几百 M 的数据,数据库的 CPU 直接打满。 


  • 微服务应用的某些业务并不是那么重要,却存在大量查询数据库的逻辑,影响数据库实例稳定性,从而导致整体服务质量的下降。 


  • 在业务处理过程中,如果对数据库的读操作远多于写操作,那么在做系统性能优化时就可以考虑引入读写分离的方案,一方面只读库可以承担主库的压力,另一方面能够有效的避免由数据更新导致的锁等待,提升微服务应用的性能。 


  • 随着业务的增长,我们在一定时机下需要对数据库实例进行扩容。根据经验大多数应用的读写比都在 5:1 以上,有些场景甚至大量的高于 10:1,在对数据库有少量写请求,但有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至对业务产生影响。


可以了解到的是数据库读写分离方案可以满足阿里云上大多数公司的稳定性治理、性能提升以及数据库扩容的需求。


2.png


如果了解读写分离实现的同学一定会关注以下这些问题:


  • MSE 是如何解决读写分离对业务的侵入性?如何做到业务无需改动一行代码,即可具备读写分离能力。 


  • MSE 如何做到精细化动态的读写分离控制?即使我们不知道这个业务接口真实的 SQL 是什么,但我们已经可以控制这个接口的读 SQL 访问只读实例。 


  • MSE 是如何解决读写分离带来的一致性问题?对于一致性敏感的业务,如何实现一致性的保障,满足业务在不同场景下对一致性级别的要求。

MSE 读写分离技术揭秘


读写分离也就是将数据库拆分为主库和从库,即主库负责处理事务性的增删改操作,从库负责处理查询操作的数据库架构。单单看读写分离的概念,第一感觉就是对业务的侵入性一定不小,那么 MSE 是如何做到无侵入的呢?


无侵入性:无需修改一行代码


MSE 数据库治理能力通过 JavaAgent 技术,动态增加用户的数据源,注入动态读写分离能力,支持运行时动态将弱读请求路由至只读实例。


3.png


MSE 在数据源层面实现了抽象,其中 DynamicConnection、DynamicStatement 会根据具体规则从而实现 Master/Slaver 的切换,做到根据 SQL 的读写类型、事务的状态以及用户的业务规则来做 SQL 的路由,将符合条件的读 SQL 请求转发至 RDS 只读实例中。


4.png


精细化路由:按照请求条件、接口、SQL 多层次多条件


很多时候我们通过编写 DAO 访问数据库,那么在一些复杂应用的场景下,我们很可能只知道 DAO 接口,在一些复杂场景下我们只知道微服务的接口,内部甚至搞不清楚到底调用的哪个 DAO 接口、SQL 语句,甚至如果是运维角色参与设计,我们很可能不知道哪个微服务接口导致的读请求导致数据库抖动,我们只知道入口应用的某个 uid。那么我们如何做到对业务接口内的读请求路由至只读实例呢?


MSE 数据库治理提供了应用层面完整的 callStack 信息,可以让我们站在应用的视角上清晰地看到哪些接口内部执行了哪些 SQL。


5.png


MSE 通过链路传递技术,支持在入口微服务、微服务接口、DAO 层面标记弱读请求的标记,支持标记的当前线程内的 SQL 调用、当前微服务内的 SQL 调用、符合流量条件的请求链路级别的所有 SQL 调用等多个层面的弱读标记传递,最终传递给读写分离组件的路由引擎进行  SQL 的路由依据的判断。


6.png


强一致性模式:指定接口、事务


当数据库负载很高时,例如对大表执行 DDL(如加字段)操作或大批量插入数据的时候,延迟会非常严重,从而导致无法从只读实例中读取最新数据。MSE 提供了一些策略解决如上问题,某些接口或者某些业务对一致性比较非常高,我们可以通过规则配置告诉 MSE 在特定场景下,某些读接口标记为强读请求。MSE 内部会通过一些机制保证读写分离的强一致性效果。


白屏化能力:通过 AccessLog 实时感知读写分离情况


有读写分离能力,那么我们如何知道读写分离的执行情况,到底哪些应用,哪些请求被分离至了只读实例?MSE 白屏化能力提供了一套完整的 AccessLog。


  • 读请求路由至只读实例


7.png


  • 读请求路由至主实例


8.png

总结


MSE 从应用的视角出发,结合微服务治理通用的技术,MSE 推出的是完整的数据库治理解决方案,从 SQL 洞察、SQL 流控降级与容错、连接池治理到数据库灰度、动态读写分离。我们希望通过数据库治理能力可以帮助用户的微服务可以更好地使用数据库,降低数据库使用的成本,提升数据库访问的稳定性。


MSE 的数据库治理能力也需要更多更加深入的客户场景与落地实践,如果您对 MSE 的数据库治理能力感兴趣,欢迎联系我们,只有经过客户打磨的产品才会愈发历久弥新。


在建设数据库治理能力的同时,我们也通过 OpenSergo 在与社区共同建设数据库治理的标准。


9.png


OpenSergo 在联合各个社区进行进一步的合作,希望通过社区来一起讨论与定义统一的服务治理标准。当前社区也在联合 bilibili、字节跳动等企业一起共建标准,也欢迎感兴趣的开发者、社区与企业一起加入到 OpenSergo 服务治理标准共建中。欢迎大家加入 OpenSergo 社区交流群(钉钉群)进行讨论:34826335

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
30天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
2月前
|
运维 持续交付 API
从零构建微服务架构:一次深度技术探索之旅####
【10月更文挑战第28天】 本文记录了作者在从零开始构建微服务架构过程中的深刻技术感悟,通过实战案例详细剖析了微服务设计、开发、部署及运维中的关键要点与挑战。文章首先概述了微服务架构的核心理念及其对企业IT架构转型的重要性,随后深入探讨了服务拆分策略、API网关选型、服务间通信协议选择、容器化部署(Docker+Kubernetes)、以及持续集成/持续部署(CI/CD)流程的设计与优化。最后,分享了在高并发场景下的性能调优经验与故障排查心得,旨在为读者提供一套可借鉴的微服务架构实施路径。 ####
68 3
|
2月前
|
Kubernetes Java 微服务
微服务上下线动态感知实现的技术解析
随着微服务架构的广泛应用,服务的动态管理和监控变得尤为重要。在微服务架构中,服务的上下线是一个常见的操作,如何实时感知这些变化,确保系统的稳定性和可靠性,成为了一个关键技术挑战。本文将深入探讨微服务上下线动态感知的实现方式,从技术基础、场景案例、解决思路和底层原理等多个维度进行阐述,并分别使用Java和Python进行演示介绍。
67 4
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
67 1
|
2月前
|
监控 Java 微服务
从零构建微服务架构:一次深度技术探索之旅####
本文作为一篇深度技术分享,引领读者踏上自底向上搭建微服务架构的征途,旨在通过实战经验剖析,揭示微服务转型背后的技术挑战与解决方案。不同于常规摘要仅概述内容,本文摘要将直接以故事化手法,简述作者从单体应用困境出发,逐步迈向微服务化的心路历程,涵盖关键决策点、技术选型考量及实践收获,激发读者对微服务架构设计与实现的浓厚兴趣。 ####
|
2月前
|
Cloud Native 云计算 Docker
云原生技术的崛起:从容器化到微服务架构
云原生技术的崛起:从容器化到微服务架构
|
2月前
|
监控 API 微服务
后端技术演进:从单体架构到微服务的转变
随着互联网应用的快速增长和用户需求的不断演化,传统单体架构已难以满足现代软件开发的需求。本文深入探讨了后端技术在面对复杂系统挑战时的演进路径,重点分析了从单体架构向微服务架构转变的过程、原因及优势。通过对比分析,揭示了微服务架构如何提高系统的可扩展性、灵活性和维护效率,同时指出了实施微服务时面临的挑战和最佳实践。
59 7
|
2月前
|
Kubernetes Cloud Native Docker
云原生技术探索:容器化与微服务的实践之道
【10月更文挑战第36天】在云计算的浪潮中,云原生技术以其高效、灵活和可靠的特性成为企业数字化转型的重要推手。本文将深入探讨云原生的两大核心概念——容器化与微服务架构,并通过实际代码示例,揭示如何通过Docker和Kubernetes实现服务的快速部署和管理。我们将从基础概念入手,逐步引导读者理解并实践云原生技术,最终掌握如何构建和维护一个高效、可扩展的云原生应用。
|
3月前
|
运维 Kubernetes 开发者
构建高效后端服务:微服务架构与容器化技术的结合
【10月更文挑战第18天】 在数字化转型的浪潮中,企业对后端服务的要求日益提高,追求更高的效率、更强的可伸缩性和更易于维护的系统。本文将探讨微服务架构与容器化技术如何结合,以构建一个既灵活又高效的后端服务体系。通过分析当前后端服务面临的挑战,介绍微服务和容器化的基本概念,以及它们如何相互配合来优化后端服务的性能和管理。本文旨在为开发者提供一种实现后端服务现代化的方法,从而帮助企业在竞争激烈的市场中脱颖而出。
36 0