This is an automated email from the ASF dual-hosted git repository.

zhaojinchao 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 a3412da56de Add new meta data builder SPI implementation (#25476)
a3412da56de is described below

commit a3412da56dee61dbf1225a7714a6e89ad845776e
Author: ChenJiaHao <[email protected]>
AuthorDate: Sat May 6 14:31:07 2023 +0800

    Add new meta data builder SPI implementation (#25476)
    
    * Add new meta data builder SPI implementation
    
    * Modify AbstractMetaDataPersistService to interface
    
    * Update new metadata implementation comments
    
    * Rename AbstractMetaDataPersistService to MetaDataBasedPersistService
    
    * Fix code style
---
 .../jdbc/core/connection/ConnectionManager.java    |   6 +-
 .../shardingsphere/metadata/MetaDataFactory.java   |   3 +-
 ...etaDataFactory.java => NewMetaDataFactory.java} |  17 +-
 .../metadata/factory/InternalMetaDataFactory.java  |   8 +-
 ...actory.java => NewInternalMetaDataFactory.java} |  13 +-
 .../persist/MetaDataBasedPersistService.java       | 125 ++++++++++++++
 .../metadata/persist/MetaDataPersistService.java   |   6 +-
 ...Service.java => NewMetaDataPersistService.java} |  12 +-
 .../ShardingSphereDataBasedPersistService.java     |  58 +++++++
 .../data/ShardingSphereDataPersistService.java     |   2 +-
 .../database/DatabaseBasedPersistService.java      |  11 ++
 .../config/global/GlobalPersistService.java        |  15 ++
 .../DatabaseMetaDataBasedPersistService.java       | 119 +++++++++++++
 .../DatabaseMetaDataPersistService.java            |   4 +-
 .../ShardingSphereTableRowDataPersistService.java  |   2 +-
 .../schema/TableRowDataBasedPersistService.java    |  62 +++++++
 .../MetaDataVersionBasedPersistService.java}       |  50 +++---
 .../MetaDataVersionPersistService.java             |   4 +-
 .../DatabaseMetaDataPersistServiceTest.java        |   1 +
 .../service/MetaDataVersionPersistServiceTest.java |   1 +
 .../mode/manager/ContextManager.java               |   4 +-
 .../mode/metadata/MetaDataContexts.java            |   6 +-
 .../mode/metadata/NewMetaDataContextsFactory.java  | 185 +++++++++++++++++++++
 .../mode/manager/ContextManagerTest.java           |   2 +-
 .../mode/metadata/MetaDataContextsFactoryTest.java |   2 +-
 .../manager/cluster/ClusterModeContextManager.java |   8 +-
 .../cluster/NewClusterContextManagerBuilder.java   |  97 +++++++++++
 .../NewConfigurationChangedSubscriber.java         | 154 +++++++++++++++++
 .../NewContextManagerSubscriberFacade.java         |  40 +++++
 ...rYamlPersistRepositoryConfigurationSwapper.java |  50 ++++++
 ....mode.YamlPersistRepositoryConfigurationSwapper |   1 +
 ...ardingsphere.mode.manager.ContextManagerBuilder |   1 +
 .../standalone/StandaloneModeContextManager.java   |  12 +-
 ...wStatusFromReadwriteSplittingRulesExecutor.java |   4 +-
 ...SplittingStorageUnitStatusStatementUpdater.java |  12 +-
 .../ral/updatable/LabelComputeNodeUpdater.java     |   4 +-
 .../ral/updatable/UnlabelComputeNodeUpdater.java   |   4 +-
 37 files changed, 1011 insertions(+), 94 deletions(-)

diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ConnectionManager.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ConnectionManager.java
index 11a41b5a719..381f48ac743 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ConnectionManager.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ConnectionManager.java
@@ -27,17 +27,17 @@ import 
org.apache.shardingsphere.driver.jdbc.adapter.invocation.MethodInvocation
 import org.apache.shardingsphere.driver.jdbc.core.ShardingSphereSavepoint;
 import org.apache.shardingsphere.infra.connection.ConnectionContext;
 import 
org.apache.shardingsphere.infra.connection.transaction.TransactionConnectionContext;
-import 
org.apache.shardingsphere.infra.exception.OverallConnectionNotEnoughException;
 import 
org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCreator;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
+import 
org.apache.shardingsphere.infra.exception.OverallConnectionNotEnoughException;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.ExecutorJDBCConnectionManager;
 import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData;
 import org.apache.shardingsphere.infra.instance.metadata.InstanceType;
 import 
org.apache.shardingsphere.infra.instance.metadata.proxy.ProxyInstanceMetaData;
 import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
+import org.apache.shardingsphere.metadata.persist.MetaDataBasedPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.traffic.rule.TrafficRule;
 import org.apache.shardingsphere.transaction.ConnectionSavepointManager;
 import org.apache.shardingsphere.transaction.ConnectionTransaction;
@@ -95,7 +95,7 @@ public final class ConnectionManager implements 
ExecutorJDBCConnectionManager, A
         if (rule.getStrategyRules().isEmpty()) {
             return Collections.emptyMap();
         }
-        MetaDataPersistService persistService = 
contextManager.getMetaDataContexts().getPersistService();
+        MetaDataBasedPersistService persistService = 
contextManager.getMetaDataContexts().getPersistService();
         String actualDatabaseName = 
contextManager.getMetaDataContexts().getMetaData().getActualDatabaseName(databaseName);
         Map<String, DataSourceProperties> dataSourcePropsMap = 
persistService.getDataSourceService().load(actualDatabaseName);
         Preconditions.checkState(!dataSourcePropsMap.isEmpty(), "Can not get 
data source properties from meta data.");
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java
index 79549ff1e70..6d160ac5cb5 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.instance.InstanceContext;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
 import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory;
+import org.apache.shardingsphere.metadata.persist.MetaDataBasedPersistService;
 import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 
 import java.sql.SQLException;
@@ -48,7 +49,7 @@ public final class MetaDataFactory {
      * @return database meta data
      * @throws SQLException sql exception
      */
-    public static ShardingSphereDatabase create(final String databaseName, 
final boolean internalLoadMetaData, final MetaDataPersistService persistService,
+    public static ShardingSphereDatabase create(final String databaseName, 
final boolean internalLoadMetaData, final MetaDataBasedPersistService 
persistService,
                                                 final DatabaseConfiguration 
databaseConfig, final ConfigurationProperties props, final InstanceContext 
instanceContext) throws SQLException {
         return internalLoadMetaData ? 
InternalMetaDataFactory.create(databaseName, persistService, databaseConfig, 
props, instanceContext)
                 : ExternalMetaDataFactory.create(databaseName, databaseConfig, 
props, instanceContext);
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/NewMetaDataFactory.java
similarity index 80%
copy from 
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java
copy to 
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/NewMetaDataFactory.java
index 79549ff1e70..e7e39830398 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/MetaDataFactory.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/NewMetaDataFactory.java
@@ -24,17 +24,18 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
-import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
+import org.apache.shardingsphere.metadata.factory.NewInternalMetaDataFactory;
+import org.apache.shardingsphere.metadata.persist.NewMetaDataPersistService;
 
 import java.sql.SQLException;
 import java.util.Map;
 
 /**
- * Meta data factory.
+ * TODO replace the old implementation after meta data refactor completed
+ * New meta data factory.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class MetaDataFactory {
+public final class NewMetaDataFactory {
     
     /**
      * Create database meta data for governance center.
@@ -48,9 +49,9 @@ public final class MetaDataFactory {
      * @return database meta data
      * @throws SQLException sql exception
      */
-    public static ShardingSphereDatabase create(final String databaseName, 
final boolean internalLoadMetaData, final MetaDataPersistService persistService,
+    public static ShardingSphereDatabase create(final String databaseName, 
final boolean internalLoadMetaData, final NewMetaDataPersistService 
persistService,
                                                 final DatabaseConfiguration 
databaseConfig, final ConfigurationProperties props, final InstanceContext 
instanceContext) throws SQLException {
-        return internalLoadMetaData ? 
InternalMetaDataFactory.create(databaseName, persistService, databaseConfig, 
props, instanceContext)
+        return internalLoadMetaData ? 
NewInternalMetaDataFactory.create(databaseName, persistService, databaseConfig, 
props, instanceContext)
                 : ExternalMetaDataFactory.create(databaseName, databaseConfig, 
props, instanceContext);
     }
     
@@ -65,10 +66,10 @@ public final class MetaDataFactory {
      * @return database meta data
      * @throws SQLException sql exception
      */
-    public static Map<String, ShardingSphereDatabase> create(final boolean 
internalLoadMetaData, final MetaDataPersistService persistService,
+    public static Map<String, ShardingSphereDatabase> create(final boolean 
internalLoadMetaData, final NewMetaDataPersistService persistService,
                                                              final Map<String, 
DatabaseConfiguration> databaseConfigMap, final ConfigurationProperties props,
                                                              final 
InstanceContext instanceContext) throws SQLException {
-        return internalLoadMetaData ? 
InternalMetaDataFactory.create(persistService, databaseConfigMap, props, 
instanceContext)
+        return internalLoadMetaData ? 
NewInternalMetaDataFactory.create(persistService, databaseConfigMap, props, 
instanceContext)
                 : ExternalMetaDataFactory.create(databaseConfigMap, props, 
instanceContext);
     }
 }
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
index 69c949b3e02..ec4c5cfc502 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
@@ -26,7 +26,7 @@ import 
org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
+import org.apache.shardingsphere.metadata.persist.MetaDataBasedPersistService;
 
 import java.util.Map;
 import java.util.Map.Entry;
@@ -48,7 +48,7 @@ public final class InternalMetaDataFactory {
      * @param instanceContext instance context
      * @return database meta data
      */
-    public static ShardingSphereDatabase create(final String databaseName, 
final MetaDataPersistService persistService, final DatabaseConfiguration 
databaseConfig,
+    public static ShardingSphereDatabase create(final String databaseName, 
final MetaDataBasedPersistService persistService, final DatabaseConfiguration 
databaseConfig,
                                                 final ConfigurationProperties 
props, final InstanceContext instanceContext) {
         return ShardingSphereDatabase.create(databaseName, 
DatabaseTypeEngine.getProtocolType(databaseName, databaseConfig, props), 
databaseConfig,
                 DatabaseRulesBuilder.build(databaseName, databaseConfig, 
instanceContext), 
persistService.getDatabaseMetaDataService().loadSchemas(databaseName));
@@ -63,12 +63,12 @@ public final class InternalMetaDataFactory {
      * @param instanceContext instance context
      * @return databases
      */
-    public static Map<String, ShardingSphereDatabase> create(final 
MetaDataPersistService persistService, final Map<String, DatabaseConfiguration> 
databaseConfigMap,
+    public static Map<String, ShardingSphereDatabase> create(final 
MetaDataBasedPersistService persistService, final Map<String, 
DatabaseConfiguration> databaseConfigMap,
                                                              final 
ConfigurationProperties props, final InstanceContext instanceContext) {
         return createDatabases(persistService, databaseConfigMap, 
DatabaseTypeEngine.getProtocolType(databaseConfigMap, props), props, 
instanceContext);
     }
     
-    private static Map<String, ShardingSphereDatabase> createDatabases(final 
MetaDataPersistService persistService, final Map<String, DatabaseConfiguration> 
databaseConfigMap,
+    private static Map<String, ShardingSphereDatabase> createDatabases(final 
MetaDataBasedPersistService persistService, final Map<String, 
DatabaseConfiguration> databaseConfigMap,
                                                                        final 
DatabaseType protocolType, final ConfigurationProperties props, final 
InstanceContext instanceContext) {
         Map<String, ShardingSphereDatabase> result = new 
ConcurrentHashMap<>(databaseConfigMap.size(), 1);
         for (Entry<String, DatabaseConfiguration> entry : 
databaseConfigMap.entrySet()) {
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/NewInternalMetaDataFactory.java
similarity index 87%
copy from 
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
copy to 
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/NewInternalMetaDataFactory.java
index 69c949b3e02..4c832a58ca9 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/InternalMetaDataFactory.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/factory/NewInternalMetaDataFactory.java
@@ -26,17 +26,18 @@ import 
org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
+import org.apache.shardingsphere.metadata.persist.NewMetaDataPersistService;
 
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * Internal meta data factory.
+ * TODO replace the old implementation after meta data refactor completed
+ * New internal meta data factory.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class InternalMetaDataFactory {
+public final class NewInternalMetaDataFactory {
     
     /**
      * Create database meta data for governance center.
@@ -48,7 +49,7 @@ public final class InternalMetaDataFactory {
      * @param instanceContext instance context
      * @return database meta data
      */
-    public static ShardingSphereDatabase create(final String databaseName, 
final MetaDataPersistService persistService, final DatabaseConfiguration 
databaseConfig,
+    public static ShardingSphereDatabase create(final String databaseName, 
final NewMetaDataPersistService persistService, final DatabaseConfiguration 
databaseConfig,
                                                 final ConfigurationProperties 
props, final InstanceContext instanceContext) {
         return ShardingSphereDatabase.create(databaseName, 
DatabaseTypeEngine.getProtocolType(databaseName, databaseConfig, props), 
databaseConfig,
                 DatabaseRulesBuilder.build(databaseName, databaseConfig, 
instanceContext), 
persistService.getDatabaseMetaDataService().loadSchemas(databaseName));
@@ -63,12 +64,12 @@ public final class InternalMetaDataFactory {
      * @param instanceContext instance context
      * @return databases
      */
-    public static Map<String, ShardingSphereDatabase> create(final 
MetaDataPersistService persistService, final Map<String, DatabaseConfiguration> 
databaseConfigMap,
+    public static Map<String, ShardingSphereDatabase> create(final 
NewMetaDataPersistService persistService, final Map<String, 
DatabaseConfiguration> databaseConfigMap,
                                                              final 
ConfigurationProperties props, final InstanceContext instanceContext) {
         return createDatabases(persistService, databaseConfigMap, 
DatabaseTypeEngine.getProtocolType(databaseConfigMap, props), props, 
instanceContext);
     }
     
-    private static Map<String, ShardingSphereDatabase> createDatabases(final 
MetaDataPersistService persistService, final Map<String, DatabaseConfiguration> 
databaseConfigMap,
+    private static Map<String, ShardingSphereDatabase> createDatabases(final 
NewMetaDataPersistService persistService, final Map<String, 
DatabaseConfiguration> databaseConfigMap,
                                                                        final 
DatabaseType protocolType, final ConfigurationProperties props, final 
InstanceContext instanceContext) {
         Map<String, ShardingSphereDatabase> result = new 
ConcurrentHashMap<>(databaseConfigMap.size(), 1);
         for (Entry<String, DatabaseConfiguration> entry : 
databaseConfigMap.entrySet()) {
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataBasedPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataBasedPersistService.java
new file mode 100644
index 00000000000..388b2a29f55
--- /dev/null
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataBasedPersistService.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.metadata.persist;
+
+import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import 
org.apache.shardingsphere.metadata.persist.data.ShardingSphereDataBasedPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.config.database.DatabaseBasedPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.config.database.DatabaseRuleBasedPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.config.global.GlobalPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataBasedPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionBasedPersistService;
+import org.apache.shardingsphere.mode.spi.PersistRepository;
+
+import javax.sql.DataSource;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * TODO replace the old implementation after meta data refactor completed
+ * Abstract meta data persist service.
+ */
+public interface MetaDataBasedPersistService {
+    
+    /**
+     * Get repository.
+     * 
+     * @return repository
+     */
+    PersistRepository getRepository();
+    
+    /**
+     * Get data source service.
+     * 
+     * @return persist service
+     */
+    DatabaseBasedPersistService<Map<String, DataSourceProperties>> 
getDataSourceService();
+    
+    /**
+     * Get database meta data service.
+     * 
+     * @return persist service
+     */
+    DatabaseMetaDataBasedPersistService getDatabaseMetaDataService();
+    
+    /**
+     * Get database rule persist service.
+     * 
+     * @return persist service
+     */
+    DatabaseRuleBasedPersistService<Collection<RuleConfiguration>> 
getDatabaseRulePersistService();
+    
+    /**
+     * Get global rule service.
+     * 
+     * @return repository
+     */
+    GlobalPersistService<Collection<RuleConfiguration>> getGlobalRuleService();
+    
+    /**
+     * Get props service.
+     * 
+     * @return persist service
+     */
+    GlobalPersistService<Properties> getPropsService();
+    
+    /**
+     * Get meta data version persist service.
+     * 
+     * @return persist service
+     */
+    MetaDataVersionBasedPersistService getMetaDataVersionPersistService();
+    
+    /**
+     * Get ShardingSphere data persist service.
+     * 
+     * @return persist service
+     */
+    ShardingSphereDataBasedPersistService 
getShardingSphereDataPersistService();
+    
+    /**
+     * Persist global rule configurations.
+     * 
+     * @param globalRuleConfigs global rule configurations
+     * @param props properties
+     */
+    void persistGlobalRuleConfiguration(Collection<RuleConfiguration> 
globalRuleConfigs, Properties props);
+    
+    /**
+     * Persist configurations.
+     * 
+     * @param databaseName database name
+     * @param databaseConfigs database configurations
+     * @param dataSources data sources
+     * @param rules rules
+     */
+    void persistConfigurations(String databaseName, DatabaseConfiguration 
databaseConfigs, Map<String, DataSource> dataSources, 
Collection<ShardingSphereRule> rules);
+    
+    /**
+     * Get effective data sources.
+     *
+     * @param databaseName database name
+     * @param databaseConfigs database configurations
+     * @return effective data sources
+     */
+    Map<String, DataSource> getEffectiveDataSources(String databaseName, 
Map<String, ? extends DatabaseConfiguration> databaseConfigs);
+}
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
index 3b941bc66d9..3e92ff893a7 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
@@ -26,8 +26,8 @@ import 
org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
 import 
org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.metadata.persist.data.ShardingSphereDataPersistService;
-import 
org.apache.shardingsphere.metadata.persist.service.DatabaseMetaDataPersistService;
-import 
org.apache.shardingsphere.metadata.persist.service.MetaDataVersionPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.config.database.DataSourcePersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.config.database.DatabaseRulePersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.config.global.GlobalRulePersistService;
@@ -45,7 +45,7 @@ import java.util.Properties;
  * Meta data persist service.
  */
 @Getter
-public final class MetaDataPersistService {
+public final class MetaDataPersistService implements 
MetaDataBasedPersistService {
     
     private final PersistRepository repository;
     
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
similarity index 93%
copy from 
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
copy to 
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
index 3b941bc66d9..7589b36f9e1 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
@@ -26,8 +26,8 @@ import 
org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
 import 
org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.metadata.persist.data.ShardingSphereDataPersistService;
-import 
org.apache.shardingsphere.metadata.persist.service.DatabaseMetaDataPersistService;
-import 
org.apache.shardingsphere.metadata.persist.service.MetaDataVersionPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.config.database.DataSourcePersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.config.database.DatabaseRulePersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.config.global.GlobalRulePersistService;
@@ -42,13 +42,15 @@ import java.util.Map.Entry;
 import java.util.Properties;
 
 /**
- * Meta data persist service.
+ * TODO replace the old implementation after meta data refactor completed
+ * New meta data persist service.
  */
 @Getter
-public final class MetaDataPersistService {
+public final class NewMetaDataPersistService implements 
MetaDataBasedPersistService {
     
     private final PersistRepository repository;
     
+    // TODO replace all service to new persist service
     private final DataSourcePersistService dataSourceService;
     
     private final DatabaseMetaDataPersistService databaseMetaDataService;
@@ -63,7 +65,7 @@ public final class MetaDataPersistService {
     
     private final ShardingSphereDataPersistService 
shardingSphereDataPersistService;
     
-    public MetaDataPersistService(final PersistRepository repository) {
+    public NewMetaDataPersistService(final PersistRepository repository) {
         this.repository = repository;
         dataSourceService = new DataSourcePersistService(repository);
         databaseMetaDataService = new 
DatabaseMetaDataPersistService(repository);
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/data/ShardingSphereDataBasedPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/data/ShardingSphereDataBasedPersistService.java
new file mode 100644
index 00000000000..3273a92d310
--- /dev/null
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/data/ShardingSphereDataBasedPersistService.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.metadata.persist.data;
+
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.data.ShardingSphereData;
+import org.apache.shardingsphere.infra.metadata.data.ShardingSphereSchemaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.metadata.persist.service.schema.TableRowDataBasedPersistService;
+
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * TODO replace the old implementation after meta data refactor completed
+ * ShardingSphere data based registry service.
+ */
+public interface ShardingSphereDataBasedPersistService {
+    
+    /**
+     * Get table row data persist service.
+     * 
+     * @return Stable row data persist service
+     */
+    TableRowDataBasedPersistService getTableRowDataPersistService();
+    
+    /**
+     * Load ShardingSphere data.
+     *
+     * @param metaData meta data
+     * @return ShardingSphere data
+     */
+    Optional<ShardingSphereData> load(ShardingSphereMetaData metaData);
+    
+    /**
+     * Persist table.
+     * @param databaseName database name
+     * @param schemaName schema name
+     * @param schemaData schema data
+     * @param databases databases
+     */
+    void persist(String databaseName, String schemaName, 
ShardingSphereSchemaData schemaData, Map<String, ShardingSphereDatabase> 
databases);
+}
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/data/ShardingSphereDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/data/ShardingSphereDataPersistService.java
index eb4d206d575..c6be3491dfb 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/data/ShardingSphereDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/data/ShardingSphereDataPersistService.java
@@ -40,7 +40,7 @@ import java.util.stream.Collectors;
  * ShardingSphere data persist service.
  */
 @Getter
-public final class ShardingSphereDataPersistService {
+public final class ShardingSphereDataPersistService implements 
ShardingSphereDataBasedPersistService {
     
     private final PersistRepository repository;
     
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
index 2f4de995d8c..3cdb0d968a4 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.metadata.persist.service.config.database;
 
+import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
 import javax.sql.DataSource;
@@ -73,4 +74,14 @@ public interface DatabaseBasedPersistService<T> {
      * @return configuration existed or not
      */
     boolean isExisted(String databaseName);
+    
+    /**
+     * TODO remove this after meta data refactor completed
+     * Append data source properties map.
+     *
+     * @param databaseName database name
+     * @param toBeAppendedDataSourcePropsMap data source properties map to be 
appended
+     */
+    default void append(final String databaseName, final Map<String, 
DataSourceProperties> toBeAppendedDataSourcePropsMap) {
+    }
 }
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalPersistService.java
index c5aeb87a973..45a5e1125cd 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalPersistService.java
@@ -17,6 +17,11 @@
 
 package org.apache.shardingsphere.metadata.persist.service.config.global;
 
+import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
+
+import java.util.Collection;
+import java.util.Collections;
+
 /**
  * Global persist service.
  * 
@@ -37,4 +42,14 @@ public interface GlobalPersistService<T> {
      * @return configurations
      */
     T load();
+    
+    /**
+     * TODO remove this after meta data refactor completed 
+     * Load all users.
+     *
+     * @return collection of user
+     */
+    default Collection<ShardingSphereUser> loadUsers() {
+        return Collections.emptyList();
+    }
 }
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataBasedPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataBasedPersistService.java
new file mode 100644
index 00000000000..0e749bd2dcb
--- /dev/null
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataBasedPersistService.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.metadata.persist.service.database;
+
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
+import 
org.apache.shardingsphere.metadata.persist.service.schema.SchemaMetaDataPersistService;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * TODO replace the old implementation after meta data refactor completed
+ * Database meta data based registry service.
+ */
+public interface DatabaseMetaDataBasedPersistService {
+    
+    /**
+     * Add database name.
+     *
+     * @param databaseName database name
+     */
+    void addDatabase(String databaseName);
+    
+    /**
+     * Drop database.
+     *
+     * @param databaseName database name to be deleted
+     */
+    void dropDatabase(String databaseName);
+    
+    /**
+     * Load all database names.
+     *
+     * @return all database names
+     */
+    Collection<String> loadAllDatabaseNames();
+    
+    /**
+     * Add schema.
+     *
+     * @param databaseName database name
+     * @param schemaName schema name
+     */
+    void addSchema(String databaseName, String schemaName);
+    
+    /**
+     * Drop schema.
+     *
+     * @param databaseName database name
+     * @param schemaName schema name
+     */
+    void dropSchema(String databaseName, String schemaName);
+    
+    /**
+     * Compare and persist schema meta data.
+     *
+     * @param databaseName database name
+     * @param schemaName schema name
+     * @param schema schema meta data
+     */
+    void compareAndPersist(String databaseName, String schemaName, 
ShardingSphereSchema schema);
+    
+    /**
+     * Persist schema meta data.
+     *
+     * @param databaseName database name
+     * @param schemaName schema name
+     * @param schema schema meta data
+     */
+    void persist(String databaseName, String schemaName, ShardingSphereSchema 
schema);
+    
+    /**
+     * Delete schema meta data.
+     *
+     * @param databaseName database name
+     * @param schemaName schema name
+     * @param schema schema meta data
+     */
+    void delete(String databaseName, String schemaName, ShardingSphereSchema 
schema);
+    
+    /**
+     * Load schema meta data.
+     *
+     * @param databaseName database name
+     * @return schema meta data
+     */
+    Map<String, ShardingSphereSchema> loadSchemas(String databaseName);
+    
+    /**
+     * Get table meta data persist service.
+     *
+     * @return persist service
+     */
+    SchemaMetaDataPersistService<Map<String, ShardingSphereTable>> 
getTableMetaDataPersistService();
+    
+    /**
+     * Get view meta data persist service.
+     *
+     * @return persist service
+     */
+    SchemaMetaDataPersistService<Map<String, ShardingSphereView>> 
getViewMetaDataPersistService();
+}
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/DatabaseMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
similarity index 97%
rename from 
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/DatabaseMetaDataPersistService.java
rename to 
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
index ce1eed0899f..98ccff85929 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/DatabaseMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.metadata.persist.service;
+package org.apache.shardingsphere.metadata.persist.service.database;
 
 import lombok.Getter;
 import org.apache.shardingsphere.infra.metadata.database.schema.SchemaManager;
@@ -34,7 +34,7 @@ import java.util.Map;
  * Database meta data registry service.
  */
 @Getter
-public final class DatabaseMetaDataPersistService {
+public final class DatabaseMetaDataPersistService implements 
DatabaseMetaDataBasedPersistService {
     
     private final PersistRepository repository;
     
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ShardingSphereTableRowDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ShardingSphereTableRowDataPersistService.java
index 851795ac414..3b246bb6049 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ShardingSphereTableRowDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ShardingSphereTableRowDataPersistService.java
@@ -34,7 +34,7 @@ import java.util.Collection;
  * ShardingSphere table row data persist service.
  */
 @RequiredArgsConstructor
-public final class ShardingSphereTableRowDataPersistService {
+public final class ShardingSphereTableRowDataPersistService implements 
TableRowDataBasedPersistService {
     
     private final PersistRepository repository;
     
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableRowDataBasedPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableRowDataBasedPersistService.java
new file mode 100644
index 00000000000..0480f2c5ab9
--- /dev/null
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableRowDataBasedPersistService.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.metadata.persist.service.schema;
+
+import org.apache.shardingsphere.infra.metadata.data.ShardingSphereTableData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import 
org.apache.shardingsphere.infra.yaml.data.pojo.YamlShardingSphereRowData;
+
+import java.util.Collection;
+
+/**
+ * TODO replace the old implementation after meta data refactor completed
+ * Schema meta data persist service.
+ */
+public interface TableRowDataBasedPersistService {
+    
+    /**
+     * Persist table row data.
+     * 
+     * @param databaseName database name
+     * @param schemaName schema name
+     * @param tableName table name
+     * @param rows rows
+     */
+    void persist(String databaseName, String schemaName, String tableName, 
Collection<YamlShardingSphereRowData> rows);
+    
+    /**
+     * Delete table row data.
+     * 
+     * @param databaseName database name
+     * @param schemaName schema name
+     * @param tableName table name
+     * @param rows rows
+     */
+    void delete(String databaseName, String schemaName, String tableName, 
Collection<YamlShardingSphereRowData> rows);
+    
+    /**
+     * Load table data.
+     * 
+     * @param databaseName database name
+     * @param schemaName schema name
+     * @param tableName table name
+     * @param table table
+     * @return ShardingSphere table data
+     */
+    ShardingSphereTableData load(String databaseName, String schemaName, 
String tableName, ShardingSphereTable table);
+}
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionBasedPersistService.java
similarity index 52%
copy from 
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
copy to 
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionBasedPersistService.java
index 2f4de995d8c..14acfd17315 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionBasedPersistService.java
@@ -15,62 +15,54 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.metadata.persist.service.config.database;
+package org.apache.shardingsphere.metadata.persist.service.version;
 
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-
-import javax.sql.DataSource;
-import java.util.Map;
-import java.util.Collection;
+import java.util.Optional;
 
 /**
- * Database based persist service.
- * 
- * @param <T> type of configuration
+ * TODO replace the old implementation after meta data refactor completed
+ * Meta data version based registry service.
  */
-public interface DatabaseBasedPersistService<T> {
+public interface MetaDataVersionBasedPersistService {
     
     /**
-     * Persist configurations.
+     * Get active version.
      *
      * @param databaseName database name
-     * @param configs configurations
+     * @return active database version
      */
-    void persist(String databaseName, T configs);
+    Optional<String> getActiveVersion(String databaseName);
     
     /**
-     * Persist version configurations.
-     * 
+     * Judge whether active version.
+     *
      * @param databaseName database name
      * @param version version
-     * @param dataSources data sources
-     * @param rules rules
-     * @param configs configurations
+     * @return is active version or not
      */
-    void persist(String databaseName, String version, Map<String, DataSource> 
dataSources, Collection<ShardingSphereRule> rules, T configs);
+    boolean isActiveVersion(String databaseName, String version);
     
     /**
-     * Load configurations.
+     * Create new schema version.
      *
      * @param databaseName database name
-     * @return configurations
+     * @return new version
      */
-    T load(String databaseName);
+    Optional<String> createNewVersion(String databaseName);
     
     /**
-     * Load configurations based version.
-     * 
+     * Persist active database version.
+     *
      * @param databaseName database name
      * @param version version
-     * @return configurations
      */
-    T load(String databaseName, String version);
+    void persistActiveVersion(String databaseName, String version);
     
     /**
-     * Judge whether schema configuration existed.
+     * Delete database version.
      *
      * @param databaseName database name
-     * @return configuration existed or not
+     * @param version version
      */
-    boolean isExisted(String databaseName);
+    void deleteVersion(String databaseName, String version);
 }
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/MetaDataVersionPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistService.java
similarity index 95%
rename from 
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/MetaDataVersionPersistService.java
rename to 
kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistService.java
index 367afb3ac06..f826741ed52 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/MetaDataVersionPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/version/MetaDataVersionPersistService.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.metadata.persist.service;
+package org.apache.shardingsphere.metadata.persist.service.version;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
@@ -28,7 +28,7 @@ import java.util.concurrent.atomic.AtomicLong;
  * Meta data version persist service.
  */
 @RequiredArgsConstructor
-public final class MetaDataVersionPersistService {
+public final class MetaDataVersionPersistService implements 
MetaDataVersionBasedPersistService {
     
     private final PersistRepository repository;
     
diff --git 
a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/DatabaseMetaDataPersistServiceTest.java
 
b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/DatabaseMetaDataPersistServiceTest.java
index 5b99aa7d2f1..25f10c59f42 100644
--- 
a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/DatabaseMetaDataPersistServiceTest.java
+++ 
b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/DatabaseMetaDataPersistServiceTest.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import 
org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereTable;
 import org.apache.shardingsphere.infra.yaml.schema.swapper.YamlTableSwapper;
+import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataPersistService;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
diff --git 
a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/MetaDataVersionPersistServiceTest.java
 
b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/MetaDataVersionPersistServiceTest.java
index bf6a933b41d..ed70adf36cd 100644
--- 
a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/MetaDataVersionPersistServiceTest.java
+++ 
b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/service/MetaDataVersionPersistServiceTest.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.metadata.persist.service;
 
 import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
+import 
org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index e6d761fe031..501a86ecc5b 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -52,7 +52,7 @@ import 
org.apache.shardingsphere.infra.state.cluster.ClusterStateContext;
 import 
org.apache.shardingsphere.infra.yaml.data.pojo.YamlShardingSphereRowData;
 import 
org.apache.shardingsphere.infra.yaml.data.swapper.YamlShardingSphereRowDataSwapper;
 import org.apache.shardingsphere.metadata.MetaDataFactory;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
+import org.apache.shardingsphere.metadata.persist.MetaDataBasedPersistService;
 import org.apache.shardingsphere.mode.manager.switcher.ResourceSwitchManager;
 import org.apache.shardingsphere.mode.manager.switcher.SwitchingResource;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -354,7 +354,7 @@ public final class ContextManager implements AutoCloseable {
     }
     
     private MetaDataContexts createMetaDataContexts(final String databaseName, 
final SwitchingResource switchingResource) throws SQLException {
-        MetaDataPersistService metaDataPersistService = 
metaDataContexts.getPersistService();
+        MetaDataBasedPersistService metaDataPersistService = 
metaDataContexts.getPersistService();
         Map<String, ShardingSphereDatabase> changedDatabases = 
createChangedDatabases(databaseName, false,
                 switchingResource, 
metaDataPersistService.getDatabaseRulePersistService().load(databaseName));
         ConfigurationProperties props = new 
ConfigurationProperties(metaDataPersistService.getPropsService().load());
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContexts.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContexts.java
index cf8253f298e..d8459547df7 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContexts.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContexts.java
@@ -27,7 +27,7 @@ import 
org.apache.shardingsphere.infra.metadata.data.ShardingSphereTableData;
 import 
org.apache.shardingsphere.infra.metadata.data.builder.ShardingSphereDataBuilder;
 import org.apache.shardingsphere.infra.rule.identifier.type.ResourceHeldRule;
 import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
+import org.apache.shardingsphere.metadata.persist.MetaDataBasedPersistService;
 
 import java.util.Map.Entry;
 import java.util.Optional;
@@ -38,13 +38,13 @@ import java.util.Optional;
 @Getter
 public final class MetaDataContexts implements AutoCloseable {
     
-    private final MetaDataPersistService persistService;
+    private final MetaDataBasedPersistService persistService;
     
     private final ShardingSphereMetaData metaData;
     
     private final ShardingSphereData shardingSphereData;
     
-    public MetaDataContexts(final MetaDataPersistService persistService, final 
ShardingSphereMetaData metaData) {
+    public MetaDataContexts(final MetaDataBasedPersistService persistService, 
final ShardingSphereMetaData metaData) {
         this.persistService = persistService;
         this.metaData = metaData;
         this.shardingSphereData = initShardingSphereData(metaData);
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/NewMetaDataContextsFactory.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/NewMetaDataContextsFactory.java
new file mode 100644
index 00000000000..ec96cc4f43b
--- /dev/null
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/NewMetaDataContextsFactory.java
@@ -0,0 +1,185 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.mode.metadata;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Splitter;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
+import 
org.apache.shardingsphere.infra.config.database.impl.DataSourceProvidedDatabaseConfiguration;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.datasource.state.DataSourceState;
+import org.apache.shardingsphere.infra.datasource.state.DataSourceStateManager;
+import org.apache.shardingsphere.infra.instance.InstanceContext;
+import 
org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaData;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
+import org.apache.shardingsphere.metadata.NewMetaDataFactory;
+import org.apache.shardingsphere.metadata.persist.NewMetaDataPersistService;
+import org.apache.shardingsphere.mode.event.storage.StorageNodeDataSource;
+import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+import java.util.stream.Collectors;
+
+/**
+ * TODO replace the old implementation after meta data refactor completed
+ * New meta data contexts factory.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class NewMetaDataContextsFactory {
+    
+    /**
+     * Create meta data contexts.
+     *
+     * @param persistService persist service
+     * @param param context manager builder parameter
+     * @param instanceContext instance context
+     * @return meta data contexts
+     * @throws SQLException SQL exception
+     */
+    public static MetaDataContexts create(final NewMetaDataPersistService 
persistService, final ContextManagerBuilderParameter param, final 
InstanceContext instanceContext) throws SQLException {
+        return create(persistService, param, instanceContext, 
Collections.emptyMap());
+    }
+    
+    /**
+     * Create meta data contexts.
+     * 
+     * @param persistService persist service
+     * @param param context manager builder parameter
+     * @param instanceContext instance context
+     * @param storageNodes storage nodes
+     * @return meta data contexts
+     * @throws SQLException SQL exception
+     */
+    public static MetaDataContexts create(final NewMetaDataPersistService 
persistService, final ContextManagerBuilderParameter param,
+                                          final InstanceContext 
instanceContext, final Map<String, StorageNodeDataSource> storageNodes) throws 
SQLException {
+        boolean databaseMetaDataExisted = 
databaseMetaDataExisted(persistService);
+        Map<String, DatabaseConfiguration> effectiveDatabaseConfigs = 
getDatabaseConfigurations(databaseMetaDataExisted,
+                getDatabaseNames(instanceContext, param.getDatabaseConfigs(), 
persistService), param.getDatabaseConfigs(), persistService);
+        checkDataSourceStates(effectiveDatabaseConfigs, storageNodes, 
param.isForce());
+        Collection<RuleConfiguration> globalRuleConfigs = 
getGlobalRuleConfigs(databaseMetaDataExisted, persistService, 
param.getGlobalRuleConfigs());
+        ConfigurationProperties props = 
getConfigurationProperties(databaseMetaDataExisted, persistService, 
param.getProps());
+        Map<String, ShardingSphereDatabase> databases = 
getDatabases(databaseMetaDataExisted, persistService, effectiveDatabaseConfigs, 
props, instanceContext);
+        ShardingSphereRuleMetaData globalMetaData = new 
ShardingSphereRuleMetaData(GlobalRulesBuilder.buildRules(globalRuleConfigs, 
databases, props));
+        MetaDataContexts result = new MetaDataContexts(persistService, new 
ShardingSphereMetaData(databases, globalMetaData, props));
+        persistDatabaseConfigurations(databaseMetaDataExisted, param, result);
+        persistMetaData(databaseMetaDataExisted, result);
+        return result;
+    }
+    
+    private static boolean databaseMetaDataExisted(final 
NewMetaDataPersistService persistService) {
+        return 
!persistService.getDatabaseMetaDataService().loadAllDatabaseNames().isEmpty();
+    }
+    
+    private static Collection<String> getDatabaseNames(final InstanceContext 
instanceContext,
+                                                       final Map<String, 
DatabaseConfiguration> databaseConfigs, final NewMetaDataPersistService 
persistService) {
+        return instanceContext.getInstance().getMetaData() instanceof 
JDBCInstanceMetaData ? databaseConfigs.keySet() : 
persistService.getDatabaseMetaDataService().loadAllDatabaseNames();
+    }
+    
+    private static ConfigurationProperties getConfigurationProperties(final 
boolean databaseMetaDataExisted, final NewMetaDataPersistService 
persistService, final Properties props) {
+        return databaseMetaDataExisted ? new 
ConfigurationProperties(persistService.getPropsService().load()) : new 
ConfigurationProperties(props);
+    }
+    
+    private static Map<String, DatabaseConfiguration> 
getDatabaseConfigurations(final boolean databaseMetaDataExisted, final 
Collection<String> databaseNames,
+                                                                               
 final Map<String, DatabaseConfiguration> databaseConfigs, final 
NewMetaDataPersistService persistService) {
+        return databaseMetaDataExisted ? 
createEffectiveDatabaseConfigurations(databaseNames, databaseConfigs, 
persistService) : databaseConfigs;
+    }
+    
+    private static Map<String, DatabaseConfiguration> 
createEffectiveDatabaseConfigurations(final Collection<String> databaseNames,
+                                                                               
             final Map<String, DatabaseConfiguration> databaseConfigs, final 
NewMetaDataPersistService persistService) {
+        return databaseNames.stream().collect(
+                Collectors.toMap(each -> each, each -> 
createEffectiveDatabaseConfiguration(each, databaseConfigs, persistService), 
(a, b) -> b, () -> new HashMap<>(databaseNames.size(), 1)));
+    }
+    
+    private static DatabaseConfiguration 
createEffectiveDatabaseConfiguration(final String databaseName,
+                                                                              
final Map<String, DatabaseConfiguration> databaseConfigs, final 
NewMetaDataPersistService persistService) {
+        Map<String, DataSource> effectiveDataSources = 
persistService.getEffectiveDataSources(databaseName, databaseConfigs);
+        Collection<RuleConfiguration> databaseRuleConfigs = 
persistService.getDatabaseRulePersistService().load(databaseName);
+        return new 
DataSourceProvidedDatabaseConfiguration(effectiveDataSources, 
databaseRuleConfigs);
+    }
+    
+    private static void checkDataSourceStates(final Map<String, 
DatabaseConfiguration> databaseConfigs, final Map<String, 
StorageNodeDataSource> storageNodes, final boolean force) {
+        Map<String, DataSourceState> storageDataSourceStates = 
getStorageDataSourceStates(storageNodes);
+        databaseConfigs.forEach((key, value) -> {
+            if (!value.getDataSources().isEmpty()) {
+                DataSourceStateManager.getInstance().initStates(key, 
value.getDataSources(), storageDataSourceStates, force);
+            }
+        });
+    }
+    
+    private static Map<String, DataSourceState> 
getStorageDataSourceStates(final Map<String, StorageNodeDataSource> 
storageDataSourceStates) {
+        Map<String, DataSourceState> result = new 
HashMap<>(storageDataSourceStates.size(), 1);
+        storageDataSourceStates.forEach((key, value) -> {
+            List<String> values = Splitter.on(".").splitToList(key);
+            Preconditions.checkArgument(3 == values.size(), "Illegal data 
source of storage node.");
+            String databaseName = values.get(0);
+            String dataSourceName = values.get(2);
+            result.put(databaseName + "." + dataSourceName, 
DataSourceState.valueOf(value.getStatus().name()));
+        });
+        return result;
+    }
+    
+    private static Collection<RuleConfiguration> getGlobalRuleConfigs(final 
boolean databaseMetaDataExisted, final NewMetaDataPersistService persistService,
+                                                                      final 
Collection<RuleConfiguration> globalRuleConfigs) {
+        return databaseMetaDataExisted ? 
persistService.getGlobalRuleService().load() : globalRuleConfigs;
+    }
+    
+    private static Map<String, ShardingSphereDatabase> getDatabases(final 
boolean databaseMetaDataExisted, final NewMetaDataPersistService persistService,
+                                                                    final 
Map<String, DatabaseConfiguration> databaseConfigMap, final 
ConfigurationProperties props,
+                                                                    final 
InstanceContext instanceContext) throws SQLException {
+        return NewMetaDataFactory.create(databaseMetaDataExisted, 
persistService, databaseConfigMap, props, instanceContext);
+    }
+    
+    private static void persistDatabaseConfigurations(final boolean 
databaseMetaDataExisted, final ContextManagerBuilderParameter param, final 
MetaDataContexts metadataContexts) {
+        if (!databaseMetaDataExisted) {
+            persistDatabaseConfigurations(metadataContexts, param);
+        }
+    }
+    
+    private static void persistDatabaseConfigurations(final MetaDataContexts 
metadataContexts, final ContextManagerBuilderParameter param) {
+        
metadataContexts.getPersistService().persistGlobalRuleConfiguration(param.getGlobalRuleConfigs(),
 param.getProps());
+        for (Entry<String, ? extends DatabaseConfiguration> entry : 
param.getDatabaseConfigs().entrySet()) {
+            String databaseName = entry.getKey();
+            
metadataContexts.getPersistService().persistConfigurations(entry.getKey(), 
entry.getValue(),
+                    
metadataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(),
+                    
metadataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules());
+        }
+    }
+    
+    private static void persistMetaData(final boolean databaseMetaDataExisted, 
final MetaDataContexts metaDataContexts) {
+        if (!databaseMetaDataExisted) {
+            
metaDataContexts.getMetaData().getDatabases().values().forEach(each -> 
each.getSchemas()
+                    .forEach((schemaName, schema) -> 
metaDataContexts.getPersistService().getDatabaseMetaDataService().persist(each.getName(),
 schemaName, schema)));
+            
metaDataContexts.getShardingSphereData().getDatabaseData().forEach((databaseName,
 databaseData) -> databaseData.getSchemaData().forEach((schemaName, schemaData) 
-> metaDataContexts
+                    
.getPersistService().getShardingSphereDataPersistService().persist(databaseName,
 schemaName, schemaData, metaDataContexts.getMetaData().getDatabases())));
+        }
+    }
+}
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index a1619edb9ba..8c48225392b 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -37,7 +37,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import org.apache.shardingsphere.infra.state.cluster.ClusterState;
 import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
-import 
org.apache.shardingsphere.metadata.persist.service.DatabaseMetaDataPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataPersistService;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
 import org.apache.shardingsphere.test.util.PropertiesBuilder;
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java
index 29f4a5a3843..013bff31b84 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactoryTest.java
@@ -24,7 +24,7 @@ import 
org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaDa
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
 import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
-import 
org.apache.shardingsphere.metadata.persist.service.DatabaseMetaDataPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataPersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.config.database.DatabaseRulePersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.config.global.GlobalRulePersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.config.global.PropertiesPersistService;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
index 81212bd8ece..44dc6bb02b4 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
@@ -25,7 +25,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO;
-import 
org.apache.shardingsphere.metadata.persist.service.DatabaseMetaDataPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataBasedPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.manager.ContextManagerAware;
 
@@ -61,7 +61,7 @@ public final class ClusterModeContextManager implements 
ModeContextManager, Cont
         String databaseName = alterSchemaPOJO.getDatabaseName();
         String schemaName = alterSchemaPOJO.getSchemaName();
         ShardingSphereSchema schema = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getSchema(schemaName);
-        DatabaseMetaDataPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
+        DatabaseMetaDataBasedPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
         databaseMetaDataService.persist(databaseName, 
alterSchemaPOJO.getRenameSchemaName(), schema);
         
databaseMetaDataService.getViewMetaDataPersistService().persist(databaseName, 
alterSchemaPOJO.getRenameSchemaName(), schema.getViews());
         databaseMetaDataService.dropSchema(databaseName, schemaName);
@@ -69,7 +69,7 @@ public final class ClusterModeContextManager implements 
ModeContextManager, Cont
     
     @Override
     public void dropSchema(final String databaseName, final Collection<String> 
schemaNames) {
-        DatabaseMetaDataPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
+        DatabaseMetaDataBasedPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
         schemaNames.forEach(each -> 
databaseMetaDataService.dropSchema(databaseName, each));
     }
     
@@ -79,7 +79,7 @@ public final class ClusterModeContextManager implements 
ModeContextManager, Cont
         String schemaName = alterSchemaMetaDataPOJO.getSchemaName();
         Map<String, ShardingSphereTable> tables = 
alterSchemaMetaDataPOJO.getAlteredTables().stream().collect(Collectors.toMap(ShardingSphereTable::getName,
 table -> table));
         Map<String, ShardingSphereView> views = 
alterSchemaMetaDataPOJO.getAlteredViews().stream().collect(Collectors.toMap(ShardingSphereView::getName,
 view -> view));
-        DatabaseMetaDataPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
+        DatabaseMetaDataBasedPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
         
databaseMetaDataService.getTableMetaDataPersistService().persist(databaseName, 
schemaName, tables);
         
databaseMetaDataService.getViewMetaDataPersistService().persist(databaseName, 
schemaName, views);
         alterSchemaMetaDataPOJO.getDroppedTables().forEach(each -> 
databaseMetaDataService.getTableMetaDataPersistService().delete(databaseName, 
schemaName, each));
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/NewClusterContextManagerBuilder.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/NewClusterContextManagerBuilder.java
new file mode 100644
index 00000000000..b2277348b69
--- /dev/null
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/NewClusterContextManagerBuilder.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.mode.manager.cluster;
+
+import com.google.common.base.Preconditions;
+import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
+import org.apache.shardingsphere.infra.instance.InstanceContext;
+import org.apache.shardingsphere.infra.instance.InstanceContextAware;
+import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.metadata.persist.NewMetaDataPersistService;
+import org.apache.shardingsphere.mode.lock.GlobalLockContext;
+import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.manager.ContextManagerAware;
+import org.apache.shardingsphere.mode.manager.ContextManagerBuilder;
+import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.RegistryCenter;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.workerid.generator.ClusterWorkerIdGenerator;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber.NewContextManagerSubscriberFacade;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import org.apache.shardingsphere.mode.metadata.NewMetaDataContextsFactory;
+import 
org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
+import 
org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepositoryConfiguration;
+
+import java.sql.SQLException;
+
+/**
+ * TODO replace the old implementation after meta data refactor completed
+ * New cluster context manager builder.
+ */
+public final class NewClusterContextManagerBuilder implements 
ContextManagerBuilder {
+    
+    @Override
+    public ContextManager build(final ContextManagerBuilderParameter param) 
throws SQLException {
+        ClusterPersistRepository repository = 
getClusterPersistRepository((ClusterPersistRepositoryConfiguration) 
param.getModeConfiguration().getRepository());
+        RegistryCenter registryCenter = new RegistryCenter(repository, new 
EventBusContext(), param.getInstanceMetaData(), param.getDatabaseConfigs());
+        InstanceContext instanceContext = buildInstanceContext(registryCenter, 
param);
+        if (registryCenter.getRepository() instanceof InstanceContextAware) {
+            ((InstanceContextAware) 
registryCenter.getRepository()).setInstanceContext(instanceContext);
+        }
+        NewMetaDataPersistService persistService = new 
NewMetaDataPersistService(repository);
+        MetaDataContexts metaDataContexts = 
NewMetaDataContextsFactory.create(persistService, param, instanceContext, 
registryCenter.getStorageNodeStatusService().loadStorageNodes());
+        ContextManager result = new ContextManager(metaDataContexts, 
instanceContext);
+        setContextManagerAware(result);
+        registerOnline(persistService, registryCenter, param, result);
+        return result;
+    }
+    
+    private ClusterPersistRepository getClusterPersistRepository(final 
ClusterPersistRepositoryConfiguration config) {
+        Preconditions.checkNotNull(config, "Cluster persist repository 
configuration cannot be null.");
+        ClusterPersistRepository result = 
TypedSPILoader.getService(ClusterPersistRepository.class, config.getType(), 
config.getProps());
+        result.init(config);
+        return result;
+    }
+    
+    private InstanceContext buildInstanceContext(final RegistryCenter 
registryCenter, final ContextManagerBuilderParameter param) {
+        return new InstanceContext(new 
ComputeNodeInstance(param.getInstanceMetaData()), new 
ClusterWorkerIdGenerator(registryCenter, param.getInstanceMetaData()),
+                param.getModeConfiguration(), new ClusterModeContextManager(), 
new GlobalLockContext(registryCenter.getGlobalLockPersistService()), 
registryCenter.getEventBusContext());
+    }
+    
+    private void setContextManagerAware(final ContextManager contextManager) {
+        ((ContextManagerAware) 
contextManager.getInstanceContext().getModeContextManager()).setContextManagerAware(contextManager);
+    }
+    
+    private void registerOnline(final NewMetaDataPersistService 
persistService, final RegistryCenter registryCenter, final 
ContextManagerBuilderParameter param, final ContextManager contextManager) {
+        loadClusterStatus(registryCenter, contextManager);
+        
contextManager.getInstanceContext().getInstance().setLabels(param.getLabels());
+        
contextManager.getInstanceContext().getAllClusterInstances().addAll(registryCenter.getComputeNodeStatusService().loadAllComputeNodeInstances());
+        new NewContextManagerSubscriberFacade(persistService, registryCenter, 
contextManager);
+        
registryCenter.onlineInstance(contextManager.getInstanceContext().getInstance());
+    }
+    
+    private void loadClusterStatus(final RegistryCenter registryCenter, final 
ContextManager contextManager) {
+        registryCenter.persistClusterState(contextManager);
+        
contextManager.updateClusterState(registryCenter.getClusterStatusService().loadClusterStatus());
+    }
+    
+    @Override
+    public String getType() {
+        return "New_Cluster";
+    }
+}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewConfigurationChangedSubscriber.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewConfigurationChangedSubscriber.java
new file mode 100644
index 00000000000..5aa0a938fa6
--- /dev/null
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewConfigurationChangedSubscriber.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber;
+
+import com.google.common.eventbus.Subscribe;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
+import org.apache.shardingsphere.infra.datasource.state.DataSourceState;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDatabase;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.StaticDataSourceContainedRule;
+import org.apache.shardingsphere.metadata.persist.NewMetaDataPersistService;
+import org.apache.shardingsphere.mode.event.storage.StorageNodeDataSource;
+import 
org.apache.shardingsphere.mode.event.storage.StorageNodeDataSourceChangedEvent;
+import org.apache.shardingsphere.mode.manager.ContextManager;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.RegistryCenter;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.datasource.DataSourceChangedEvent;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.props.PropertiesChangedEvent;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.rule.GlobalRuleConfigurationsChangedEvent;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.rule.RuleConfigurationsChangedEvent;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.version.DatabaseVersionChangedEvent;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+/**
+ * TODO replace the old implementation after meta data refactor completed
+ * New configuration changed subscriber.
+ */
+@SuppressWarnings("UnstableApiUsage")
+public final class NewConfigurationChangedSubscriber {
+    
+    private final NewMetaDataPersistService persistService;
+    
+    private final RegistryCenter registryCenter;
+    
+    private final ContextManager contextManager;
+    
+    public NewConfigurationChangedSubscriber(final NewMetaDataPersistService 
persistService, final RegistryCenter registryCenter, final ContextManager 
contextManager) {
+        this.persistService = persistService;
+        this.registryCenter = registryCenter;
+        this.contextManager = contextManager;
+        
contextManager.getInstanceContext().getEventBusContext().register(this);
+        disableDataSources();
+    }
+    
+    /**
+     * Renew data source configuration.
+     *
+     * @param event data source changed event.
+     */
+    @Subscribe
+    public synchronized void renew(final DataSourceChangedEvent event) {
+        if 
(persistService.getMetaDataVersionPersistService().isActiveVersion(event.getDatabaseName(),
 event.getDatabaseVersion())) {
+            
contextManager.alterDataSourceConfiguration(event.getDatabaseName(), 
event.getDataSourcePropertiesMap());
+            disableDataSources();
+        }
+    }
+    
+    /**
+     * Renew rule configurations.
+     *
+     * @param event rule configurations changed event
+     */
+    @Subscribe
+    public synchronized void renew(final RuleConfigurationsChangedEvent event) 
{
+        if 
(persistService.getMetaDataVersionPersistService().isActiveVersion(event.getDatabaseName(),
 event.getDatabaseVersion())) {
+            contextManager.alterRuleConfiguration(event.getDatabaseName(), 
event.getRuleConfigs());
+            disableDataSources();
+        }
+    }
+    
+    /**
+     * Renew global rule configurations.
+     *
+     * @param event global rule configurations changed event
+     */
+    @Subscribe
+    public synchronized void renew(final GlobalRuleConfigurationsChangedEvent 
event) {
+        contextManager.alterGlobalRuleConfiguration(event.getRuleConfigs());
+        disableDataSources();
+    }
+    
+    /**
+     * Renew with new database version.
+     *
+     * @param event database version changed event
+     */
+    @Subscribe
+    public synchronized void renew(final DatabaseVersionChangedEvent event) {
+        Map<String, DataSourceProperties> dataSourcePropertiesMap = 
persistService.getDataSourceService().load(event.getDatabaseName(), 
event.getActiveVersion());
+        Collection<RuleConfiguration> ruleConfigs = 
persistService.getDatabaseRulePersistService().load(event.getDatabaseName(), 
event.getActiveVersion());
+        
contextManager.alterDataSourceAndRuleConfiguration(event.getDatabaseName(), 
dataSourcePropertiesMap, ruleConfigs);
+        disableDataSources();
+    }
+    
+    /**
+     * Renew properties.
+     *
+     * @param event properties changed event
+     */
+    @Subscribe
+    public synchronized void renew(final PropertiesChangedEvent event) {
+        contextManager.alterProperties(event.getProps());
+    }
+    
+    private void disableDataSources() {
+        Map<String, StorageNodeDataSource> storageNodes = 
getDisabledDataSources();
+        for (Entry<String, ShardingSphereDatabase> entry : 
contextManager.getMetaDataContexts().getMetaData().getDatabases().entrySet()) {
+            
entry.getValue().getRuleMetaData().findRules(StaticDataSourceContainedRule.class).forEach(each
 -> disableDataSources(entry.getKey(), each, storageNodes));
+        }
+    }
+    
+    private void disableDataSources(final String databaseName, final 
StaticDataSourceContainedRule rule, final Map<String, StorageNodeDataSource> 
storageNodes) {
+        for (Entry<String, StorageNodeDataSource> entry : 
storageNodes.entrySet()) {
+            QualifiedDatabase database = new QualifiedDatabase(entry.getKey());
+            if (!database.getDatabaseName().equals(databaseName)) {
+                continue;
+            }
+            disableDataSources(entry.getValue(), rule, database);
+        }
+    }
+    
+    private void disableDataSources(final StorageNodeDataSource 
storageNodeDataSource, final StaticDataSourceContainedRule rule, final 
QualifiedDatabase database) {
+        for (Entry<String, Collection<String>> entry : 
rule.getDataSourceMapper().entrySet()) {
+            if (!database.getGroupName().equals(entry.getKey())) {
+                continue;
+            }
+            entry.getValue().forEach(each -> rule.updateStatus(new 
StorageNodeDataSourceChangedEvent(database, storageNodeDataSource)));
+        }
+    }
+    
+    private Map<String, StorageNodeDataSource> getDisabledDataSources() {
+        return 
registryCenter.getStorageNodeStatusService().loadStorageNodes().entrySet()
+                .stream().filter(entry -> DataSourceState.DISABLED == 
entry.getValue().getStatus()).collect(Collectors.toMap(Entry::getKey, 
Entry::getValue));
+    }
+}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewContextManagerSubscriberFacade.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewContextManagerSubscriberFacade.java
new file mode 100644
index 00000000000..37264389dbf
--- /dev/null
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewContextManagerSubscriberFacade.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber;
+
+import org.apache.shardingsphere.metadata.persist.NewMetaDataPersistService;
+import org.apache.shardingsphere.mode.manager.ContextManager;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.RegistryCenter;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.process.subscriber.ProcessListChangedSubscriber;
+
+/**
+ * TODO replace the old implementation after meta data refactor completed
+ * New context manager subscriber facade.
+ */
+public final class NewContextManagerSubscriberFacade {
+    
+    public NewContextManagerSubscriberFacade(final NewMetaDataPersistService 
persistService, final RegistryCenter registryCenter, final ContextManager 
contextManager) {
+        new NewConfigurationChangedSubscriber(persistService, registryCenter, 
contextManager);
+        // TODO replace all to new subscriber
+        new ResourceMetaDataChangedSubscriber(contextManager);
+        new DatabaseChangedSubscriber(contextManager);
+        new StateChangedSubscriber(registryCenter, contextManager);
+        new ProcessListChangedSubscriber(registryCenter, contextManager);
+        new 
CacheEvictedSubscriber(contextManager.getInstanceContext().getEventBusContext());
+    }
+}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/yaml/NewClusterYamlPersistRepositoryConfigurationSwapper.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/yaml/NewClusterYamlPersistRepositoryConfigurationSwapper.java
new file mode 100644
index 00000000000..1ef2a91a899
--- /dev/null
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/yaml/NewClusterYamlPersistRepositoryConfigurationSwapper.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.mode.manager.cluster.yaml;
+
+import 
org.apache.shardingsphere.infra.yaml.config.pojo.mode.YamlPersistRepositoryConfiguration;
+import 
org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlPersistRepositoryConfigurationSwapper;
+import 
org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepositoryConfiguration;
+
+/**
+ * TODO replace the old implementation after meta data refactor completed
+ * New cluster YAML persist repository configuration swapper.
+ */
+public final class NewClusterYamlPersistRepositoryConfigurationSwapper 
implements 
YamlPersistRepositoryConfigurationSwapper<ClusterPersistRepositoryConfiguration>
 {
+    
+    @Override
+    public YamlPersistRepositoryConfiguration swapToYamlConfiguration(final 
ClusterPersistRepositoryConfiguration data) {
+        YamlPersistRepositoryConfiguration result = new 
YamlPersistRepositoryConfiguration();
+        result.setType(data.getType());
+        result.setProps(data.getProps());
+        result.getProps().setProperty("namespace", data.getNamespace());
+        result.getProps().setProperty("server-lists", data.getServerLists());
+        return result;
+    }
+    
+    @Override
+    public ClusterPersistRepositoryConfiguration swapToObject(final 
YamlPersistRepositoryConfiguration yamlConfig) {
+        return new ClusterPersistRepositoryConfiguration(
+                yamlConfig.getType(), 
yamlConfig.getProps().getProperty("namespace"), 
yamlConfig.getProps().getProperty("server-lists"), yamlConfig.getProps());
+    }
+    
+    @Override
+    public String getType() {
+        return "New_Cluster";
+    }
+}
diff --git 
a/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlPersistRepositoryConfigurationSwapper
 
b/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlPersistRepositoryConfigurationSwapper
index c99b74c9e28..32547afa5a6 100644
--- 
a/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlPersistRepositoryConfigurationSwapper
+++ 
b/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.yaml.config.swapper.mode.YamlPersistRepositoryConfigurationSwapper
@@ -16,3 +16,4 @@
 #
 
 
org.apache.shardingsphere.mode.manager.cluster.yaml.ClusterYamlPersistRepositoryConfigurationSwapper
+org.apache.shardingsphere.mode.manager.cluster.yaml.NewClusterYamlPersistRepositoryConfigurationSwapper
diff --git 
a/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.manager.ContextManagerBuilder
 
b/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.manager.ContextManagerBuilder
index 953967ea3f1..ba7c524d7ee 100644
--- 
a/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.manager.ContextManagerBuilder
+++ 
b/mode/type/cluster/core/src/main/resources/META-INF/services/org.apache.shardingsphere.mode.manager.ContextManagerBuilder
@@ -16,3 +16,4 @@
 #
 
 org.apache.shardingsphere.mode.manager.cluster.ClusterContextManagerBuilder
+org.apache.shardingsphere.mode.manager.cluster.NewClusterContextManagerBuilder
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
index 7754978fc55..9dc8d1fd27f 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
@@ -31,7 +31,7 @@ import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRul
 import 
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.ResourceHeldRule;
 import 
org.apache.shardingsphere.infra.util.spi.type.ordered.cache.OrderedServicesCache;
-import 
org.apache.shardingsphere.metadata.persist.service.DatabaseMetaDataPersistService;
+import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataBasedPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.manager.ContextManagerAware;
 import org.apache.shardingsphere.mode.manager.switcher.ResourceSwitchManager;
@@ -40,12 +40,12 @@ import 
org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 
 import java.sql.SQLException;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.Collections;
 import java.util.Optional;
-import java.util.LinkedHashSet;
+import java.util.Properties;
 import java.util.stream.Collectors;
 
 /**
@@ -81,7 +81,7 @@ public final class StandaloneModeContextManager implements 
ModeContextManager, C
         ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(alterSchemaPOJO.getDatabaseName());
         putSchemaMetaData(database, alterSchemaPOJO.getSchemaName(), 
alterSchemaPOJO.getRenameSchemaName(), 
alterSchemaPOJO.getLogicDataSourceName());
         removeSchemaMetaData(database, alterSchemaPOJO.getSchemaName());
-        DatabaseMetaDataPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
+        DatabaseMetaDataBasedPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
         databaseMetaDataService.persist(alterSchemaPOJO.getDatabaseName(), 
alterSchemaPOJO.getRenameSchemaName(), 
database.getSchema(alterSchemaPOJO.getRenameSchemaName()));
         
databaseMetaDataService.getViewMetaDataPersistService().persist(alterSchemaPOJO.getDatabaseName(),
 alterSchemaPOJO.getRenameSchemaName(),
                 
database.getSchema(alterSchemaPOJO.getRenameSchemaName()).getViews());
@@ -187,7 +187,7 @@ public final class StandaloneModeContextManager implements 
ModeContextManager, C
         Map<String, ShardingSphereView> views = 
alterSchemaMetaDataPOJO.getAlteredViews().stream().collect(Collectors.toMap(ShardingSphereView::getName,
 view -> view));
         addDataNode(database, 
alterSchemaMetaDataPOJO.getLogicDataSourceName(), schemaName, tables, views);
         removeDataNode(database, schemaName, 
alterSchemaMetaDataPOJO.getDroppedTables(), 
alterSchemaMetaDataPOJO.getDroppedViews());
-        DatabaseMetaDataPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
+        DatabaseMetaDataBasedPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
         
databaseMetaDataService.getTableMetaDataPersistService().persist(databaseName, 
schemaName, tables);
         
databaseMetaDataService.getViewMetaDataPersistService().persist(databaseName, 
schemaName, views);
         alterSchemaMetaDataPOJO.getDroppedTables().forEach(each -> 
databaseMetaDataService.getTableMetaDataPersistService().delete(databaseName, 
schemaName, each));
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesExecutor.java
index 99872351e8a..3005f216e27 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ShowStatusFromReadwriteSplittingRulesExecutor.java
@@ -29,7 +29,7 @@ import 
org.apache.shardingsphere.infra.rule.identifier.type.exportable.Exportabl
 import 
org.apache.shardingsphere.infra.rule.identifier.type.exportable.RuleExportEngine;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.exportable.constant.ExportableConstants;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.exportable.constant.ExportableItemConstants;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
+import org.apache.shardingsphere.metadata.persist.MetaDataBasedPersistService;
 import org.apache.shardingsphere.mode.event.storage.StorageNodeDataSource;
 import org.apache.shardingsphere.mode.event.storage.StorageNodeRole;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.service.StorageNodeStatusService;
@@ -96,7 +96,7 @@ public final class 
ShowStatusFromReadwriteSplittingRulesExecutor implements Conn
                 
.map(this::deconstructString).flatMap(Collection::stream).collect(Collectors.toCollection(LinkedHashSet::new));
     }
     
-    private Map<String, StorageNodeDataSource> 
getPersistentReadResources(final String databaseName, final 
MetaDataPersistService persistService) {
+    private Map<String, StorageNodeDataSource> 
getPersistentReadResources(final String databaseName, final 
MetaDataBasedPersistService persistService) {
         if (null == persistService || null == persistService.getRepository() 
|| !(persistService.getRepository() instanceof ClusterPersistRepository)) {
             return Collections.emptyMap();
         }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/AlterReadwriteSplittingStorageUnitStatusStatementUpdater.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/AlterReadwriteSplittingStorageUnitStatusStatementUpdater.java
index 8f6f72b265e..3b1f6d6bd61 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/AlterReadwriteSplittingStorageUnitStatusStatementUpdater.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/AlterReadwriteSplittingStorageUnitStatusStatementUpdater.java
@@ -30,12 +30,12 @@ import 
org.apache.shardingsphere.infra.rule.identifier.type.exportable.constant.
 import 
org.apache.shardingsphere.infra.rule.identifier.type.exportable.constant.ExportableItemConstants;
 import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.util.exception.external.sql.type.generic.UnsupportedSQLOperationException;
-import org.apache.shardingsphere.mode.manager.ContextManager;
-import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.service.StorageNodeStatusService;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
+import org.apache.shardingsphere.metadata.persist.MetaDataBasedPersistService;
+import org.apache.shardingsphere.mode.event.storage.DataSourceDisabledEvent;
 import org.apache.shardingsphere.mode.event.storage.StorageNodeDataSource;
 import org.apache.shardingsphere.mode.event.storage.StorageNodeRole;
-import org.apache.shardingsphere.mode.event.storage.DataSourceDisabledEvent;
+import org.apache.shardingsphere.mode.manager.ContextManager;
+import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.storage.service.StorageNodeStatusService;
 import 
org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.readwritesplitting.distsql.parser.statement.status.AlterReadwriteSplittingStorageUnitStatusStatement;
@@ -123,7 +123,7 @@ public final class 
AlterReadwriteSplittingStorageUnitStatusStatementUpdater impl
     }
     
     private Map<String, String> getDisabledResources(final ContextManager 
contextManager, final String databaseName) {
-        MetaDataPersistService persistService = 
contextManager.getMetaDataContexts().getPersistService();
+        MetaDataBasedPersistService persistService = 
contextManager.getMetaDataContexts().getPersistService();
         return getDisabledStorageNodes(databaseName, persistService).stream()
                 
.collect(Collectors.toMap(QualifiedDatabase::getDataSourceName, 
QualifiedDatabase::getGroupName, (value1, value2) -> String.join(",", value1, 
value2)));
     }
@@ -185,7 +185,7 @@ public final class 
AlterReadwriteSplittingStorageUnitStatusStatementUpdater impl
         });
     }
     
-    private Collection<QualifiedDatabase> getDisabledStorageNodes(final String 
databaseName, final MetaDataPersistService persistService) {
+    private Collection<QualifiedDatabase> getDisabledStorageNodes(final String 
databaseName, final MetaDataBasedPersistService persistService) {
         Map<String, StorageNodeDataSource> storageNodes = new 
StorageNodeStatusService((ClusterPersistRepository) 
persistService.getRepository()).loadStorageNodes();
         return storageNodes.entrySet().stream().filter(each -> 
DataSourceState.DISABLED == each.getValue().getStatus())
                 .map(each -> new QualifiedDatabase(each.getKey())).filter(each 
-> 
databaseName.equalsIgnoreCase(each.getDatabaseName())).collect(Collectors.toList());
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LabelComputeNodeUpdater.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LabelComputeNodeUpdater.java
index e2282f670f2..37888483005 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LabelComputeNodeUpdater.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/LabelComputeNodeUpdater.java
@@ -22,9 +22,9 @@ import 
org.apache.shardingsphere.distsql.parser.statement.ral.updatable.LabelCom
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
 import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.util.exception.external.sql.type.generic.UnsupportedSQLOperationException;
+import org.apache.shardingsphere.metadata.persist.MetaDataBasedPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.LabelsChangedEvent;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import 
org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 
@@ -42,7 +42,7 @@ public final class LabelComputeNodeUpdater implements 
RALUpdater<LabelComputeNod
     @Override
     public void executeUpdate(final String databaseName, final 
LabelComputeNodeStatement sqlStatement) throws SQLException {
         ContextManager contextManager = 
ProxyContext.getInstance().getContextManager();
-        MetaDataPersistService persistService = 
contextManager.getMetaDataContexts().getPersistService();
+        MetaDataBasedPersistService persistService = 
contextManager.getMetaDataContexts().getPersistService();
         ShardingSpherePreconditions.checkState(null != persistService && null 
!= persistService.getRepository() && persistService.getRepository() instanceof 
ClusterPersistRepository,
                 () -> new UnsupportedSQLOperationException("Labels can only be 
added in cluster mode"));
         String instanceId = sqlStatement.getInstanceId();
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlabelComputeNodeUpdater.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlabelComputeNodeUpdater.java
index 27a9c408747..1ea08a262ae 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlabelComputeNodeUpdater.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/UnlabelComputeNodeUpdater.java
@@ -22,9 +22,9 @@ import 
org.apache.shardingsphere.distsql.parser.statement.ral.updatable.UnlabelC
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
 import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.util.exception.external.sql.type.generic.UnsupportedSQLOperationException;
+import org.apache.shardingsphere.metadata.persist.MetaDataBasedPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.compute.event.LabelsChangedEvent;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import 
org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 
@@ -41,7 +41,7 @@ public final class UnlabelComputeNodeUpdater implements 
RALUpdater<UnlabelComput
     
     @Override
     public void executeUpdate(final String databaseName, final 
UnlabelComputeNodeStatement sqlStatement) {
-        MetaDataPersistService persistService = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getPersistService();
+        MetaDataBasedPersistService persistService = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getPersistService();
         ShardingSpherePreconditions.checkState(null != 
persistService.getRepository() && persistService.getRepository() instanceof 
ClusterPersistRepository,
                 () -> new UnsupportedSQLOperationException("Labels can only be 
removed in cluster mode"));
         String instanceId = sqlStatement.getInstanceId();

Reply via email to