Hi, Yanick

I have got your first design, we can simplify it using a `shadow_` prefix 
convertion like this:

dataSources:
        master_ds_0: !!com.zaxxer.hikari.HikariDataSource
          driverClassName: org.h2.Driver
          jdbcUrl: 
jdbc:h2:mem:master_ds_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
          username: sa
          password:
        shadow_master_ds_0: !!com.zaxxer.hikari.HikariDataSource
          driverClassName: org.h2.Driver
          jdbcUrl: 
jdbc:h2:mem:shadow_master_ds_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
          username: sa
          password:
        master_ds_0_slave_0: !!com.zaxxer.hikari.HikariDataSource
          driverClassName: org.h2.Driver
          jdbcUrl: 
jdbc:h2:mem:master_ds_0_slave_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
          username: sa
          password:
        shadow_master_ds_0_slave_0: !!com.zaxxer.hikari.HikariDataSource
          driverClassName: org.h2.Driver
          jdbcUrl: 
jdbc:h2:mem:shadow_master_ds_0_slave_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
          username: sa
          password:

    ……..
    
    props:
        shadow.enable: true

Sharding-core can group datasources internal based on this convertion, 
when user start a shadow switch, actual datasources could be routed to shadow 
group smoothly


------------------
Zhao Jun (cherrylzhao)
Apache ShardingSphere & ServiceComb

> On Dec 10, 2019, at 5:37 PM, xia Yanick <[email protected]> wrote:
> 
> Dear Jun:
>  Great idea, the first way that add the datasources for shadow rule easy to 
> implement, if we add a new concepts for `datasource group` may add other  
> compatibility code for ShardingRule/MasterRule/EncRule.
> 
> Yanick Xia
> CODING BOY
> Email: [email protected]
> Website: blog.yanick.site
> 
> On Dec 10, 2019, 17:27 +0800, zhaojun <[email protected]>, wrote:
>> It seems difficult to understand, shall we create datasource groups 
>> distinguished with
>> actual and shadow then rewrite the actualDataNodes based on shadow switch 
>> configuration?
>> 
>> ------------------
>> Zhao Jun (cherrylzhao)
>> Apache Sharding-Sphere & ServiceComb
>> 
>>> On Dec 10, 2019, at 3:46 PM, xia Yanick <[email protected]> wrote:
>>> 
>>> Hi everyone:
>>>  we will add shadow yaml configuration file
>>>  the first style: add shadow database for every actual database , such as:
>>> 
>>> # shadow config
>>> dataSources:
>>> master_ds_0: !!com.zaxxer.hikari.HikariDataSource
>>> driverClassName: org.h2.Driver
>>> jdbcUrl: 
>>> jdbc:h2:mem:master_ds_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
>>> username: sa
>>> password:
>>> master_ds_0_slave_0: !!com.zaxxer.hikari.HikariDataSource
>>> driverClassName: org.h2.Driver
>>> jdbcUrl: 
>>> jdbc:h2:mem:master_ds_0_slave_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
>>> username: sa
>>> password:
>>> shadowRule:
>>> shadowDataSources: # the shadow database, one to one mapping
>>> master_ds_0: !!com.zaxxer.hikari.HikariDataSource
>>> driverClassName: org.h2.Driver
>>> jdbcUrl: 
>>> jdbc:h2:mem:master_ds_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
>>> username: sa
>>> password:
>>> master_ds_0_slave_0: !!com.zaxxer.hikari.HikariDataSource
>>> driverClassName: org.h2.Driver
>>> jdbcUrl: 
>>> jdbc:h2:mem:master_ds_0_slave_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
>>> username: sa
>>> This way, require that every shadowDatasource map key mapping one of actual 
>>> datasources item key.
>>> 
>>> 
>>>  the other way: add copy configuration for shadow rule
>>>  # shadow config
>>> dataSources:
>>> master_ds_0: !!com.zaxxer.hikari.HikariDataSource
>>> driverClassName: org.h2.Driver
>>> jdbcUrl: 
>>> jdbc:h2:mem:master_ds_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
>>> username: sa
>>> password:
>>> master_ds_0_slave_0: !!com.zaxxer.hikari.HikariDataSource
>>> driverClassName: org.h2.Driver
>>> jdbcUrl: 
>>> jdbc:h2:mem:master_ds_0_slave_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
>>> username: sa
>>> password:
>>> 
>>> shardingRule:
>>> tables:
>>> t_user:
>>> actualDataNodes: ds_${0..1}.t_user_${0..15}
>>> databaseStrategy:
>>> complex:
>>> shardingColumns: region_id, user_id
>>> algorithmClassName: TestDatabaseComplexAlgorithmClassName
>>> tableStrategy:
>>> complex:
>>> shardingColumns: region_id, user_id
>>> algorithmClassName: TestTableComplexAlgorithmClassName
>>> bindingTables:
>>> - t_order, t_order_item
>>> broadcastTables:
>>> - t_config
>>> defaultDataSourceName: default_ds
>>> defaultDatabaseStrategy:
>>> inline:
>>> shardingColumn: order_id
>>> algorithmExpression: ds_${order_id % 2}
>>> defaultTableStrategy:
>>> none:
>>> masterSlaveRules:
>>> ds_0:
>>> masterDataSourceName: master_ds_0
>>> slaveDataSourceNames:
>>> - master_ds_0_slave_0
>>> - master_ds_0_slave_1
>>> loadBalanceAlgorithmType: ROUND_ROBIN
>>> ds_1:
>>> masterDataSourceName: master_ds_1
>>> slaveDataSourceNames:
>>> - master_ds_1_slave_0
>>> - master_ds_1_slave_1
>>> loadBalanceAlgorithmType: RANDOM
>>> shadowRule: # shadow rule
>>> column: is_shadow
>>> value: true
>>> dataSources:
>>> master_ds_0: !!com.zaxxer.hikari.HikariDataSource
>>> driverClassName: org.h2.Driver
>>> jdbcUrl: 
>>> jdbc:h2:mem:master_ds_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
>>> username: sa
>>> password:
>>> master_ds_0_slave_0: !!com.zaxxer.hikari.HikariDataSource
>>> driverClassName: org.h2.Driver
>>> jdbcUrl: 
>>> jdbc:h2:mem:master_ds_0_slave_0;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MYSQL
>>> username: sa
>>> password:
>>> shardingRule:
>>> tables:
>>> t_user:
>>> actualDataNodes: ds_${0..1}.t_user_${0..15}
>>> databaseStrategy:
>>> complex:
>>> shardingColumns: region_id, user_id
>>> algorithmClassName: TestDatabaseComplexAlgorithmClassName
>>> tableStrategy:
>>> complex:
>>> shardingColumns: region_id, user_id
>>> algorithmClassName: TestTableComplexAlgorithmClassName
>>> bindingTables:
>>> - t_order, t_order_item
>>> broadcastTables:
>>> - t_config
>>> defaultDataSourceName: default_ds
>>> defaultDatabaseStrategy:
>>> inline:
>>> shardingColumn: order_id
>>> algorithmExpression: ds_${order_id % 2}
>>> defaultTableStrategy:
>>> none:
>>> masterSlaveRules:
>>> ds_0:
>>> masterDataSourceName: master_ds_0
>>> slaveDataSourceNames:
>>> - master_ds_0_slave_0
>>> - master_ds_0_slave_1
>>> loadBalanceAlgorithmType: ROUND_ROBIN
>>> ds_1:
>>> masterDataSourceName: master_ds_1
>>> slaveDataSourceNames:
>>> - master_ds_1_slave_0
>>> - master_ds_1_slave_1
>>> loadBalanceAlgorithmType: RANDOM
>>> 
>>> props:
>>> sql.show: true
>>> This way will has something verbose config rule.
>>> 
>>> 
>> 

Reply via email to