Logo
异构双写

背景信息 #

通过 YAML 格式配置异构双写,能够快速地理解数据库防火墙规则之间的依赖关系,DBPlusEngine 会根据 YAML 配置,自动完成对象的创建,减少用户不必要的编码工作。

参数解释 #

rules:
- !DUAL_WRITE
  dataSources:
    dual_write_ds:
      # 主数据源(双写退化后以主数据为准,单写单读)
      primaryDataSourceName: oracle_ds
      # 写数据源
      writeDataSourceNames:
        - oracle_ds
        - mysql_ds
      # 读数据源
      readDataSourceNames:
        - oracle_ds
        - mysql_ds
      # 读流量拦截器,拦截的流量进行读负载均衡(可选,不配置拦截全部读流量)
      interceptorName: sql_interceptor
      # 读流量负载均衡算法(可选,默认为 ROUND_ROBIN)
      loadBalancerName: random
  loadBalancers:
    random:
      type: RANDOM
  interceptors:
    sql_interceptor:
      # 按照 SQL 匹配拦截,多条 SQL 使用分号分隔
      type: SphereEx:SQL_INTERCEPT
      props:
        sqls: SELECT * FROM t_order;
    table_interceptor:
      # 按照表名匹配拦截,SQL 中包含任意表则匹配成功
      type: SphereEx:TABLE_INTERCEPT
      props:
        tables: t_order, t_order_item
    regex_interceptor:
      # 按照正则匹配 SQL 拦截
      type: SphereEx:REGEX_INTERCEPT
      props:
        regex: (?i)^(WITH|SELECT).*WHERE user_id.*

  # 主键生成策略(可选参数)
  keyGenerateStrategies:
    t_address:
      keyGenerateColumn: id
      keyGeneratorName: snowflake

  keyGenerators:
    snowflake:
      # 支持现有 Sharding 中的 SNOWFLAKE、UUID、NANOID,以及新增加 Redis 支持
      type: SNOWFLAKE

props:
  # 存储节点心跳检测间隔
  storage-node-heartbeat-interval-milliseconds: 5
  # 存储节点心跳检测重试次数
  storage-node-heartbeat-retry-times: 3

算法类型的详情,请参见内置算法 - 异构双写拦截器算法内置算法 - 负载均衡算法 以及 内置算法 - 分布式序列算法

操作步骤 #

  1. 在 YAML 文件中配置异构双写规则,包含数据源、双写规则、全局属性等配置项;
  2. 根据 YAML 文件中的配置信息创建对象。

配置示例 #

数据脱敏 YAML 配置如下:

dataSources:
  unique_ds:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.jdbc.Driver
    jdbcUrl: jdbc:mysql://localhost:3306/demo_ds?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
    username: root
    password:

rules:
- !DUAL_WRITE
  dataSources:
    dual_write_ds:
      primaryDataSourceName: oracle_ds
      writeDataSourceNames:
        - oracle_ds
        - mysql_ds
      readDataSourceNames:
        - oracle_ds
        - mysql_ds
      interceptorName: sql_interceptor
      loadBalancerName: random
  loadBalancers:
    random:
      type: RANDOM
  interceptors:
    sql_interceptor:
      type: SphereEx:SQL_INTERCEPT
      props:
        sqls: SELECT * FROM t_order;

  keyGenerateStrategies:
    t_address:
      keyGenerateColumn: id
      keyGeneratorName: snowflake

  keyGenerators:
    snowflake:
      type: SNOWFLAKE