变更历史

ShardingSphere-5.0.0-alpha

读写分离

配置入口

类名称:ReplicaQueryRuleConfiguration

可配置属性:

名称数据类型说明
dataSources (+)Collection<ReplicaQueryDataSourceRuleConfiguration>主从数据源配置
loadBalancers (*)Map<String, ShardingSphereAlgorithmConfiguration>从库负载均衡算法配置

主从数据源配置

类名称:ReplicaQueryDataSourceRuleConfiguration

可配置属性:

名称数据类型说明默认值
nameString读写分离数据源名称-
primaryDataSourceNameString主库数据源名称-
replicaDataSourceNames (+)Collection<String>从库数据源名称列表-
loadBalancerName (?)String从库负载均衡算法名称轮询负载均衡算法

算法类型的详情,请参见内置负载均衡算法列表

ShardingSphere-4.x

读写分离

MasterSlaveDataSourceFactory

读写分离的数据源创建工厂。

名称数据类型说明
dataSourceMapMap<String, DataSource>数据源与其名称的映射
masterSlaveRuleConfigMasterSlaveRuleConfiguration读写分离规则
props (?)Properties属性配置

MasterSlaveRuleConfiguration

读写分离规则配置对象。

名称数据类型说明
nameString读写分离数据源名称
masterDataSourceNameString主库数据源名称
slaveDataSourceNamesCollection从库数据源名称列表
loadBalanceAlgorithm (?)MasterSlaveLoadBalanceAlgorithm从库负载均衡算法

Properties

属性配置项,可以为以下属性。

名称数据类型说明
sql.show (?)boolean是否打印SQL解析和改写日志,默认值: false
executor.size (?)int用于SQL执行的工作线程数量,为零则表示无限制。默认值: 0
max.connections.size.per.query (?)int每个物理数据库为每次查询分配的最大连接数量。默认值: 1
check.table.metadata.enabled (?)boolean是否在启动时检查分表元数据一致性,默认值: false

ShardingSphere-3.x

读写分离

MasterSlaveDataSourceFactory

读写分离的数据源创建工厂。

名称数据类型说明
dataSourceMapMap<String, DataSource>数据源与其名称的映射
masterSlaveRuleConfigMasterSlaveRuleConfiguration读写分离规则
configMap (?)Map<String, Object>用户自定义配置
props (?)Properties属性配置

MasterSlaveRuleConfiguration

读写分离规则配置对象。

名称数据类型说明
nameString读写分离数据源名称
masterDataSourceNameString主库数据源名称
slaveDataSourceNamesCollection从库数据源名称列表
loadBalanceAlgorithm (?)MasterSlaveLoadBalanceAlgorithm从库负载均衡算法

configMap

用户自定义配置。

PropertiesConstant

属性配置项,可以为以下属性。

名称数据类型说明
sql.show (?)boolean是否打印SQL解析和改写日志,默认值: false
executor.size (?)int用于SQL执行的工作线程数量,为零则表示无限制。默认值: 0
max.connections.size.per.query (?)int每个物理数据库为每次查询分配的最大连接数量。默认值: 1
check.table.metadata.enabled (?)boolean是否在启动时检查分表元数据一致性,默认值: false

ShardingSphere-2.x

读写分离

概念

为了缓解数据库压力,将写入和读取操作分离为不同数据源,写库称为主库,读库称为从库,一主库可配置多从库。

支持项

  1. 提供了一主多从的读写分离配置,可独立使用,也可配合分库分表使用。
  2. 独立使用读写分离支持SQL透传。
  3. 同一线程且同一数据库连接内,如有写入操作,以后的读操作均从主库读取,用于保证数据一致性。
  4. Spring命名空间。
  5. 基于Hint的强制主库路由。

不支持范围

  1. 主库和从库的数据同步。
  2. 主库和从库的数据同步延迟导致的数据不一致。
  3. 主库双写或多写。

代码开发示例

仅读写分离
  1. // 构建读写分离数据源, 读写分离数据源实现了DataSource接口, 可直接当做数据源处理. masterDataSource, slaveDataSource0, slaveDataSource1等为使用DBCP等连接池配置的真实数据源
  2. Map<String, DataSource> dataSourceMap = new HashMap<>();
  3. dataSourceMap.put("masterDataSource", masterDataSource);
  4. dataSourceMap.put("slaveDataSource0", slaveDataSource0);
  5. dataSourceMap.put("slaveDataSource1", slaveDataSource1);
  6. // 构建读写分离配置
  7. MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration();
  8. masterSlaveRuleConfig.setName("ms_ds");
  9. masterSlaveRuleConfig.setMasterDataSourceName("masterDataSource");
  10. masterSlaveRuleConfig.getSlaveDataSourceNames().add("slaveDataSource0");
  11. masterSlaveRuleConfig.getSlaveDataSourceNames().add("slaveDataSource1");
  12. DataSource dataSource = MasterSlaveDataSourceFactory.createDataSource(dataSourceMap, masterSlaveRuleConfig);
分库分表 + 读写分离
  1. // 构建读写分离数据源, 读写分离数据源实现了DataSource接口, 可直接当做数据源处理. masterDataSource0, slaveDataSource00, slaveDataSource01等为使用DBCP等连接池配置的真实数据源
  2. Map<String, DataSource> dataSourceMap = new HashMap<>();
  3. dataSourceMap.put("masterDataSource0", masterDataSource0);
  4. dataSourceMap.put("slaveDataSource00", slaveDataSource00);
  5. dataSourceMap.put("slaveDataSource01", slaveDataSource01);
  6. dataSourceMap.put("masterDataSource1", masterDataSource1);
  7. dataSourceMap.put("slaveDataSource10", slaveDataSource10);
  8. dataSourceMap.put("slaveDataSource11", slaveDataSource11);
  9. // 构建读写分离配置
  10. MasterSlaveRuleConfiguration masterSlaveRuleConfig0 = new MasterSlaveRuleConfiguration();
  11. masterSlaveRuleConfig0.setName("ds_0");
  12. masterSlaveRuleConfig0.setMasterDataSourceName("masterDataSource0");
  13. masterSlaveRuleConfig0.getSlaveDataSourceNames().add("slaveDataSource00");
  14. masterSlaveRuleConfig0.getSlaveDataSourceNames().add("slaveDataSource01");
  15. MasterSlaveRuleConfiguration masterSlaveRuleConfig1 = new MasterSlaveRuleConfiguration();
  16. masterSlaveRuleConfig1.setName("ds_1");
  17. masterSlaveRuleConfig1.setMasterDataSourceName("masterDataSource1");
  18. masterSlaveRuleConfig1.getSlaveDataSourceNames().add("slaveDataSource10");
  19. masterSlaveRuleConfig1.getSlaveDataSourceNames().add("slaveDataSource11");
  20. // 通过ShardingSlaveDataSourceFactory继续创建ShardingDataSource
  21. ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
  22. shardingRuleConfig.getMasterSlaveRuleConfigs().add(masterSlaveRuleConfig0);
  23. shardingRuleConfig.getMasterSlaveRuleConfigs().add(masterSlaveRuleConfig1);
  24. DataSource dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig);

ShardingSphere-1.x

读写分离

概念

为了缓解数据库压力,将写入和读取操作分离为不同数据源,写库称为主库,读库称为从库,一主库可配置多从库。

支持项

  1. 提供了一主多从的读写分离配置,可独立使用,也可配合分库分表使用。
  2. 同一线程且同一数据库连接内,如有写入操作,以后的读操作均从主库读取,用于保证数据一致性。
  3. Spring命名空间。
  4. 基于Hint的强制主库路由。

不支持范围

  1. 主库和从库的数据同步。
  2. 主库和从库的数据同步延迟导致的数据不一致。
  3. 主库双写或多写。

代码开发示例

  1. // 构建读写分离数据源, 读写分离数据源实现了DataSource接口, 可直接当做数据源处理. masterDataSource0, slaveDataSource00, slaveDataSource01等为使用DBCP等连接池配置的真实数据源
  2. Map<String, DataSource> slaveDataSourceMap0 = new HashMap<>();
  3. slaveDataSourceMap0.put("slaveDataSource00", slaveDataSource00);
  4. slaveDataSourceMap0.put("slaveDataSource01", slaveDataSource01);
  5. // 可选择主从库负载均衡策略, 默认是ROUND_ROBIN, 还有RANDOM可以选择, 或者自定义负载策略
  6. DataSource masterSlaveDs0 = MasterSlaveDataSourceFactory.createDataSource("ms_0", "masterDataSource0", masterDataSource0, slaveDataSourceMap0, MasterSlaveLoadBalanceStrategyType.ROUND_ROBIN);
  7. Map<String, DataSource> slaveDataSourceMap1 = new HashMap<>();
  8. slaveDataSourceMap1.put("slaveDataSource10", slaveDataSource10);
  9. slaveDataSourceMap1.put("slaveDataSource11", slaveDataSource11);
  10. DataSource masterSlaveDs1 = MasterSlaveDataSourceFactory.createDataSource("ms_1", "masterDataSource1", masterDataSource1, slaveDataSourceMap1, MasterSlaveLoadBalanceStrategyType.ROUND_ROBIN);
  11. // 构建分库分表数据源
  12. Map<String, DataSource> dataSourceMap = new HashMap<>();
  13. dataSourceMap.put("ms_0", masterSlaveDs0);
  14. dataSourceMap.put("ms_1", masterSlaveDs1);
  15. // 通过ShardingDataSourceFactory继续创建ShardingDataSource