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.
>>>
>>>
>>