0
3
3
2
专栏/.../

如何构建更稳定高效的TiDB多租户系统

 Jellybean  发表于  2024-04-23

关键字:多租户、稳定、低成本、解决方案

前言

TiDB 社区最近在成都举办了社区企业行活动,活动中有老师着重提到他们会把数量达 100+ 的相对低负载、低容量的长尾 MySQL,集中到一个统一的 TiDB 集群管理,可以极大减少数据库/集群的数量,从而大大减轻运维压力,释放有限的DBA人力。这个观点和我前段时间在深圳的社区活动中聊到的话题(深圳社区活动https://asktug.com/t/topic/1022494),主题思想不谋而合。

想要基于 TiDB 构建一个稳定且又高效、又不互相干扰、访问互相独立的多租户业务系统,在老的版本里实现起来会比较困难。好的是从 v7.1.0 开始资源管控成为正式功能,缓解不同工作负载间的资源与存储访问干扰,虽有一些待完善的地方,但是也基本上是实现了多租户的功能。

现如今自从新的 LTS v7.5.0发布之后,新版本带来的异常SQL熔断机制、系统任务(自动收集统计信息、BR备份和恢复、Lightning 导入及在线 DDL)自动识别并设置后台运行、DDL支持暂停等功能,使得多租户访问的集群系统有了很好的提升空间。

在这篇文章里,结合之前的思考我将和大家继续深入探讨一下如何结合这些新特性,构建一个更加稳定告警的多租户系统架构。

HTAP架构

TiDB HTAP 可以满足海量数据的增产需求、降低运维的风险成本、与现有的大数据栈无缝缝合,从而实现数据资产价值的实时变现。主要有下面三种适用场景:

  • 混合负载场景

    • 在在线实时分析处理的混合负载场景,使用相同的集群入口,TiDB 可以自动根据业务类型选择不同的处理引擎。
  • 实时流处理场景

    • 在实时流处理场景时,TiDB 能实时查询写入数据库的数据,同时可兼顾高并发数据服务与 BI 查询。
  • 数据中枢场景

    • TiDB 可以汇聚来自异构数据源的数据,作为数据中枢可以无缝连接数据业务层和数据仓库层,满足不同业务的需求。

经典的TiDB集群拓扑

HTAP同时支持在线事务处理和在线实时分析业务,有诸多优点,这里不详细赘述。不过,HTAP架构在业界看来,主要有三个难点:

  • 如何保证数据一致性?
  • 如何均衡不同类型的业务负载?
  • 如何实现资源隔离?

在基于TiDB部署的 HTAP 集群,如下图所示是一个用得最多的、经典的 TiDB 集群系统。

image.png

当一个 TiDB 集群集合了原来上百套 MySQL 业务系统的时候,其访问负载很大概率是多种多样的,不同的负载通过负载均衡层 LB 接入 tidb-server,最终访问集群的服务。

对于数据一致性,底层存储层 TiKV 由可靠的 raft 协议保证数据的强一致性,不同的机器节点之间数据保持强一致,可以说在底层能力上,数据强一致性就是 TiDB 天然基因。

对于不同类型的业务负载,在传统的 TiDB 架构中,确实容易出现混合负载相互干扰的风险。但由于 TiDB 是计算层、存储层、调度层是分层设计,使得各个组件层具有很灵活的部署能力,只要在计算层及 LB 层做出调整,就可以很好解决问题。

负载隔离的集群架构

如下图所示,不同的业务负载使用不同的 LB 入口,不同的 LB 入口 后端又接着不同的 tidb-server 节点,很好地实现了计算层的负载隔离。

image.png

对于资源使用隔离的问题,在平时的使用当中,大SQL、尤其是分析类型的 AP 业务SQL,往往是影响集群的最大因素,所以在存储层通过引入列式存储引擎 TiFlash ,直接在物理层面隔离 TP 访问和 AP 流量,二者在存储层物理独立,把影响最大的因素独立了出去,很好得保护了在行存上的、对延迟高度敏感的 TP 访问负载。

高可用容灾架构

如果我们的业务系统有跨机房容灾的需求,也可以很轻松就实现架构的升级。把对应的节点按照一定的分配,如下图,管理员是很方便就实现多中心的高可用容灾架构的。如果用得更加深入一些,结合 Placement Rule in SQL 等特性,可以实现同城两中心、冷热归档存储、三地五中心等多种方案。

image.png

可以说到这里,我们也已经能够感受到TiDB很强大、又很灵活扩展的架构优化能力了。单纯从技术上看,这也是我支持 TiDB 的最大原因之一,能让你感受到它具有蓬勃的生命力!

但是这套架构并非完美无瑕,由于是多业务访问,底层还是共用相同的 TiKV 存储层,即其 存储层仍然是跨系统共用的,无法有效隔离。

多租户架构及特性提升

在实践应用中我们可以发现,对传统架构多业务共用一个集群的场景,通常会遇到下面的痛点问题:

  • 高峰挤兑

    • 当一个业务处于高峰期时,会过多占用集群资源,影响别的业务。
  • 低估过剩

    • 当集群中的重要业务处于低谷值时,有较多的剩余资源。
  • 异常放大

    • 当集群遇到临时的问题 SQL 引发的性能问题时,很容易导致某一项资源使用紧张,进而影响整个集群,只能粗暴停掉对应的业务 。

官方其实也很早发现了这样的问题,所以在 v7.1.0 的 LTS 稳定版本里,正式发布了资源管控的功能,实现了多租户的功能特性,这在一定程度上极大缓解了这个问题,详情可以看我之前整理的这篇文章《TiDB v7.1.0 跨业务系统多租户解决方案》。

资源管控的基本原理是对集群拥有的资源,包含CPU、磁盘IO 和网络 IO,统一抽象成可计量的单位Request Unit (RU),再通过用户绑定资源组(RG),对 RG 限流或调整调度优先级实现对租户资源的管控,从而实现多租户的访问资源隔离。利用这些特性,我们可以:

  • 实时在线增加/减少业务租户可用资源。根据市场营销活动随时增加可用资源,活动结束就减少配额,非常灵活。
  • 实时在线限制租户业务可用配额。对突发故障,对性能异常的业务加以限制,避免干扰其他业务。
  • 实时在线取消租户业务配额限制。突发故障问题得以解决,取消临时限制,业务恢复正常运行。
  • 多业务共用一个集群,实现资源错峰使用,提高资源使用率,降低集群数量,缩减硬件成本、管理成本。

根据业务运行动态,实时扩大、缩小、取消限额、加限制等资源使用,极大提高集群资源使用率。

虽然支持对用户、会话、SQL语句(Hint)级别的管控,但对线上运行业务来说,有问题出现时直接禁止一个用户的访问,其 管控粒度还是太大了,这往往要停掉一整块业务,几乎不可能。即便是通过 SQL语句(Hint)级别的方式来管控,但由于要改业务代码、涉及发版等流程,也是过于复杂了。

异常 SQL 熔断/加黑

基于这样的考虑和现实诉求,官方在 v7.2.0 版本里推出来资源管控特性 Runaway Queries。 Runaway Queries 是指执行时间或消耗资源超出预期的查询,在运行时间和资源消耗上有显著特征。系统自动识别和管理资源消耗超出预期的查询,降低突发 SQL 性能问题带来的负面影响,保护复杂工作负载下TiDB系统的稳定性,提高集群的可靠性。

基于SQL执行时长来识别并熔断

如下是我们在做 POC 验证的过程示意图。

image.png

资源管控特性 Runaway Queries 基于 SQL 的执行时间的管控,我们主要验证了下面 5 个阶段:

  • 阶段1:业务正常运行

    • 业务访问正常,其延迟处于较低的水平上,此时并没有异常SQL出现。
  • 阶段2:突发异常SQL出现

    • 这个阶段在模拟统计信息过期、执行计划不准或新上大SQl业务时,集群突然出现异常SQL的情况,此时业务访问 QPS 急剧下降了 81%,99.9% 的延迟极大升高 7 倍以上,业务访问被严重影响,这是我们最不愿意看到的情况。如果放在以前,这个时候大概率只能暂时停止对应的业务访问,以保障集群其他业务的正常服务。
  • 阶段3:自动识别异常SQL。限制操作:QUERY_LIMIT=(EXEC_ELAPSED='2s', ACTION=KILL)。

    • 引进了 SQL 熔断功能后,就可以不用停止整个业务了。只需要找到对应的问题SQL,针对这一条或这一类 SQL 设置执行超时时间,系统在遇到后就会直接kill掉,不用过多的人工干预。
    • 经过设置后,业务访问的 QPS 和 延迟都有所好转。但由于系统是等SQL执行到超时了才会去干预,所以问题 SQL 给集群带来的负面影响还是在持续着的。

  • 阶段4:持续管控异常SQL。限制操作: QUERY_LIMIT=(EXEC_ELAPSED='2s', ACTION=KILL, WATCH=SIMILAR DURATION='5m')。

    • 为了更好地保护业务,还可以设置一段时间的保护期,这段时间内集群会自动收集问题SQL,遇到相同的 SQL 会直接干掉,而不用等待它执行超时,极大改善集群情况,给业务留够修复的时间。
    • 经过设置后,可以看到 QPS 相比平时正常情况只低了 3%,99.9% 的延迟升高了 3%,可以说基本已经恢复了正常水平!
  • 阶段5:业务正常运行

    • 问题SQL修复后,业务重新恢复正常运行状态。

从上面的验证效果来看,系统能 自动识别负面SQL并处置 ,极大地保障系统稳定性、安全性。

基于 SQL 来识别并熔断

上面是基于 SQL 执行时间来识别问题 SQL 的,可能执行很久的 SQL 就是正常的,这里存在误伤的情况。基于异常 SQL 的管控(SQL黑名单)就很好地解决这个问题。v7.3.0引入了手动管理异常SQL的功能,通过指定SQL或Digest ,Query Watch快速识别加黑语句,实现异常业务隔离,保障重要在线业务的稳定性。

如下图:

image.png

与前面基于时间识别异常 SQL 的场景类似,这里主要是通过Dashboard+slowlog等识别了问题 SQL 后,人工直接介入处理,加黑并熔断SQL的执行:

  • 阶段1:业务正常运行

  • 阶段2:突发异常SQL出现

  • 阶段3:添加SQL黑名单识别

    • 加黑设置QUERY WATCH ADD RESOURCE GROUP default SQL TEXT EXACT|SIMILAR TO 'select * from Order.order_line limit 100000';
  • 阶段4:业务正常运行

系统后台任务

对于非 SQL 类型的系统任务管控,v7.4.0 引入后台任务功能实现。后台任务会被TiKV限制资源的使用,尽量避免对其他前台任务的性能影响。支持管控的后台任务类型:

  • ddl:对于 Reorg DDL,控制批量数据回写阶段的资源使用。
  • stats:对应手动执行或系统自动触发的收集统计信息任务。
  • lightning:使用Lightning 执行导入任务,支持物理和逻辑导入模式。
  • br:使用 BR 执行数据备份和恢复。目前不支持 PITR。
  • background:指定当前会话的任务类型为 background。

下面针对常用的几个系统任务类型,分析后台任务功能开启后的实际运行效果。

DDL后台执行

大表 DDL 是一个非常消耗资源的操作,后台任务可以控制批量数据回写阶段的资源使用。

  • ALTER RESOURCE GROUP default BACKGROUND=(TASK_TYPES='ddl');

image.png

调低优先级,限制大表DDL资源消耗 大表加索引场景,缓解对线上业务的负面影响。

Analyze 后台执行

限制 Analyze 资源消耗情况,适用于手动或系统自动收集统计信息任务。

  • ALTER RESOURCE GROUP default BACKGROUND=(TASK_TYPES='stats');

image.png

调低优先级,限制统计信息收集时的资源使用 减少大表统计信息收集时对集群资源的占用,为更重要的业务省出资源。

Lightning后台任务

Lightning大量数据导入,在执行的时候会消耗大量资源,从而影响在线的高优先级任务的性能。Lightning在导入方式backend="local"。

  • 设置后台任务 BACKGROUND=(TASK_TYPES='lightning')

image.png

在没有设置 lightning 后台任务的时候,业务访问QPS下降了95%,可以说是干扰非常严重了。开启了后台任务以后,有一定的缓解作用,但影响还是比较大,这一块后续官方应该还会继续优化。

小结

在原有TiDB架构的基础上,官方又不断完善和推出相关的功能特性,其中以Runaway Queries和系统任务设置后台执行为优先推出。根据前面的分析和使用验证,我们可以在下面的应用场景有更好。更优雅的实现方式:

  • 可以限制异常SQL对集群资源的使用,尽量避免对其他任务的性能影响。
  • 对于大表添加索引DDL、Lightning数据导入、Analyze更新统计信息等系统任务,动态识别和限制资源使用,优先保证集群业务,大大提升集群的稳定性和可靠性。

具体而已,业务应用场景是:

  • 自动识别并处理异常 SQL 性能问题,保障重要系统的服务质量。
  • 对突发的 SQL 性能问题,在没有立即有效的修复手段时,可以对其限流,减少负面影响。
  • 当已知个别 SQL 有安全或性能问题,可以加入黑名单进行限流。
  • 通过设置后台任务,可以在任何时段在执行大表添加索引、Lightning导入数据、Analyze等系统任务,不再仅限于业务低估时期执行,大大提高运维管理的便捷性。

更稳定更高效的TiDB多租户系统

依靠资源管控的功能优化,我们在 TiKV 存储层和 TiFLash 列式引擎层实现不同用户的访问资源隔离,不仅能提高集群的资源使用效率,真正在实现降本增效,而且大大提升集群的稳定性、可靠性。

如下图,应用了新特性的多租户系统,我们可以为不同业务分配不同租户资源组管控,并为重要租户允许超额使用和高优先级,优先保证关键业务,同时又可以兼顾其他业务执行,最大程度保证了集群的整体运行效率和吞吐,实现真正的效率最大化。

image.png

在这里,结合v7.5版本带来的多租户特性,我们可以很好解决上文提到的几个问题:

  • 高峰挤兑:当一个业务处于高峰期时,会过多占用集群资源,可能影响其他共存业务

    • 当前架构能保护不同业务的资源持有情况,保证业务能分配到基本的运行资源而不被挤兑。
  • 低谷过剩:当集群中的重要业务处于低谷值时,有较多的剩余资源未被充分使用。

    • 多业务共用集群时,相当于有效引入了错峰运行的业务,充分使用资源,实现降本增效。同时要求业务能得到控制,其他时候不会占用过多资源。
  • 异常放大:当集群有突发的异常 SQL 导致性能问题时,影响整个集群,只能停掉对应业务 。

    • 当集群出现负面SQL时,我们可以不用停止业务、也可以不用粗暴地干掉它的执行,而是可以临时限制它的资源消耗,允许它缓慢运行,但又不会影响集群其他业务,对业务和系统更加温和及友好。

架构实现优势

  • 节约硬件成本

    • 跨业务混合共用集群,不会相互影响。
    • 减少集群数量,降低部署成本。
    • 错峰使用资源,提升整体利用率。
  • 高可扩展

    • 低负载时,繁忙应用可超越限额使用资源, 大大提高系统的可扩展性。
  • 灵活管控资源

    • 按需在线实时调整(增加资源、减少、设置上限等)业务资源使用,充分利用资源。
    • 在线限制负面SQL,实现熔断功能,极大保障在线业务。

架构实现劣势

  • 复杂度高

    • 系统相对复杂,技术实现较难。
    • 集群管理门槛高。
  • 总资源计算不准

    • 资源总量先硬件估计,运行后负载校准再人工调整,易出错。
  • 资源精准分配难

    • 人工管理集群资源池,分配策略不好定。
  • 资源管控的可视化观测不足

未来展望

  • 增加内存管控

    • 将内存资源纳入 RU,进一步优化集群内存使用。
  • 支持更多样的方式

    • 目前仅支持RU用量管控,需根据不同场景提供百分比、权重等多种资源限额定义方式。
  • 更智能的管控

    • 通过分析历史运行数据,系统产出资源管理的建议报告。
    • 智能生成管控规则自动调控,实现基于 AI 的智能自动化运维。
  • 提升易用性

    • 引入和完善图形化管理的方式,进一步提升用户体验,全面提升相关功能的可观测性和易用性。

未来如果要选择一个稳定的 LTS 使用版本,为实现更优雅、稳定和高效的系统架构,我强烈建议大家考虑和验证使用 v7.5 后的稳定版,相信它一定可以给到你足够的惊喜!

0
3
3
2

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论