数据库治理的探索与实践

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
访问控制,不限时长
简介: 本文简单介绍了MSE微服务治理最近推出的数据库治理方面的实践,帮助用户更好地使用数据库,进一步提升微服务的稳定性。

本文简单介绍了MSE微服务治理最近推出的数据库治理方面的实践,帮助用户更好地使用数据库,进一步提升微服务的稳定性。

背景

在分布式系统架构中,业务的流量都是端到端的。每个请求都会经过很多层处理,比如从入口网关再到 Web Server 再到服务之间的调用,再到服务访问缓存或 DB 等存储。

image.png

对于我们的系统来说,数据库是非常重要的一块。因此无论是在稳定性的治理上,还是在开发提效等场景下,数据库相关的治理能力都是我们系统所需具备的能力。

以下列举一些典型的数据库相关的治理场景:

  • 某系统对外提供某查询接口,SQL语句涉及多表join,某些情况下会触发慢查询,耗时长达30s,最终导致 DB 连接池/Tomcat线程池满,应用整体不可用。

  • 应用刚启动,由于数据库Druid连接池还在初始化中,但是此时已经大量请求进入,迅速导致 Dubbo 的线程池满,许多现场卡在初始化数据库连接的过程中,导致业务请求大量报错。

  • 全链路灰度场景中,由于新的应用版本改了数据库表的内容,灰度流量导致线上数据库的数据错乱,业务同学连夜手动订正线上数据。

  • 在项目初期没有对SQL的性能做好考量,随着业务的发展,用户量级的增加,线上遗留老接口的SQL逐渐成为性能瓶颈,因此需要有有效的SQL洞察能力帮助我们发现遗留的SQL,并及时进行性能优化。

  • SQL语句处理时间比较长导致线上业务接口出现大量的慢调用,需要快速定位有问题的慢SQL,并且通过一定的治理手段进行隔离,让业务快速恢复。因此在微服务访问数据层时,实时的SQL洞察能力可以帮助我们快速定位慢的SQL调用。

其实针对大多数的后端应用来讲,系统的瓶颈主要受限于数据库,当然复杂度的业务肯定也离不开数据库的操作。因此数据库问题,也是优先级高的工作,数据库治的理也是微服务治理中必不可少的一环。

数据库治理相关常见场景

下面总结了微服务访问数据库层时,在数据库治理中的常见的一些场景与能力。

image.png

OpenSergo 领域中关于数据库治理的概览

慢SQL治理

慢SQL是比较致命的影响系统稳定性的因素之一,系统中出现慢SQL可能会导致CPU、负载异常和系统资源耗尽等情况。严重的慢SQL发生后可能会拖垮整个数据库,对线上业务产生阻断性的风险。线上生产环境出现慢SQL可能原因如下:

  • 网络速度慢、内存不足、I/O吞吐量小、磁盘空间被占满等硬件原因。

  • 没有索引或者索引失效。

  • 系统数据过多。

  • 在项目初期没有对SQL的性能做好考量。

image.png

对于线上常见的慢SQL问题,MSE 服务治理提供了场景化的解决方式。

SQL 洞察

MSE 提供了秒级的SQL调用监控

image.png

我们可以观察应用和资源API维度的实时数据(细化至秒级),同时 MSE 还提供了SQL的topN列表,我们可以一眼看出RT 高的 SQL 语句,快速定位应用变慢的根因。

image.png

我们通过MSE提供的SQL洞察能力,可以有效分析SQL语句是否写得合理,以及 SQL 执行的并发、RT是否符合系统表现的预期,根据这些SQL洞察的数据,从而可以有效地评估系统的整体表现,为流控降级规则的配置提供重要依据。

SQL的流控降级

我们可以根据MSE 自动识别的SQL语句,可以对出现慢SQL的应用配置线程数维度的流控或降级规则,当出现慢SQL调用时限制同一时刻执行的SQL数量,防止过多的慢SQL语句执行把资源耗尽。

image.png

关于MSE的SQL流控降级能力,MSE支持配置流控、隔离、熔断以及热点限流等四种规则。

  • 流量控制

通过流控能力,为服务接口配置流控规则,让容量范围内的请求通过,多余的请求被拒绝,相当于安全气囊的作用,可以有效保证SQL请求访问的流量控制在系统容量的阈值内。

  • 并发隔离

当流量近似稳态时:并发线程数 =QPS * RT(s),其中 RT 升高,并发线程数升高,代表服务调用出现堆积。采用流量治理提供的服务并发隔离能力,给重要服务调用配置并发线程数限制,相当于一道“软保险”,防止慢SQL或者不稳定的服务过多挤占正常服务资源。

  • 熔断降级

业务高峰期,某些下游的服务提供者大量的数据访问遇到性能瓶颈,出现大量的慢SQL,甚至影响业务。我们对部分非关键服务的数据库访问配置自动熔断规则,当一段时间内的慢调用比例或错误比例达到一定条件时自动触发熔断,后续一段时间服务调用直接返回Mock的结果,这样既可以保障调用端不被堆积的数据访问请求拖垮,从而保障整个业务链路的正常运转。

  • 热点流控

通过热点参数流控能力,自动识别SQL请求访问参数中的 TopN 访问热度的参数值,并对这些参数进行单独流控,避免单个热点访问过载;并且可以针对一些特殊热点访问(如极热门的抢购单品)配置单独的流控值。参数可以是SQL访问中的带有业务属性的条件,如以下 tid 参数的值。

 SELECT * FROM order WHERE tid = 1$

连接池治理

连接池治理是数据库治理中非常重要的一个环节,通过一些链接池的实时指标,我们可以有效地提前识别系统中存在的风险,以下是一些常见的连接池治理的场景。

  • 提前建连

在应用发布或者弹性扩容的场景下,如果刚启动实例中的连接并有没完成建立,但此时实例已经启动完成,Readiness检查已经通过,意味着此时会有大量的业务流量进入新启动的pod。大量的请求阻塞在连接池获取连接的动作上,导致服务的线程池满,大量业务请求失败。如果我们的应用具备提前建连的能力,那么就可以在流量到达前,保持连接请求数在minIdle之上,并且配合小流量预热的能力,那么就可以解决以上这个让人头疼的冷启动问题了。

  • "坏"连接剔除

有时候连接池中会存在一些有问题的连接,可能是底层的网络出现了抖动,也有可能是执行的业务出现了慢、死锁等问题。如果我们可以从连接池的视角出发,及时地发现异常的连接,并且进行及时地剔除与回收,那么就可以保证连接池整体的稳定性,不至于被个别有问题的业务处理或者网络抖动给拖垮。

  • 访问控制

理论上并不是全部数据库表都可以随便访问的,在某些时候,有些重要的表可能对于一些不太重要的服务来说,我们希望它是一个禁写、只读的状态,或者当数据库出现抖动、线程池满的情况下,我们希望减少一些耗时的读库SQL执行,又或者有一些敏感数据的表只允许某个应用去进行读写访问。那么我们就可以通过动态的访问控制能力,实时下发访问控制规则,来做到对于个别方法、应用的SQL面向数据库实例、表的禁读禁写等黑白名单的访问控制。

数据库灰度

微服务体系架构中,服务之间的依赖关系错综复杂,有时某个功能发版依赖多个服务同时升级上线。我们希望可以对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,通过构建从网关到整个后端服务的环境隔离来对多个不同版本的服务进行灰度验证。MSE 通过影子表的方式,用户可以在不需要修改任何业务代码的情况下,实现数据库层面全链路灰度。

image.png

动态读写分离

image.png

总结

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

  • 最后提一下服务治理的标准OpenSergo

说明

Q:OpenSergo 是什么? A:OpenSergo 是一套开放、通用的、面向分布式服务架构、覆盖全链路异构化生态的服务治理标准,基于业界服务治理场景与实践形成服务治理通用标准。OpenSergo 的最大特点就是以统一的一套配置/DSL/协议定义服务治理规则,面向多语言异构化架构,做到全链路生态覆盖。无论微服务的语言是 Java, Go, Node.js 还是其它语言,无论是标准微服务还是 Mesh 接入,从网关到微服务,从数据库到缓存,从服务注册发现到配置,开发者都可以通过同一套 OpenSergo CRD 标准配置针对每一层进行统一的治理管控,而无需关注各框架、语言的差异点,降低异构化、全链路服务治理管控的复杂度。

OpenSergo 也会在9月推出数据库治理相关的标准,会进一步抽象与标准化数据库治理相关的能力。目前OpenSergo 社区正在联合各个社区进行进一步的合作,通过社区来一起讨论与定义统一的服务治理标准。当前社区也在联合 bilibili、字节跳动等企业一起共建标准,也欢迎感兴趣的开发者、社区与企业一起加入到 OpenSergo 服务治理标准共建中。欢迎大家加入 OpenSergo 社区交流群(钉钉群)进行讨论:34826335

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
4月前
|
存储 负载均衡 安全
高效管理大型数据库:分片与复制的策略与实践
在当今数据驱动的世界中,管理和优化大型数据库系统是每个企业的关键任务。特别是在面对数据量迅速增长的情况下,如何确保系统的高可用性和性能成为重要挑战。本文探讨了两种核心技术——分片(Sharding)和复制(Replication),以及它们在实际应用中的策略与实践。通过对比这两种技术的优缺点,并结合具体案例分析,本文旨在为数据库管理员和开发者提供一套高效管理大型数据库的综合方案。
|
28天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
67 3
|
1月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
2月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
2月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
83 11
|
2月前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
|
2月前
|
Rust 前端开发 关系型数据库
Tauri 开发实践 — Tauri 集成本地数据库
本文介绍了在 Tauri 框架中集成本地数据库的几种方案,包括直接绑定 SQLite、使用第三方数据库库和使用 tauri-plugin-sql-api 插件。最终选择了 tauri-plugin-sql-api,因为它集成简单、支持多种数据库类型,并且与 Tauri 框架深度整合,提升了开发效率和安全性。文章详细介绍了如何安装和使用该插件,以及如何编写核心代码实现数据库操作。
209 2
|
2月前
|
SQL 关系型数据库 数据库
SQL数据库:核心原理与应用实践
随着信息技术的飞速发展,数据库管理系统已成为各类组织和企业中不可或缺的核心组件。在众多数据库管理系统中,SQL(结构化查询语言)数据库以其强大的数据管理能力和灵活性,广泛应用于各类业务场景。本文将深入探讨SQL数据库的基本原理、核心特性以及实际应用。一、SQL数据库概述SQL数据库是一种关系型数据库
81 5
|
2月前
|
SQL 开发框架 .NET
ASP连接SQL数据库:从基础到实践
随着互联网技术的快速发展,数据库与应用程序之间的连接成为了软件开发中的一项关键技术。ASP(ActiveServerPages)是一种在服务器端执行的脚本环境,它能够生成动态的网页内容。而SQL数据库则是一种关系型数据库管理系统,广泛应用于各类网站和应用程序的数据存储和管理。本文将详细介绍如何使用A
76 3
|
2月前
|
关系型数据库 数据挖掘 数据库
解析数据库联结:应用与实践中的 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN 与 CROSS JOIN
解析数据库联结:应用与实践中的 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN 与 CROSS JOIN
69 1