You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ki...@apache.org on 2020/06/19 15:22:45 UTC
[shardingsphere] branch master updated: Reload and disable slave
databases when proxy/jdbc starts (#6115)
This is an automated email from the ASF dual-hosted git repository.
kimmking 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 7a4f1c5 Reload and disable slave databases when proxy/jdbc starts (#6115)
7a4f1c5 is described below
commit 7a4f1c5496133509e7cf8d3b29b703cb846071b3
Author: Haoran Meng <lo...@163.com>
AuthorDate: Fri Jun 19 23:22:32 2020 +0800
Reload and disable slave databases when proxy/jdbc starts (#6115)
* Reload and disable slave databases when proxy starts
* revise code style
* Reload and disable slave databases when proxy starts
* Reload and disable slave databases when JDBC starts
---
.../core/registrycenter/RegistryCenter.java | 12 +++++++++++
.../core/registrycenter/RegistryCenterTest.java | 12 +++++++++++
.../OrchestrationShardingSphereDataSource.java | 23 ++++++++++++++++++++++
.../org/apache/shardingsphere/proxy/Bootstrap.java | 21 ++++++++++++++++++++
4 files changed, 68 insertions(+)
diff --git a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/main/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenter.java b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/main/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenter.java
index 20670ec..90e5624 100644
--- a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/main/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenter.java
+++ b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/main/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenter.java
@@ -17,10 +17,12 @@
package org.apache.shardingsphere.orchestration.core.registrycenter;
+import com.google.common.base.Strings;
import org.apache.shardingsphere.orchestration.center.RegistryCenterRepository;
import org.apache.shardingsphere.orchestration.core.registrycenter.instance.OrchestrationInstance;
import java.util.Collection;
+import java.util.stream.Collectors;
/**
* RegistryCenter hold and persist instance state.
@@ -106,4 +108,14 @@ public final class RegistryCenter {
public String getDataSourcesNodeData(final String schemaDataSourceName) {
return repository.get(node.getDataSourcesNodeFullPath(schemaDataSourceName));
}
+
+ /**
+ * Load disabled data sources.
+ *
+ * @return Collection of disabled data sources
+ */
+ public Collection<String> loadDisabledDataSources() {
+ return loadAllDataSourcesNodes().stream().filter(each -> !Strings.isNullOrEmpty(getDataSourcesNodeData(each))
+ && RegistryCenterNodeStatus.DISABLED.toString().equalsIgnoreCase(getDataSourcesNodeData(each))).collect(Collectors.toList());
+ }
}
diff --git a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/test/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenterTest.java b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/test/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenterTest.java
index a63d401..3af9a58 100644
--- a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/test/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenterTest.java
+++ b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/test/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenterTest.java
@@ -25,9 +25,12 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.List;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public final class RegistryCenterTest {
@@ -68,4 +71,13 @@ public final class RegistryCenterTest {
registryCenter.loadInstanceData();
verify(registryCenterRepository).get(anyString());
}
+
+ @Test
+ public void assertLoadDisabledDataSources() {
+ List<String> disabledDataSources = Collections.singletonList("slave_ds_0");
+ when(registryCenterRepository.getChildrenKeys(anyString())).thenReturn(disabledDataSources);
+ registryCenter.loadDisabledDataSources();
+ verify(registryCenterRepository).getChildrenKeys(anyString());
+ verify(registryCenterRepository).get(anyString());
+ }
}
diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/datasource/OrchestrationShardingSphereDataSource.java b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/datasource/OrchestrationShardingSphereDataSource.java
index 758b764..a06e9e7 100644
--- a/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/datasource/OrchestrationShardingSphereDataSource.java
+++ b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/datasource/OrchestrationShardingSphereDataSource.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.driver.orchestration.internal.datasource;
+import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.eventbus.Subscribe;
import lombok.AccessLevel;
@@ -39,6 +40,7 @@ import org.apache.shardingsphere.infra.rule.event.impl.DataSourceNameDisabledEve
import org.apache.shardingsphere.kernel.context.SchemaContext;
import org.apache.shardingsphere.kernel.context.SchemaContexts;
import org.apache.shardingsphere.kernel.context.schema.ShardingSphereSchema;
+import org.apache.shardingsphere.masterslave.rule.MasterSlaveRule;
import org.apache.shardingsphere.orchestration.center.config.OrchestrationConfiguration;
import org.apache.shardingsphere.orchestration.core.common.event.DataSourceChangedEvent;
import org.apache.shardingsphere.orchestration.core.common.event.PropertiesChangedEvent;
@@ -74,6 +76,7 @@ public class OrchestrationShardingSphereDataSource extends AbstractOrchestration
Map<String, DataSourceConfiguration> dataSourceConfigurations = configService.loadDataSourceConfigurations(DefaultSchema.LOGIC_NAME);
dataSource = new ShardingSphereDataSource(DataSourceConverter.getDataSourceMap(dataSourceConfigurations), configurations, configService.loadProperties());
initShardingOrchestrationFacade();
+ disableDataSources();
persistMetaData(dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema());
initCluster();
}
@@ -83,6 +86,7 @@ public class OrchestrationShardingSphereDataSource extends AbstractOrchestration
dataSource = shardingSphereDataSource;
initShardingOrchestrationFacade(Collections.singletonMap(DefaultSchema.LOGIC_NAME, DataSourceConverter.getDataSourceConfigurationMap(dataSource.getDataSourceMap())),
getRuleConfigurationMap(), dataSource.getSchemaContexts().getProps().getProps());
+ disableDataSources();
persistMetaData(dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema());
initCluster();
}
@@ -95,6 +99,7 @@ public class OrchestrationShardingSphereDataSource extends AbstractOrchestration
Map<String, DataSourceConfiguration> dataSourceConfigurations = configService.loadDataSourceConfigurations(DefaultSchema.LOGIC_NAME);
dataSource = new ShardingSphereDataSource(DataSourceConverter.getDataSourceMap(dataSourceConfigurations), configurations, configService.loadProperties());
initShardingOrchestrationFacade(clusterConfiguration);
+ disableDataSources();
persistMetaData(dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema());
initCluster();
}
@@ -105,6 +110,7 @@ public class OrchestrationShardingSphereDataSource extends AbstractOrchestration
dataSource = shardingSphereDataSource;
initShardingOrchestrationFacade(Collections.singletonMap(DefaultSchema.LOGIC_NAME, DataSourceConverter.getDataSourceConfigurationMap(dataSource.getDataSourceMap())),
getRuleConfigurationMap(), dataSource.getSchemaContexts().getProps().getProps(), clusterConfiguration);
+ disableDataSources();
persistMetaData(dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema());
initCluster();
}
@@ -228,4 +234,21 @@ public class OrchestrationShardingSphereDataSource extends AbstractOrchestration
return new ShardingSphereSchema(oldShardingSphereSchema.getDatabaseType(), oldShardingSphereSchema.getConfigurations(),
oldShardingSphereSchema.getRules(), oldShardingSphereSchema.getDataSources(), metaData);
}
+
+ private void disableDataSources() {
+ Collection<String> disabledDataSources = ShardingOrchestrationFacade.getInstance().getRegistryCenter().loadDisabledDataSources();
+ if (!disabledDataSources.isEmpty()) {
+ dataSource.getSchemaContexts().getSchemaContexts().entrySet().forEach(entry -> entry.getValue().getSchema().getRules()
+ .stream().filter(each -> each instanceof MasterSlaveRule).forEach(e -> disableDataSources((MasterSlaveRule) e, disabledDataSources, entry.getKey())));
+ }
+ }
+
+ private void disableDataSources(final MasterSlaveRule masterSlaveRule,
+ final Collection<String> disabledDataSources, final String schemaName) {
+ masterSlaveRule.getSingleDataSourceRule().getSlaveDataSourceNames().forEach(each -> {
+ if (disabledDataSources.contains(Joiner.on(".").join(schemaName, each))) {
+ masterSlaveRule.updateRuleStatus(new DataSourceNameDisabledEvent(each, true));
+ }
+ });
+ }
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/Bootstrap.java b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/Bootstrap.java
index 7e70d5b..c727ab2 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/Bootstrap.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/Bootstrap.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.proxy;
+import com.google.common.base.Joiner;
import com.google.common.primitives.Ints;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
@@ -35,10 +36,12 @@ import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.DatabaseTypes;
import org.apache.shardingsphere.infra.exception.ShardingSphereException;
import org.apache.shardingsphere.infra.log.ConfigurationLogger;
+import org.apache.shardingsphere.infra.rule.event.impl.DataSourceNameDisabledEvent;
import org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine;
import org.apache.shardingsphere.kernel.context.SchemaContextsAware;
import org.apache.shardingsphere.kernel.context.SchemaContextsBuilder;
import org.apache.shardingsphere.kernel.context.schema.DataSourceParameter;
+import org.apache.shardingsphere.masterslave.rule.MasterSlaveRule;
import org.apache.shardingsphere.metrics.configuration.config.MetricsConfiguration;
import org.apache.shardingsphere.metrics.configuration.swapper.MetricsConfigurationYamlSwapper;
import org.apache.shardingsphere.metrics.configuration.yaml.YamlMetricsConfiguration;
@@ -167,6 +170,7 @@ public final class Bootstrap {
ProxySchemaContexts.getInstance().init(schemaContexts);
if (isOrchestration) {
persistMetaData(schemaContexts);
+ disableDataSources(schemaContexts);
}
}
@@ -175,6 +179,23 @@ public final class Bootstrap {
.getMetaDataCenter().persistMetaDataCenterNode(key, value.getSchema().getMetaData().getSchema()));
}
+ private static void disableDataSources(final SchemaContextsAware schemaContexts) {
+ Collection<String> disabledDataSources = ShardingOrchestrationFacade.getInstance().getRegistryCenter().loadDisabledDataSources();
+ if (!disabledDataSources.isEmpty()) {
+ schemaContexts.getSchemaContexts().entrySet().forEach(entry -> entry.getValue().getSchema().getRules()
+ .stream().filter(each -> each instanceof MasterSlaveRule).forEach(e -> disableDataSources((MasterSlaveRule) e, disabledDataSources, entry.getKey())));
+ }
+ }
+
+ private static void disableDataSources(final MasterSlaveRule masterSlaveRule,
+ final Collection<String> disabledDataSources, final String schemaName) {
+ masterSlaveRule.getSingleDataSourceRule().getSlaveDataSourceNames().forEach(each -> {
+ if (disabledDataSources.contains(Joiner.on(".").join(schemaName, each))) {
+ masterSlaveRule.updateRuleStatus(new DataSourceNameDisabledEvent(each, true));
+ }
+ });
+ }
+
private static Map<String, Map<String, DataSource>> createDataSourcesMap(final Map<String, Map<String, DataSourceParameter>> schemaDataSources) {
return schemaDataSources.entrySet().stream().collect(Collectors.toMap(Entry::getKey, entry -> createDataSources(entry.getValue()), (oldVal, currVal) -> oldVal, LinkedHashMap::new));
}