OpenSergo & ShardingSphere 社区共建微服务视角的数据库治理标准

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 微服务视角的数据库治理是保障微服务稳定性的重要一环。OpenSergo 社区将持续与 ShardingSphere 及 Database Mesh 社区进行合作,不断完善与丰富数据库治理标准及场景。接下来社区会开展 ShardingSphere 与 OpenSergo 的集成工作,将数据库治理 spec 落地到社区实现。此次内容会讲述为什么需要微服务治理与 OpenSergo,以及OpenSergo 联合 ShardingSphere 社区如何共建数据库治理标准!

为什么需要微服务治理与 OpenSergo?


在经典微服务架构中,我们通常将服务调用中各角色划分为三部分:服务提供者、服务消费者、注册中心。经典的微服务架构可以解决微服务能调通、可以运行起来的问题。随着分布式服务架构的不断演进、业务规模的扩张,诸多复杂的稳定性与易用性问题显现出来,这时候就需要一些手段来针对日益复杂的微服务架构进行“治理”。微服务治理就是通过流量治理、服务容错、安全治理等技术手段来减少甚至避免发布和管理大规模应用过程中遇到的稳定性问题,对微服务领域中的各个组件进行治理。服务提供者、消费者、注册中心、服务治理,构成现代微服务架构中重要的几环。

image.png

微服务治理是把微服务做稳做好的关键一环。但是,业界微服务治理存在概念不统一、配置形式不统一、能力不统一、多框架统一管控较为复杂等问题。比如我们希望配置流量灰度规则,在 Spring Cloud Alibaba 中可能需要通过 YAML 方式配置,在 Dubbo 中需要通过另一种配置格式进行配置,在 Istio 体系内中可能又需要通过 Istio CRD 的方式进行配置。不同框架治理配置方式的不一致使得微服务统一治理管控的复杂度相当高。另外,业界的各种框架支持的服务治理能力都不统一,且通常比较基础,很多时候无法覆盖生产级的场景。

image.png

基于上面这些痛点,阿里巴巴在2022年1月开始和 bilibili、字节等企业讨论服务治理如何规范化和更加普及,从而共同发起了 OpenSergo 项目OpenSergo 是开放通用的,覆盖微服务及上下游关联组件的微服务治理项目,从微服务的角度出发,涵盖流量治理、服务容错、服务元信息治理、安全治理等关键治理领域,提供一系列的治理能力与标准、生态适配与最佳实践,支持 Java, Go, Rust 等多语言生态。OpenSergo 的最大特点就是以统一的一套配置/DSL/协议定义服务治理规则,面向多语言异构化架构,覆盖微服务框架及上下游关联组件。无论微服务的语言是 Java, Go, Node.js 还是其它语言,无论是标准微服务还是 Mesh 接入,从网关到微服务调用,再到微服务对数据库/缓存的访问,开发者都可以通过同一套 OpenSergo CRD 标准配置进行统一的治理管控,而无需关注各框架、语言的差异点,降低异构化、全链路微服务治理管控的复杂度。

image.png

OpenSergo 提供 Java、Go 等多语言的 SDK,各个框架生态可以非常方便地通过 OpenSergo SDK 来对接 OpenSergo 标准配置,接入到 OpenSergo 生态中,通过 OpenSergo 控制平面 (Control Plane) 统一管理服务治理规则。


微服务视角的数据库治理是保障服务稳定性的关键一环


提到“微服务治理”,很多开发者会首先想到针对微服务之间的调用流量进行治理,但很多时候大家容易忽视掉微服务访问存储与其它中间件的这部分流量。在一个真实的业务生产环境中,流量首先先进入入口网关(如 Nginx、Envoy),再流转到后端 Web Server,再流转到微服务之间的 RPC 调用,再流转到针对数据库、缓存、消息等存储/中间件的访问。在这样一个全链路的架构中,仅仅关注微服务之间的调用是不够的,我们需要针对链路中的每一环分别进行针对性的治理。其中微服务对数据库的访问是非常普遍的,也是容易出现稳定性问题的一环。比如:


  • 某个应用某类报表 SQL 访问量非常大,且查询非常消耗性能,把数据库 CPU 打满
  • 慢 SQL 访问非常多,占满连接池/业务线程池,导致服务无法处理正常请求,甚至导致级联雪崩
  • 连接池参数配置不合理,导致大量 SQL 写操作时无法有效获取连接,业务大量报错
  • 数据库访问需要按环境标进行隔离,比如灰度数据写入到灰度表中

image.png

对于大多数的后端应用来讲,系统性能扩展的瓶颈主要受限于数据库。尤其在微服务的环境下,数据库的性能治理问题往往也是团队优先级最高的几类工作之一,数据库治理自然也成为微服务治理中必不可少的一环。我们期望开发者可以结合数据库治理能力,来保障微服务访问数据库的稳定性(保护微服务自身不被拖垮),同时也保障数据库的稳定性。


OpenSergo 联合 ShardingSphere 社区共建数据库治理标准


基于以上背景,OpenSergo 社区期望结合企业与开源社区的经验,抽出一套通用的、从微服务视角出发的数据库治理标准规范。ShardingSphere 作为数据库治理领域的标杆项目,沉淀了非常丰富的最佳实践与技术经验,可以很好地为 OpenSergo 补充数据库治理领域的空缺。因此 OpenSergo 社区联合 ShardingSphere 社区共建微服务视角的数据库治理标准,扩充治理边界,让社区能够以标准化的方式针对不同数据层框架与流量进行统一治理管控,共同推进治理领域技术与生态演进。

image.png


对于此次 OpenSergo 与 ShardingSphere 社区之间的合作,双方社区负责人都对此次合作表达了自己的观点:


Apache ShardingSphere PMC Chair 张亮: 在微服务领域,服务间的交互与协作已日臻完善,而服务对数据库的访问却依然缺失行之有效的标准。ShardingSphere 自开源以来,一直持续不断的践行着“连接、增强、可插拔”的设计哲学。其中,“连接”则是希望提供标准化的协议和接口,打破开发语言访问异构数据库的壁垒。OpenSergo 提出了微服务治理的标准,并首次将数据库的访问放在了标准中,非常具备前瞻性。作为访问数据库重要入口的微服务,我非常希望 ShardingSphere 和 OpenSergo 共建标准。


OpenSergo && Sentinel 社区负责人 赵奕豪(宿何):在微服务治理领域中,除了微服务本身的治理之外,针对数据库访问的治理也是保障业务可靠性与连续性的关键一环。ShardingSphere 作为数据库治理领域的标杆项目,沉淀了非常丰富的最佳实践与技术经验,可以很好地为 OpenSergo 补充数据库治理领域的空缺。因此我们联合 ShardingSphere 社区共建微服务视角的数据库治理标准,扩充治理边界,期待让社区能够以标准化的方式针对不同数据层框架与流量进行统一治理管控,共同推进治理领域技术与生态演进。


OpenSergo 微服务视角的数据库治理标准主要包括以下几部分:


对数据库 workload 及访问对象的抽象


在治理规则中,我们通常需要指定规则作用的数据库实例(或实例组),或者满足的 SQL 条件。针对这一部分,我们在 OpenSergo 数据库治理标准中针对数据库 target workload 及访问对象进行了一些抽象。


  • 虚拟数据库 (VirtualDatabase):在数据库治理中,不管是读写分离、分库分表、影子库,还是加密、审计和访问控制等,都需要作用在一个具体的数据库之上。在这里将这样的一个逻辑的数据库称为虚拟数据库,即 VirtualDatabase。VirtualDatabase 在应用看来是一组特定的数据库访问信息,并通过绑定特定的治理策略实现相应的治理能力
  • 数据库端点 (DatabaseEndpoint):在数据库治理中,通过 VirtualDatabase 向应用声明了可以使用的逻辑数据库,而数据的真实存储则依赖于这样的一个物理的数据库,这里称为数据库访问端点,即 DatabaseEndpoint。DatabaseEndpoint 对应用无感知,它只能被 VirtualDatabase 通过特定治理策略所绑定然后连接和使用。


针对访问对象的条件抽象:


  • 数据库访问对象 (DatabaseAccessTarget):定义一组匹配条件,如针对某个实例/库/表的访问、针对某类 SQL 性质(读/写操作)、按 SQL pattern 匹配、按 SQL 参数匹配等。将 DatabaseAccessTarget 与具体的治理规则结合,我们可以实现细粒度的数据库流量治理。


流量治理在数据库访问的体现


在微服务对数据库的访问中,流量路由、流量隔离、流控降级与容错等相关流量治理能力是数据库治理中非常重要的一块。


在流控降级与容错领域,我们复用了 OpenSergo 流控降级与容错标准。OpenSergo 流控降级与容错 spec 定义了三要素:Target(针对怎样的流量)、Strategy(对应怎样的流量治理策略)、FallbackAction(触发策略之后的行为)。在针对数据库访问的治理中,我们将流量条件抽象为 DatabaseAccessTarget,结合 OpenSergo 自有的流控、并发控制、熔断等策略,即可以实现细粒度的流控降级与容错。


image.png

同时数据库流量治理体系中还有一些关键的、数据库领域特有的治理能力:


  • 读写流量路由 (ReadWriteSplitting):读写分离是常用的数据库扩展方式之一,主库用于事务性的读写操作,从库主要用于查询等操作。读写流量路由规则可以指定将读 SQL 路由到读库,事务性的读写操作路由到主库。
  • 分库分表路由 (Sharding):数据分片路由是基于数据属性一种扩展策略,对数据属性进行计算后将请求路由到特定的数据后端,目前分为分片键分片和自动分片。其中分片键分片中需要指明需要分片的表、列、以及进行分片的算法。
  • 数据流量隔离 (影子库表 Shadow):影子库表可以帮助在灰度环境或者测试环境中,接收灰度流量或者测试数据请求,结合影子算法等灵活配置多种路由方式。
  • 数据加密 (Encryption):企业往往因为安全审计和合规的要求,需要对数据存储提供多种安全加固措施,比如数据加密。 数据加密通过对用户输入的 SQL 进行解析,并依据用户提供的加密规则对 SQL 进行改写,从而实现对原文数据进行加密,并将原文数据(可选)及密文数据同时存储到底层数据库。在用户查询数据时,它仅从数据库中取出密文数据,并对其解密,最终将解密后的原始数据返回给用户。

image.png


以下是一个读写流量路由规则的示例:

# 虚拟数据库配置
apiVersion: database.opensergo.io/v1alpha1
kind: VirtualDatabase
metadata:
  name: readwrite_splitting_db
spec:
  services:
  - name: readwrite_splitting_db
    databaseMySQL:
      db: readwrite_splitting_db
      host: localhost
      port: 3306
      user: root
      password: root
    readWriteSplitting: "readwrite"  # 声明所需要的读写分离策略
---
# 写数据源的数据库端点配置
apiVersion: database.opensergo.io/v1alpha1
kind: DatabaseEndpoint
metadata:
  name: write_ds
spec:
  database:
    MySQL:                 # 声明后端数据源的类型及相关信息
      url: jdbc:mysql://192.168.1.110:3306/demo_write_ds?serverTimezone=UTC&useSSL=false
      username: root
      password: root
      connectionTimeout: 30000
      idleTimeoutMilliseconds: 60000
      maxLifetimeMilliseconds: 1800000
      maxPoolSize: 50
      minPoolSize: 1
---
# 第一个读数据源的数据库端点配置
apiVersion: database.opensergo.io/v1alpha1
kind: DatabaseEndpoint
metadata:
  name: read_ds_0
spec:
  database:
    MySQL:                 # 声明后端数据源的类型及相关信息
      url: jdbc:mysql://192.168.1.110:3306/demo_read_ds_0?serverTimezone=UTC&useSSL=false
      username: root
      password: root
      connectionTimeout: 30000
      idleTimeoutMilliseconds: 60000
      maxLifetimeMilliseconds: 1800000
      maxPoolSize: 50
      minPoolSize: 1      
---
# 第二个读数据源的数据库端点配置
apiVersion: database.opensergo.io/v1alpha1
kind: DatabaseEndpoint
metadata:
  name: read_ds_1
spec:
  database:
    MySQL:                              # 声明后端数据源的类型及相关信息
      url: jdbc:mysql://192.168.1.110:3306/demo_read_ds_1?serverTimezone=UTC&useSSL=false
      username: root
      password: root
      connectionTimeout: 30000
      idleTimeoutMilliseconds: 60000
      maxLifetimeMilliseconds: 1800000
      maxPoolSize: 50
      minPoolSize: 1
---
# 静态读写分离配置
apiVersion: database.opensergo.io/v1alpha1
kind: ReadWriteSplitting
metadata:
  name: readwrite
spec:
  rules:
    staticStrategy:
      writeDataSourceName: "write_ds"
      readDataSourceNames: 
      - "read_ds_0"
      - "read_ds_1"
      loadBalancerName: "random"
    loadBalancers:
    - loadBalancerName: "random"
      type: "RANDOM"


以下是一个针对某个 SQL 进行并发控制的示例。这个规则会针对 foo 应用针对 SELECT * FROM users WHERE id = ? 的 SQL 访问进行并发控制,单机并发数不超过 8。

apiVersion: traffic.opensergo.io/v1alpha1
kind: DatabaseAccessTarget
metadata:
  name: target-foo-user-select-sql
spec:
  sqlMatch:
    - exactMatch: "SELECT * FROM users WHERE id = ?"
---
apiVersion: fault-tolerance.opensergo.io/v1alpha1
kind: ConcurrencyLimitStrategy
metadata:
  name: concurrency-limit-foo
spec:
  maxConcurrency: 8
  limitMode: 'Local'
---
apiVersion: fault-tolerance.opensergo.io/v1alpha1
kind: FaultToleranceRule
metadata:
  name: my-sql-conc-limit-rule
spec:
  selector:
    app: foo
  targets:
    - targetRef: target-foo-user-select-sql
  strategies: 
    - name: concurrency-limit-foo

其它数据库治理能力


  • 数据库发现 (DatabaseDiscovery):数据库自动发现指的是根据数据库高可用配置,通过探测的方式感知数据源状态变化,并对流量策略做出相应的调整。比如后端数据源为 MySQL MGR,那么可以配置数据库发现类型为 MYSQL.MGR,指定 group-name,并配置相应的探测心跳节律。
  • 分布式事务配置 (DistributedTransaction):声明分布式事务相关的配置,目前支持声明事务的类型。

展望


微服务视角的数据库治理是保障微服务稳定性的重要一环。OpenSergo 社区将持续与 ShardingSphere 及 Database Mesh 社区进行合作,不断完善与丰富数据库治理标准及场景。接下来社区会开展 ShardingSphere 与 OpenSergo 的集成工作,将数据库治理 spec 落地到社区实现。


微服务治理是微服务改造深入到一定阶段之后的必经之路,是将微服务做稳做好的关键。OpenSergo 社区持续与 ShardingSphere、Database Mesh、CloudWeGo、Kratos、Spring Cloud Alibaba、Dubbo 等社区共同建设 OpenSergo 微服务治理标准,将企业与社区中微服务治理的场景与最佳实践共同提取成标准规范,也欢迎更多社区与企业一起参与 OpenSergo 微服务治理标准的共建。


OpenSergo 社区现在处于高速发展阶段,从微服务治理标准定义,到 Control Plane 的实现,再到 Java/Go/C++/Rust 等多语言 SDK 与治理功能的实现,再到各个微服务生态的整合与落地,都还有大量的演进工作,欢迎社区一起参与标准完善与代码贡献。


image.png


OpenSergo 开源贡献小组正在火热招募贡献者。如果您有时间,有热情,有意愿,欢迎联系社区加入开源贡献小组,一起共同完善 OpenSergo 和 Sentinel,一起主导微服务治理技术与标准演进。Now let's start hacking!


欢迎关注 OpenSergo 社区微信公众号,了解微服务治理社区最新动态:OpenSergo(可以附公众号引流跳转)


最后面加个广告:我们在阿里云也提供 MSE 数据库治理产品,从 SQL 洞察、慢 SQL 治理、读写流量治理、数据流量隔离等方面来保障微服务访问数据库的稳定性,欢迎大家了解与体验:https://help.aliyun.com/document_detail/446706.html


相关链接:


相关文章
|
5月前
|
监控 Kubernetes Cloud Native
云原生架构下的微服务治理之道
【7月更文挑战第30天】在数字化转型的浪潮中,企业级应用正迅速向云原生架构迁移。本文将深入探讨云原生环境下微服务治理的最佳实践,包括服务发现、配置管理、流量控制等关键策略,并结合实例分析如何在保障系统弹性、可维护性的同时,优化资源利用效率和加快业务创新速度。
57 2
|
5月前
|
运维 Kubernetes Cloud Native
云原生架构下的微服务治理之道
【7月更文挑战第20天】在数字化转型的浪潮中,企业纷纷拥抱云原生,以期实现更高效的资源利用、更快的业务迭代和更强的系统稳定性。本文将深入探讨如何通过云原生架构优化微服务的治理,确保系统的高可用性和可维护性,同时提升开发效率和运维灵活性。我们将从微服务治理的核心原则出发,结合具体案例,分析在云环境中实施微服务治理的策略与挑战。
55 2
|
5月前
|
监控 Cloud Native 安全
云原生架构下的微服务治理实践
在数字化转型的浪潮中,云原生技术以其灵活性和可扩展性成为现代软件工程的基石。本文将深入探讨云原生架构下微服务治理的实践路径,从微服务的拆分、容器化部署、服务网格的应用到最终的监控与故障排除,提供一套全面的方法论。文章旨在为读者呈现一个清晰的云原生环境下,如何高效管理和维护微服务系统的全景图。
63 2
|
5月前
|
负载均衡 Cloud Native 云计算
云原生架构下的微服务治理与挑战
随着云计算技术的不断演进,云原生架构已成为现代应用开发的首选模式。本文将深入探讨在云原生环境下,微服务治理的重要性、实现方法及所面临的挑战。通过分析微服务治理的关键要素如服务发现、配置管理、负载均衡和故障转移等,揭示如何在高度动态的云环境中保持服务的高可用性和灵活性。同时,本文也将指出在实施微服务治理过程中可能遇到的技术难题和应对策略,为构建健壮的云原生应用提供指导。
|
4月前
|
SQL 监控 分布式数据库
【解锁数据库监控的神秘力量!】OceanBase社区版与Zabbix的完美邂逅 —— 揭秘分布式数据库监控的终极奥秘!
【8月更文挑战第7天】随着OceanBase社区版的普及,企业广泛采用这一高性能、高可用的分布式数据库。为保障系统稳定,使用成熟的Zabbix监控工具对其进行全方位监控至关重要。本文通过实例介绍如何在Zabbix中配置监控OceanBase的方法,包括创建监控模板、添加监控项(如TPS)、设置触发器及图形展示,并提供示例脚本帮助快速上手。通过这些步骤,可以有效监控OceanBase状态,确保业务连续性。
109 0
|
5月前
|
监控 负载均衡 Java
Spring Boot与微服务治理框架的集成
Spring Boot与微服务治理框架的集成
|
6月前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【6月更文挑战第30天】Spring Cloud是Java微服务治理明星框架,整合Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(断路器)、Zuul(API网关)和Config Server(配置中心),提供完整服务治理解决方案。通过Eureka实现服务注册与发现,Ribbon进行负载均衡,Hystrix确保服务容错,Config Server集中管理配置,Zuul则作为API入口统一处理请求。理解和使用Spring Cloud是现代Java开发者的关键技能。
136 2
|
5月前
|
负载均衡 Java Nacos
Spring Boot与微服务治理框架的集成策略
Spring Boot与微服务治理框架的集成策略
|
6月前
|
运维 负载均衡 Cloud Native
云原生架构下的微服务治理实践
【6月更文挑战第24天】在云原生的浪潮下,微服务治理成为确保系统弹性、可维护性和可观测性的关键。本文通过深入分析微服务治理的核心要素与挑战,结合前沿技术和工具,提出一套实用的微服务治理策略,旨在帮助开发者和架构师构建更加稳定、高效且易于管理的分布式系统。
|
5月前
|
存储 Kubernetes Cloud Native
云原生架构下的微服务治理之道
【7月更文挑战第15天】本文将深入探讨在云原生架构下,如何高效地进行微服务的治理。我们将从微服务治理的基本原则出发,详细分析服务发现、配置管理、容错设计等关键实践,并结合具体案例,展示如何在云平台上构建和管理健壮、可扩展的微服务系统。文章旨在为开发者和架构师提供一套实用的方法论,以应对快速变化的市场需求和技术挑战。
49 0