You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2022/06/22 06:44:46 UTC
[shardingsphere] branch master updated: Add query route primary data source when replica all offline. (#18473)
This is an automated email from the ASF dual-hosted git repository.
panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 1edfca136e4 Add query route primary data source when replica all offline. (#18473)
1edfca136e4 is described below
commit 1edfca136e4d10017355844116075db5d8beade5
Author: zhaojinchao <zh...@apache.org>
AuthorDate: Wed Jun 22 14:44:34 2022 +0800
Add query route primary data source when replica all offline. (#18473)
* Add query route primary data source when replica all offline.
* Adjust unit test
* Modify document
* Fix bug
* Adjust key name
* Adjust method name
---
.../java-api/rules/readwrite-splitting.cn.md | 12 +++++------
.../java-api/rules/readwrite-splitting.en.md | 12 +++++------
.../rules/readwrite-splitting.cn.md | 1 +
.../rules/readwrite-splitting.en.md | 1 +
.../rules/readwrite-splitting.cn.md | 2 +-
.../rules/readwrite-splitting.en.md | 2 +-
.../yaml-config/rules/readwrite-splitting.cn.md | 1 +
.../yaml-config/rules/readwrite-splitting.en.md | 1 +
.../impl/ReadwriteSplittingDataSourceRouter.java | 8 ++++++-
.../ReadwriteSplittingStrategyFactory.java | 3 ++-
.../type/DynamicReadwriteSplittingStrategy.java | 2 ++
...teSplittingDataSourceRuleConfigurationTest.java | 25 +++++++++++++++-------
12 files changed, 46 insertions(+), 24 deletions(-)
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/readwrite-splitting.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/readwrite-splitting.cn.md
index 7eb326cfb42..f76f065e868 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/readwrite-splitting.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/readwrite-splitting.cn.md
@@ -20,12 +20,12 @@ weight = 2
可配置属性:
-| *名称* | *数据类型* | *说明* | *默认值* |
-| -------------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------| ---------------|
-| name | String | 读写分离数据源名称 | - |
-| type | String | 读写分离类型,分为静态和动态。如 Static、Dynamic | - |
-| props | Properties | 读写分离所需属性,如静态:write-data-source-name、read-data-source-names,动态:auto-aware-data-source-name | - |
-| loadBalancerName (?) | String | 读库负载均衡算法名称 | 轮询负载均衡算法 |
+| *名称* | *数据类型* | *说明* | *默认值* |
+| -------------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------| ---------------|
+| name | String | 读写分离数据源名称 | - |
+| type | String | 读写分离类型,分为静态和动态。如 Static、Dynamic | - |
+| props | Properties | 读写分离所需属性,如静态:write-data-source-name、read-data-source-names,动态:auto-aware-data-source-name、write-data-source-query-enabled | - |
+| loadBalancerName (?) | String | 读库负载均衡算法名称 | 轮询负载均衡算法 |
算法类型的详情,请参见[内置负载均衡算法列表](/cn/user-manual/shardingsphere-jdbc/builtin-algorithm/load-balance)。
查询一致性路由的详情,请参见[使用规范](/cn/features/readwrite-splitting/use-norms)。
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/readwrite-splitting.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/readwrite-splitting.en.md
index 1988dda82a3..335c6582918 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/readwrite-splitting.en.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/java-api/rules/readwrite-splitting.en.md
@@ -20,12 +20,12 @@ Class name: org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplit
Attributes:
-| *Name* | *DataType* | *Description* | *Default Value* |
-| -------------------------- | -------------------- | -------------------------------------------------- | ---------------------------------- |
-| name | String | Readwrite-splitting data source name | - |
-| type | String | Readwrite-splitting type, such as: Static, Dynamic | - |
-| props | Properties | Readwrite-splitting required properties. Static: write-data-source-name, read-data-source-names, Dynamic: auto-aware-data-source-name| - |
-| loadBalancerName (?) | String | Load balance algorithm name of replica sources | Round robin load balance algorithm |
+| *Name* | *DataType* | *Description* | *Default Value* |
+| -------------------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------|
+| name | String | Readwrite-splitting data source name | - |
+| type | String | Readwrite-splitting type, such as: Static, Dynamic | - |
+| props | Properties | Readwrite-splitting required properties. Static: write-data-source-name, read-data-source-names, Dynamic: auto-aware-data-source-name, write-data-source-query-enabled| - |
+| loadBalancerName (?) | String | Load balance algorithm name of replica sources | Round robin load balance algorithm |
Please refer to [Built-in Load Balance Algorithm List](/en/user-manual/shardingsphere-jdbc/builtin-algorithm/load-balance) for more details about type of algorithm.
Please refer to [Use Norms](/en/features/readwrite-splitting/use-norms) for more details about query consistent routing.
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/readwrite-splitting.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/readwrite-splitting.cn.md
index c63e2b7783a..9a4ac772788 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/readwrite-splitting.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/readwrite-splitting.cn.md
@@ -10,6 +10,7 @@ spring.shardingsphere.datasource.names= # 省略数据源配置,请参考使
spring.shardingsphere.rules.readwrite-splitting.data-sources.<readwrite-splitting-data-source-name>.type= # 读写分离类型,如: Static,Dynamic
spring.shardingsphere.rules.readwrite-splitting.data-sources.<readwrite-splitting-data-source-name>.props.auto-aware-data-source-name= # 自动发现数据源名称(与数据库发现配合使用)
+spring.shardingsphere.rules.readwrite-splitting.data-sources.<readwrite-splitting-data-source-name>.props.write-data-source-query-enabled= # 从库全部宕机、主库是否承担读流量(与数据库发现配合使用)
spring.shardingsphere.rules.readwrite-splitting.data-sources.<readwrite-splitting-data-source-name>.props.write-data-source-name= # 写数据源名称
spring.shardingsphere.rules.readwrite-splitting.data-sources.<readwrite-splitting-data-source-name>.props.read-data-source-names= # 读数据源名称,多个从数据源用逗号分隔
spring.shardingsphere.rules.readwrite-splitting.data-sources.<readwrite-splitting-data-source-name>.load-balancer-name= # 负载均衡算法名称
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/readwrite-splitting.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/readwrite-splitting.en.md
index 5e1e52f7111..f5d89eb25df 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/readwrite-splitting.en.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/readwrite-splitting.en.md
@@ -10,6 +10,7 @@ spring.shardingsphere.datasource.names= # Omit the data source configuration, pl
spring.shardingsphere.rules.readwrite-splitting.data-sources.<readwrite-splitting-data-source-name>.type= # Readwrite-splitting type, such as: Static, Dynamic
spring.shardingsphere.rules.readwrite-splitting.data-sources.<readwrite-splitting-data-source-name>.props.auto-aware-data-source-name= # Auto aware data source name(Use with database discovery)
+spring.shardingsphere.rules.readwrite-splitting.data-sources.<readwrite-splitting-data-source-name>.props.write-data-source-query-enabled= # replicas all offline, primary data source whether provide query(Use with database discovery)
spring.shardingsphere.rules.readwrite-splitting.data-sources.<readwrite-splitting-data-source-name>.props.write-data-source-name= # Write data source name
spring.shardingsphere.rules.readwrite-splitting.data-sources.<readwrite-splitting-data-source-name>.props.read-data-source-names= # Read data source names, multiple data source names separated with comma
spring.shardingsphere.rules.readwrite-splitting.data-sources.<readwrite-splitting-data-source-name>.load-balancer-name= # Load balance algorithm name
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/spring-namespace/rules/readwrite-splitting.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/spring-namespace/rules/readwrite-splitting.cn.md
index 01e202ed96b..63c6ac5fc3c 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/spring-namespace/rules/readwrite-splitting.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/spring-namespace/rules/readwrite-splitting.cn.md
@@ -20,7 +20,7 @@ weight = 2
| -------------------------- | ----- | -------------------------------------------- |
| id | 属性 | 读写分离数据源规则名称 |
| type | 属性 | 读写分离类型,分为静态和动态。如 Static、Dynamic |
-| props | 标签 | 读写分离所需属性,如静态:write-data-source-name、read-data-source-names,动态:auto-aware-data-source-name |
+| props | 标签 | 读写分离所需属性,如静态:write-data-source-name、read-data-source-names,动态:auto-aware-data-source-name、write-data-source-query-enabled |
| load-balance-algorithm-ref | 属性 | 负载均衡算法名称 |
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/spring-namespace/rules/readwrite-splitting.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/spring-namespace/rules/readwrite-splitting.en.md
index 532e6362291..9c8447b5a37 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/spring-namespace/rules/readwrite-splitting.en.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/spring-namespace/rules/readwrite-splitting.en.md
@@ -20,7 +20,7 @@ Namespace: [http://shardingsphere.apache.org/schema/shardingsphere/readwrite-spl
| -------------------------- | ---------- | ----------------------------------------------------------------------- |
| id | Attribute | Readwrite-splitting data source rule name |
| type | Attribute | Readwrite-splitting type, such as: Static, Dynamic |
-| props | Tag | Readwrite-splitting required properties. Static: write-data-source-name, read-data-source-names, Dynamic: auto-aware-data-source-name |
+| props | Tag | Readwrite-splitting required properties. Static: write-data-source-name, read-data-source-names, Dynamic: auto-aware-data-source-name, write-data-source-query-enabled |
| load-balance-algorithm-ref | Attribute | Load balance algorithm name |
\<readwrite-splitting:load-balance-algorithm />
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/rules/readwrite-splitting.cn.md b/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/rules/readwrite-splitting.cn.md
index 1d7a71f9042..e09ed484886 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/rules/readwrite-splitting.cn.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/rules/readwrite-splitting.cn.md
@@ -13,6 +13,7 @@ rules:
type: # 读写分离类型,比如:Static,Dynamic
props:
auto-aware-data-source-name: # 自动发现数据源名称(与数据库发现配合使用)
+ write-data-source-query-enabled: # 从库全部宕机、主库是否承担读流量(与数据库发现配合使用)
write-data-source-name: # 写库数据源名称
read-data-source-names: # 读库数据源名称,多个从数据源用逗号分隔
loadBalancerName: # 负载均衡算法名称
diff --git a/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/rules/readwrite-splitting.en.md b/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/rules/readwrite-splitting.en.md
index 836cc3c68ad..b1669edc005 100644
--- a/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/rules/readwrite-splitting.en.md
+++ b/docs/document/content/user-manual/shardingsphere-jdbc/yaml-config/rules/readwrite-splitting.en.md
@@ -13,6 +13,7 @@ rules:
type: # Readwrite-splitting type, such as: Static, Dynamic
props:
auto-aware-data-source-name: # Auto aware data source name(Use with database discovery)
+ write-data-source-query-enabled: # replicas all offline, primary data source whether provide query(Use with database discovery)
write-data-source-name: # Write data source name
read-data-source-names: # Read data source names, multiple data source names separated with comma
loadBalancerName: # Load balance algorithm name
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/impl/ReadwriteSplittingDataSourceRouter.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/impl/ReadwriteSplittingDataSourceRouter.java
index ae0a78296d3..5773ff964e1 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/impl/ReadwriteSplittingDataSourceRouter.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/route/impl/ReadwriteSplittingDataSourceRouter.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.hint.HintManager;
import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingDataSourceRule;
+import org.apache.shardingsphere.readwritesplitting.strategy.type.DynamicReadwriteSplittingStrategy;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.SelectStatementHandler;
@@ -49,7 +50,7 @@ public final class ReadwriteSplittingDataSourceRouter {
}
private boolean isPrimaryRoute(final SQLStatementContext<?> sqlStatementContext) {
- return isWriteRouteStatement(sqlStatementContext) || isHintWriteRouteOnly(sqlStatementContext);
+ return isWriteRouteStatement(sqlStatementContext) || isHintWriteRouteOnly(sqlStatementContext) || isAllowWriteDataSourceQuery();
}
private boolean isWriteRouteStatement(final SQLStatementContext<?> sqlStatementContext) {
@@ -68,4 +69,9 @@ public final class ReadwriteSplittingDataSourceRouter {
private boolean isHintWriteRouteOnly(final SQLStatementContext<?> sqlStatementContext) {
return HintManager.isWriteRouteOnly() || (sqlStatementContext instanceof CommonSQLStatementContext && ((CommonSQLStatementContext<?>) sqlStatementContext).isHintWriteRouteOnly());
}
+
+ private boolean isAllowWriteDataSourceQuery() {
+ return rule.getEnabledReplicaDataSources().isEmpty() && (rule.getReadwriteSplittingStrategy() instanceof DynamicReadwriteSplittingStrategy)
+ && ((DynamicReadwriteSplittingStrategy) rule.getReadwriteSplittingStrategy()).isAllowWriteDataSourceQuery();
+ }
}
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/strategy/ReadwriteSplittingStrategyFactory.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/strategy/ReadwriteSplittingStrategyFactory.java
index 92300a7df12..26e44c296f8 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/strategy/ReadwriteSplittingStrategyFactory.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/strategy/ReadwriteSplittingStrategyFactory.java
@@ -61,6 +61,7 @@ public final class ReadwriteSplittingStrategyFactory {
Preconditions.checkArgument(!Strings.isNullOrEmpty(autoAwareDataSourceName), "Auto aware data source name is required.");
Optional<DynamicDataSourceStrategy> dynamicDataSourceStrategy = DynamicDataSourceStrategyFactory.findInstance();
Preconditions.checkArgument(dynamicDataSourceStrategy.isPresent(), "Dynamic data source strategy is required.");
- return new DynamicReadwriteSplittingStrategy(autoAwareDataSourceName, dynamicDataSourceStrategy.get());
+ boolean allowWriteDataSourceQuery = Boolean.parseBoolean(props.getOrDefault("write-data-source-query-enabled", String.valueOf(Boolean.TRUE)).toString());
+ return new DynamicReadwriteSplittingStrategy(autoAwareDataSourceName, allowWriteDataSourceQuery, dynamicDataSourceStrategy.get());
}
}
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/strategy/type/DynamicReadwriteSplittingStrategy.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/strategy/type/DynamicReadwriteSplittingStrategy.java
index 13960979619..15694de2cce 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/strategy/type/DynamicReadwriteSplittingStrategy.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/main/java/org/apache/shardingsphere/readwritesplitting/strategy/type/DynamicReadwriteSplittingStrategy.java
@@ -36,6 +36,8 @@ public final class DynamicReadwriteSplittingStrategy implements ReadwriteSplitti
private final String autoAwareDataSourceName;
+ private final boolean allowWriteDataSourceQuery;
+
private final DynamicDataSourceStrategy dynamicDataSourceStrategy;
@Override
diff --git a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadWriteSplittingDataSourceRuleConfigurationTest.java b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadWriteSplittingDataSourceRuleConfigurationTest.java
index 58633681d68..8365645949d 100644
--- a/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadWriteSplittingDataSourceRuleConfigurationTest.java
+++ b/shardingsphere-features/shardingsphere-readwrite-splitting/shardingsphere-readwrite-splitting-core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadWriteSplittingDataSourceRuleConfigurationTest.java
@@ -24,7 +24,7 @@ import org.junit.Test;
import java.util.Properties;
import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
public final class ReadWriteSplittingDataSourceRuleConfigurationTest {
@@ -35,13 +35,15 @@ public final class ReadWriteSplittingDataSourceRuleConfigurationTest {
@Before
public void setup() {
- readwriteSplittingDataSourceRuleConfig = new ReadwriteSplittingDataSourceRuleConfiguration("ds", "Static", getProperties("write_ds", "read_ds_0,read_ds_1"), "");
- readwriteSplittingDataSourceRuleConfigDynamic = new ReadwriteSplittingDataSourceRuleConfiguration("ds", "Dynamic", getProperties("write_ds", "read_ds_0,read_ds_1"), "");
+ readwriteSplittingDataSourceRuleConfig = new ReadwriteSplittingDataSourceRuleConfiguration("ds", "Static", getStaticReadwriteSplittingProperties(), "");
+ readwriteSplittingDataSourceRuleConfigDynamic = new ReadwriteSplittingDataSourceRuleConfiguration("ds", "Dynamic", getDynamicReadwriteSplittingProperties(), "");
}
@Test
- public void assertGetAutoAwareDataSourceName() {
- assertNull(readwriteSplittingDataSourceRuleConfigDynamic.getProps().getProperty("auto-aware-data-source-name"));
+ public void assertDynamicReadWriteSplittingConfig() {
+ assertNotNull(readwriteSplittingDataSourceRuleConfigDynamic.getProps());
+ assertThat(readwriteSplittingDataSourceRuleConfigDynamic.getProps().getProperty("auto-aware-data-source-name"), is("readwrite_ds"));
+ assertThat(readwriteSplittingDataSourceRuleConfigDynamic.getProps().getProperty("write-data-source-query-enabled"), is("false"));
}
@Test
@@ -54,10 +56,17 @@ public final class ReadWriteSplittingDataSourceRuleConfigurationTest {
assertThat(readwriteSplittingDataSourceRuleConfig.getProps().getProperty("read-data-source-names"), is("read_ds_0,read_ds_1"));
}
- private Properties getProperties(final String writeDataSource, final String readDataSources) {
+ private Properties getStaticReadwriteSplittingProperties() {
Properties result = new Properties();
- result.setProperty("write-data-source-name", writeDataSource);
- result.setProperty("read-data-source-names", readDataSources);
+ result.setProperty("write-data-source-name", "write_ds");
+ result.setProperty("read-data-source-names", "read_ds_0,read_ds_1");
+ return result;
+ }
+
+ private Properties getDynamicReadwriteSplittingProperties() {
+ Properties result = new Properties();
+ result.setProperty("auto-aware-data-source-name", "readwrite_ds");
+ result.setProperty("write-data-source-query-enabled", "false");
return result;
}
}