开发者学堂课程【数据库治理的最佳实践:数据库治理的最佳实践】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1191/detail/18107
数据库治理的最佳实践
内容介绍:
一、导入
二、常见场景及能力
三、演示
一、导入
MSE 在数据库治理方面的探索可以认为是 MSE 服务治理的数据库治理相关领域的最佳实践。
在分布式系统中,业务的流量其实都是端到端的流量。所有的请求都会经过很多层的处理,比如是从入口的网关再到 web server,再到的微服务之间的调用。最后再是微服务访问的缓存,或者访问的数据库。
那么对系统来说,其实数据库是非常重要的一块。因为无论在稳定性的治理上,还是说在开发提效等场景下,其实数据库相关的治理能力都是系统所必需的。比如提供的一些查询接口,可能在 SQL 语句涉及到多表的 join 在某些情况下会触发一些慢调用。然后耗时非常长,最终会导致的数据库连接迟缓以及的业务比如说 top 开的线程池,double 的线程池等被打满之后,导致应用的整体不可用。或者说应用刚启动的过程中,其实是有无损下线。在过程中,其实有遇到一些配置,比如像数据库的登录可能还在初始化中。但已经有大量的数据库访问进来,会导致请求等待数据库连接,导致许多的现场都会卡在初始化数据库连接的过程中。从而一系列的问题就会导致的业务请求大量报错。
所以就在全链路灰度或者项目环境隔离的场景中,或者敏捷开发的场景中,比如新的应用版本可能会改数据库表的一些内容,然后灰度的流量如果没有数据库的流量隔离、数据隔离的能力,灰度流量可能会导致线上的数据库的数据错乱,从而可能在发布后才发现这样的问题。可能需要连夜的手工订正线上的数据。
比如像在项目初期可能没有对 SQL 性能做好考量。那么可能刚上线的时候随便写或者写的刚好够用。但是随着业务的发展,用户量级增加,线上往往会遗留一些老的 SQL 语句,很可能会成为一些性能瓶颈。
因此,需要一种有效的自动洞察能力,可以帮助发现遗留的 SQL ,并且进行一些及时性能优化,防止应用新的腐败。
然后之前有提到过 SQL 语句处理时间比较长,可能会导致线上的一些业务接口出现大量的慢调用。因此一方面需要快速定位有问题的 mysql ,并且通过一定的治理手段进行隔离,帮助业务快速恢复。
另外一方面就可能如果是有大量的查询慢语句,是否考虑把卖句通过读写分离的来保证主库的稳定性以及提升的查询的效率,从而提升应用性能。
而以上等等这些 case,针对大多数的后端应用,系统的瓶颈主要是受限于数据库的访问。当然复杂的业务场景肯定离不开数据库的操作。因此数据库的问题是研发后端研发工程师是优先级比较高的工作。数据库治理其实就是微服务治理中必不可少的一环。
二、常见场景及能力
那下面在这一块总结微服务访问数据库时,在数据库治理中的一些常见的场景,以及对应的微服务治理这边提供的数据库治理的一些能力。
那将场景主要分为从应用的视角出发,主要分为五块。最下面一块其实是四个洞察以及可观测的一些配套。它可以帮助及时的发现那些慢 SQL ,并且可以帮助做 SQL 的诊断,提供一些 sql 优化的建议。然后之后可能是数据库流量的路由能力。比如像读写分离、数据库灰度,甚至数据分片分库分表数据的负载均衡。
左边上面是数据库的访问的稳定性的治理。比如像 SQL 流控、并发的隔离、mysql的治理等等一系列能力。然后有数据安全如 SQ L中路的防护,速度的拦截以及可信场景下的证书的访问,数据健全数据加密等等这些场景。
目前重点介绍微服务治理,SQL 洞察提供秒级的深度洞察能力,可以具备完善的sql 执行能力的审计,可以帮助营销的评估系统的整体表现,可以依据洞察的能力来进行一些 sql 的流控的以及 SQL 治理。那紧接着就是第二款基于 SQL 流量控制、降级与容错,还可以提供基于 sql 洞察的完整的流量防护能力,可以做到流量控制的并发、隔离、熔断、降级以及热点流控。
第三块是连接池治理的场景。目前 MSE 提供完整的并且实时的连接是指标,完整的连接池的治理方案。比如像坏连续剔除,发现有问题的连接,并且把它剔除。然后还有在无损上线过程中的提前建连,在连接时做的一些访问控制。
第三块是数据流量路由。目前 MSE 支付两个能力,也是数据库数据库灰度,还有动态读写分离,无需代码改造都能做到。
数据库灰度是全链路灰度开发环境隔离能力的必备的场景。因为数据库是应用链路上的一环。
第二块是中台读写方面的能力。可以将入读请求动态变为只读实例中,从而提升的主库的稳定性。并且会减少一些比如写操作导致的场所,从而导致的查询语句的等待,会提升的查询效率,从而提升整体的吞吐量。
(1)SQL 洞察:
SQL 洞察主要是为帮助快速的发现一些慢调用以及遗留 SQL 的性能瓶颈,以及帮助快速定位有问题sql。
通过秒级的深度洞察能力,可以观察到应用以及资源api的实时数据,从而可以让有效的评估系统的整体表现。然后第二块看右上角其实就是的某个接口的详情。SQL 洞察能力分析 top 洞察,可以来分析语句是否合理。也可以进行一些流量控制隔离。
(2)慢SQL治理
第二块是应用访问数据库时的稳定性的治理。SQL 处理时间比较长,会导致一些线上的接口的大量的慢调用。因此需要快速定位问题。sql 分析通过一些治理手段进行隔离,将业务快速恢复。
原理如上图公式。当流量接近的时候,如果rt升高,那其实并发现的速度升高。这时候就代表服务是出现危机。通过深入洞察,可以快速定位并发 SQL ,并且配置隔离的能力,相当于软保险可以防止的慢调用 SQL 指向正常的服务资源,从而保证服务整体的稳定性。
从右边的原理图可以看到,通过隔离的方式把问题的隔离掉,然后从而保证正常的调用。
(3)连接池治理
那第三块是连接池治理。目前数据库治理提供连接池治理的能力,有实时的连接时指标。通过一些连接词的实时指标,可以帮助有效的提前识别到系统中存在的风险。
同时第二节会提供连接词指标的一些动态配置,可以动态的调整连接池的各个指标,从而最大程度的保证应用的稳定性。
同时还提供一些action,比如像换连接,剔除访问控制体验建联。会从连接池的视角出发,及时的发现异常的连接,并且进行及时的回收与技术与回收。那么就可以保证连接池的整体内容稳定性能。同时通过动态的防控的能力,可以做到面向数据库实例表的禁毒净血的防控制的能力。
第三块其实就是提前建联的能力,会保证在微服务流量到达之前,会将请求连接数保证在最小的年龄树枝上,从而保证启动过程中的流量的平滑稳定,而不会有大量的请求阻塞在等待在创建连接的过程上。
(4)数据库灰度
然后数据库灰度通过配合全量灰度的能力,可以将灰度的流量访问到的灰度数据库表上。正常的流量或接线环境流量其实访问基线的环境表。同时数据灰度有三个特点,首先是无需修改代码,只需提前创建灰度表即可。第二个就是应用里面的数字可能涉及到多个表,当前的变更可能只影响到表。所以说这一块其实是可以选择需要灰度的数据库表。比如像其他的表没必要创建汇总表。因为这边选以后,他只会针对特定正常表来进行恢复,其他涉及到的数据库表是不会有灰度,都是访问计算环境的点,也可以保证就是说只需灰度哪个比较就改哪个就行,而且是实时配置,动态生效。
第三块的优势,数据库归入它的灰度的sql的执行结果是实时可见。之前 SQL 洞察的能力,执行灰度的表之后会出现的汇总表的执行情况,就可以实时的看到的处理情况。
(5)动态读写分离
动态读写分离的能力可以有效的提升主库的稳定性,帮助数据库可以进行扩容的需求。支持动态的加入读写请求路由至只读实例上,可以将的思路请求分为强读跟弱读,弱读只会从 rds 只读识别读写。
同时支持接口应用级别标志落户请求。比如在微服务的某个接口上给标记接口风的所有读请求有更为弱读请求。
也可以在应用维度标记下交易,加购物车。
然后同时可以结合的秒级的洞察能力,先找出慢调用或者大查询的语句,可能会影响主库的稳定性以及查询的一些应用的吞吐量。可以将这些查询的接口找出来,然后并且标记它为弱读请求,这样会被分流至 rds 只读实例,从而提升的稳定性。
第四块慢调用的sql大查询语句可以路由至只读实例中。
简单的演示
为了演示的效果,在从库中提前执行,插入 ID 为8的数据。
为演示的效果,所以现在将库分成两个,只读库配另外生产的库,然后在只读插入SQL。找到的微服务应用。
这是的 demo 应用。访问它,执行写操作,看日志。
可以直接的主库,发现就写入信息。然后也会有数据的监控。
现在对已经提前配置读写并且是将读的 SQL 是配置路由到这张库里面。先看查询的结果。
查到的是读库
那接下来执行事物,创建两个数据,查询后删除。
创建成功之后查询可以看到所有查询的语句都是从读库中进行,从而实现读写动态读写分离的效果。
(6)AccessLog
白屏化的能力可以支持任意点位的数据的 ccess log 。以及任意接口的甚至可以支持自定义买点,任意的方法甚至是业务代码的一些方法,它都可以支持,要使用白屏化的精密访问的能力。
查询后可以看到写的请求访问到 bp13 库中,然后来看读的请求同样也是。
动态读写分离能力已经将写的一些操作路由器,读的操作在实例中,然后写的操作在主实例中,实现动态的读写方面能力。后面还会针对的应用接口以及微服务动态的配置的入读进行操作。
三、演示
先找到应用发送一些请求,在数据输入页面,可以看到刚才发两次请求。
访问的情况如上图,然后可以看到的连接时的一些指标,同时在 SQL 详情页面也可以看到 sql 的一些执行情况。
自动洞察下,可以看到统计的页面,来配置 SQL 防护,保证所通过的 QPS 一直是在运行范围内。
看到 QPS 为5,正好符合的 sq 流通能力。
同时当前配置隔离规则,会保证当前的接口线程数控制在有效的范围内。
第二块其实就是隔离。假设的慢调用方法非常耗时,可以配置阈值为5,控制在5个并发投入的线程,从而保证正常调用的一些线程数。
对应用相当于是保险,来保证服务整体的稳定性。
同时基于洞察期,可以看到即时的指标。下面可以再演示热点流控。关闭的热点。打开的热点流控个。因为热点流控是根据参数的目前只有一个为0 ,参数0即可,通过请求数,阈值为3,保存,开启。
关了流控调用就恢复了,刚才配置热点的规则,保证按照参数来索引通过。
流量防护中可以看到对 sq l进行防护,阻止55个请求。
热点流控是如果参数位于 top n 的参数通过的值,的是3,那么数据每秒钟最多只能通过3个。
主要介绍动态分离以及后面的执行的效果。然后第二块慢SQL治理的一些流程以及熔断中热点流控以及并发隔离和限流能力。