数据库治理利器:动态读写分离(代码片段)

阿里云云栖号 阿里云云栖号     2022-11-30     252

关键词:

背景

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

对于我们的系统来说,数据库是非常重要的一块。因此无论是在稳定性的治理上,还是在开发提效等场景下,数据库相关的治理能力都是我们系统所需具备的能力。下面总结了微服务访问数据库层时,在数据库治理中的常见的一些场景与能力。

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

本文将介绍 MSE 服务治理最近推出数据库治理利器:无侵入实现数据库访问的读写分离能力。

什么是读写分离?

读写分离也就是将数据库拆分为主库和从库,即主库负责处理事务性的增删改操作,从库负责处理查询操作的数据库架构。

为什么要读写分离?

稳定性

一个大客户的请求过来,查询数据库返回上万条几百 M 的数据,数据库的 CPU 直接打满。不知道大家是否遇到过类似的问题。

性能

在业务处理过程中,如果对数据库的读操作远多于写操作,同时业务上对于数据查询结果的实时性要求不高(例如可以容忍秒级的延迟),那么在做系统性能优化时就可以考虑引入读写分离的方案,只读库可以承担主库的压力,有效提升微服务应用的性能。

规模增长

随着业务增长,到了一定规模之后再扩容,但很多都卡在扩容这一步,极大的限制了应对市场变化的速度,其中数据库的扩容是最难的,目前常见的数据库扩容方式有以下几种方式:

  • 垂直升级
  • 分库分表
  • 读写分离

垂直升级需要中断服务且高可用方面不及其它几种方式,分库分表在分区键的选择上会是个难点,SQL 使用上会有诸多限制,同时对业务的改造也是非常大的工作量。相对来说读写分离是对业务的侵入最低也最容易实现扩容方案。根据经验大多数应用的读写比都在 5:1 以上,有些场景甚至大量的高于 10:1,在对数据库有少量写请求,但有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至对业务产生影响。

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

读写分离常见方案

目前业界流行的读写分离方案,通常都是基于上述主从模式的数据库架构。读写分离的实现方案多数是通过引入 odp、mycat 等数据访问代理产品,通过其读写分离功能来帮助实现读写分离。引入数据访问代理的好处是源程序不需要做任何改动就可以实现读写分离,坏处是由于多了一层中间件做中转代理,性能上会有所下降,数据访问代理也容易成为性能瓶颈。

ShardingSphere 读写分离方案[1](摘自 shardingsphere 官网)

ShardingSphere[2] 的读写分离主要依赖内核的相关功能。包括解析引擎和路由引擎。解析引擎将用户的 SQL 转化为 ShardingSphere 可以识别的 Statement 信息,路由引擎根据 SQL 的读写类型以及事务的状态来做 SQL 的路由。如下图所示,ShardingSphere 识别到读操作和写操作,分别会路由至不同的数据库实例。

MSE 数据库读写分离能力

MSE 提供了一种动态数据流量治理的方案,您可以在不需要修改任何业务代码的情况下,实现数据库的读写分离能力。下面介绍 MSE 基于 Mysql 数据存储通过的读写分离能力。

前提条件

  • 应用接入 MSE
  • 部署 Demo 应用

在阿里云容器服务中部署 A、B、C 三个应用,并且将应用均接入 MSE 服务治理[3],用于增加具备数据库治理能力的 Agent。

  • 创建 RDS 只读实例[4]

我们需要创建 RDS 只读实例,利用只读实例满足大量的数据库读取需求,增加应用的吞吐量。

配置读写分离规则

  • 我们需要配置以下环境变量来额外开启/配置数据库的读写分离能力

  • 我们可以通过控制台配置弱读请求的规则或者指定某些接口为弱读请求
apiVersion: database.opensergo.io/v1alpha1
kind: AccessControlRule
metadata:
  name: read-only-control-rule
  labels:
    app: foo
spec:
  selector:
    app: foo
  target: 
    - resource:
        path: '/getLocation'
  controlStrategies:
    weak: true

上述 OpenSergo 标准的规则表示 /getLocation 接口的请求为弱读请求。

我们针对一些大数据量查询、对延时不太敏感的业务请求可以配置为 weak 类型

SQL 洞察

如上只需轻松的两步我们就实现了数据库的读写分离能力。基于数据库读写分离能力,配合 MSE 数据库治理的 SQL 洞察我们可以快速定位 RT 过大的查询请求,帮助我们进一步分析 SQL 对我们数据库稳定性的影响。

我可以观察应用和资源 API 维度的 SQL 请求实时数据(细化至秒级),同时 MSE 还提供了 SQL 的 topN 列表,我们可以一眼看出 RT 高,查询返回值数据量大的 SQL 语句。

总结

本文详细描述了 MSE 即将推出的数据库治理能力矩阵中关于动态读写分离能力的介绍。通过 MSE 提供的 SQL 洞察能力,结合我们对业务的理解,我们可以快速定位划分接口请求为弱请求。将对主库性能以及稳定性影响大的读操作,分流至 RDS 只读库,可以有效降低主库的读写压力,进一步提升微服务应用的稳定性。

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

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

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

参考链接:

[1] ShardingSphere 读写分离方案:

https://shardingsphere.apache.org/document/current/cn/features/readwrite-splitting/

[2] ShardingSphere:

https://shardingsphere.apache.org/document/current/en/overview/

[3] 接入 MSE 服务治理:

https://help.aliyun.com/document_detail/425896.html

[4] 创建 RDS 只读实例:

https://help.aliyun.com/document_detail/26136.html

[5] OpenSergo:

https://opensergo.io/zh-cn/

作者:十眠

原文链接

本文为阿里云原创内容,未经允许不得转载

mycat实现读写分离(代码片段)

...读写分离是很有必要的。当然应用要实现读写分离,首先数据库层要先做到主从配置。应用实现读写分离至少有两种方法:应用本身通过代码实现,例如基于动态数据源、AOP的原理来实现写操作时用主数据库,读操作时用从数据... 查看详情

mysql读写分离(代码片段)

...服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。二.为什么要做读写分离因为数据... 查看详情

mysql数据库--主从复制读写分离(代码片段)

...分离,两个slave读负载均衡4、修改amoeba主配置文件和数据库文件5、开启amoeba6 查看详情

springboot使用aop,动态数据源实现数据库读写分离(代码片段)

...访问 http://www.x0100.top                环境部署 数据库:MySql库数量:2个,一主一从关于mysql的主从环境部署,可以参考:https://juejin.im/post/5dd13778e51d453da86c0e6f开始项目首先,毫无疑问,先开始... 查看详情

mycat读写分离的简单实现(代码片段)

...cat读写分离的配置1.1、Mycat是什么1.2、Mycat能干什么1.2.1、数据库的读写分离1.2.1.1、数据库读写分离图解1.2.2、数据库分库分表1.2.2.1、水平拆分(分库)1.2.2.2、垂直拆分(分表)1.3、Mycat的搭建1.3.1、前期准备1.3.2... 查看详情

mycat读写分离的简单实现(代码片段)

...cat读写分离的配置1.1、Mycat是什么1.2、Mycat能干什么1.2.1、数据库的读写分离1.2.1.1、数据库读写分离图解1.2.2、数据库分库分表1.2.2.1、水平拆分(分库)1.2.2.2、垂直拆分(分表)1.3、Mycat的搭建1.3.1、前期准备1.3.2... 查看详情

数据库:读写分离—问题汇总(代码片段)

问题:如何实现MySQL的读写分离?MySQL主从复制原理是啥?如何解决MySQL主从同步的延时问题?分析  高并发这个阶段,肯定是需要做读写分离的,啥意思?因为实际上大部分的互联网公司,一些网站,或者是app,其实都是读多... 查看详情

mysql(24)—读写分离的基本概念和实现方式(代码片段)

简单的介绍了MySQL数据库读写分离的概念和实现方式。文章目录1读写分离的概念2读写分离的实现3读写分离的问题1读写分离的概念读写分离是指将数据库的读和写操作分不到不同的数据库节点上。主服务器负责处理写操作和实时... 查看详情

mysql数据库——主从复制与读写分离(代码片段)

文章目录前言一、MySQL主从复制1.支持的复制类型2.主从复制的工作过程是基于日志3.请求方式4.主从复制的原理5.MySQL集群和主从复制分别适合在什么场景下使用6.为什么使用主从复制、读写分离7.用途及条件8.mysql主从复制存在的... 查看详情

django配置数据库读写分离(代码片段)

对网站的数据库作读写分离(Read/WriteSplitting)可以提高性能,在Django中对此提供了支持,下面我们来简单看一下。注意,还需要运维人员作数据库的读写分离和数据同步。配置数据库我们知道在Django项目的settings中,可以配置数... 查看详情

mysql数据库的主从复制和读写分离!(代码片段)

...建读写分离一、主从复制在实际生产环境中,如果对数据库的读写都在同一个数据库服务器中操作,无论是在安全性。高可用性,还是高并发等各个方面都是完成不能满足实际需求的,因此需要通过主从复制 查看详情

mysql数据库的主从复制和读写分离!(代码片段)

...建读写分离一、主从复制在实际生产环境中,如果对数据库的读写都在同一个数据库服务器中操作,无论是在安全性。高可用性,还是高并发等各个方面都是完成不能满足实际需求的,因此需要通过主从复制 查看详情

django数据库读写分离,分库(代码片段)

读写分离在settings中配置不同名称的数据库连接参数,并配置一条数据库选择路由DATABASES=‘default‘:‘ENGINE‘:‘django.db.backends.sqlite3‘,‘NAME‘:os.path.join(BASE_DIR,‘db.sqlite3‘),,‘db1‘:‘ENGINE‘:‘django.db.backends.sqlite3‘,‘NAME‘:os 查看详情

spring读写分离-事务配置篇(转)(代码片段)

转自:http://jinnianshilongnian.iteye.com/blog/1720618如何配置mysql数据库的主从?单机配置mysql主从:http://my.oschina.net/god/blog/496 常见的解决数据库读写分离有两种方案1、应用层http://neoremind.net/2011/06/spring实现数据库读写分 查看详情

mycat读写分离介绍(代码片段)

安装mycat实现mysql负载均衡事先准备好两台及以上数据库服务器mycat支持特性如(官网mycat.io,以下是官网介绍的支持特性):SQL92标准,支持MySQL、Oracle、DB2、SQLServer、PostgreSQL等DB的常见SQL语法遵守Mysql原生协议,跨语言,跨平台,... 查看详情

利用amoeba(变形虫)实现mysql数据库读写分离(代码片段)

...不稳定,不建议在生产环境使用;amoeba是阿里开发的一款数据库读写分离的项目(读写分离只是它的一个小功能),由于是基于java编写的,所以运行环境需要安装jdk;前期准备工作:1.两个数据库,一主一从,主从同步;master:17 查看详情

springboot实现mysql的读写分离(代码片段)

一、描述读写分离就是对于一条SQL该选择哪一个数据库去执行,至于谁来做选择数据库这件事,有两个,要么使用中间件帮我们做,要么程序自己做。一般来说,读写分离有两种实现方式。第一种是依靠中间... 查看详情

秒懂mybatis之读写分离简单实现(代码片段)

...载出自:shusheng007文章目录概述原理实现搭建主备份数据库配置多数据源配置MyBatis使用AOP改进如何使用测试:总结概述多年前在springboot中集成mybatis访问数据库后,一下就被其强大的功能征服了,从此再也没有用... 查看详情