Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
mlycore opened this issue Aug 11, 2022 · 3 comments · Fixed by #40
Labels
area/database-governance Category issues or PRs related to database governance kind/spec-RFC Issues or PRs for OpenSergo spec RFC

Comments

@mlycore
Copy link
Contributor

mlycore commented Aug 11, 2022

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"
@panxiaojun233
Copy link
Collaborator

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

@mlycore
Copy link
Contributor Author

mlycore commented Aug 11, 2022

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

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

@sczyh30 sczyh30 added kind/spec-RFC Issues or PRs for OpenSergo spec RFC area/database-governance Category issues or PRs related to database governance labels Aug 11, 2022
@mlycore
Copy link
Contributor Author

mlycore commented Aug 25, 2022

新增 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"

@sczyh30 sczyh30 linked a pull request Sep 8, 2022 that will close this issue
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/database-governance Category issues or PRs related to database governance kind/spec-RFC Issues or PRs for OpenSergo spec RFC
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants