opensergo-specification
opensergo-specification copied to clipboard
[RFC] Database governance-ReadWriteSplitting CRD for read write splitting l | 数据库治理-读写分离
domain: database
Umbrella issue: https://github.com/opensergo/opensergo-specification/issues/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: traffic.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: traffic.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"