opensergo/opensergo-specification

[RFC] Database governance-ReadWriteSplitting CRD for read write splitting l | 数据库治理-读写分离

mlycore opened this issue · 3 comments

domain: database

Umbrella issue: #15

ReadWriteSplitting defines a set of rules help declare how to implementing read write splitting.

(English version TBD...)


读写分离是常用的数据库扩展方式之一,主库用于事务性的读写操作,从库主要用于查询等操作。通常读写分离会包含静态和动态两种配置方式,其中静态读写分离需要配置的有:

  • rules:声明读写分离规则
    • staticStrategy: 表示采用静态读写分离规则
    • dynamicStrategy: 表示采用动态读写分离规则
    • loadBalancers: 声明数据在多个从库数据源之间转发的算法,目前支持:
      • ROUND_ROBIN
      • RANDOM
      • WEIGHT

一个基础的 YAML 示例:

# 静态读写分离配置
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"

在动态读写分离配置规则中,配置基本和静态读写分离保持一致,而对于从库的数据源判断进行了更新。
NOTE: 需要配合 DatabaseDiscovery 一起用

# 动态读写分离配置
apiVersion: database.opensergo.io/v1alpha1
kind: ReadWriteSplitting
metadata:
  name: readwrite
spec:
  rules:
    dynamicStrategy:
      #autoAwareDataSourceName: "#"
      writeDataSourceQueryEnabled: true
      loadBalancerName: "random"
    loadBalancers:
    - loadBalancerName: "random"
        type: "RANDOM"

您好,感觉写的很详细,很不错。我这边有一些关于读写分离规则细节想要问一下,我们这边读写分离规则只是针对数据库datasource进行区分,至于具体的执行 sql 相关的信息以及规则管理,我们目前不关心是不?

您好,感觉写的很详细,很不错。我这边有一些关于读写分离规则细节想要问一下,我们这边读写分离规则只是针对数据库datasource进行区分,至于具体的执行 sql 相关的信息以及规则管理,我们目前不关心是不?

您好!用户需要的话是可以在识别 SQL 的时候使用正则表达式、条件表达式进行匹配和抓取,或者基于 Metrics 的自动发现,然后再路由到特定的数据源。

新增 SQL 识别规则:

  • 基于正则表达式的配置:需要由配置人员根据经验编写正则,并配置相应的转发规则
  • 基于条件表达式的配置:需要由配置人员根据经验编写条件表达式,并配置相应的转发规则

以静态读写分离 YAML 示例

apiVersion: traffic.opensergo.io/v1alpha1
kind: ReadWriteSplitting
metadata:
  name: readwrite
spec:
  rules:
    staticStrategy:
      loadBalancerName: "random"
      patterns:    # 如果未显式声明,则使用默认的基于语义的 SQL 识别
      - dataSourceNames: 
        - "read_ds_0"
        - "read_ds_1"
        regex:       # 基于正则表达式的
        - "^SELECT"
        conditions:  # 基于条件表达式的
        - subject: column # column 列或 table 表
          op: in # 预算符,包括 in, eq, ne, notin 等
          values:
          - "orders" 
    loadBalancers:
    - loadBalancerName: "random"
        type: "RANDOM"