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 <[email protected]>
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;
}
}