You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/06/07 23:57:23 UTC

[shardingsphere] branch master updated: Add NewGlobalRulePersistService to adapter new metadata structure (#26098)

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

duanzhengqiang 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 7949e575052 Add NewGlobalRulePersistService to adapter new metadata structure (#26098)
7949e575052 is described below

commit 7949e5750521121679c0889605ca11c55afa418c
Author: zhaojinchao <zh...@apache.org>
AuthorDate: Thu Jun 8 07:57:07 2023 +0800

    Add NewGlobalRulePersistService to adapter new metadata structure (#26098)
    
    * Add NewGlobalRulePersistService to adapter new metadata structure
    
    * Update it
    
    * Fix ci
    
    * Remove NewDatabaseBasedPersistService
    
    * Fix checkstyle
---
 .../NewYamlRuleConfigurationSwapperEngine.java     |  6 +-
 .../persist/NewMetaDataPersistService.java         | 18 ++---
 .../persist/node/NewDatabaseMetaDataNode.java      | 73 +++++++++---------
 .../metadata/persist/node/NewGlobalNode.java       | 90 ++++++++++++++++++++++
 .../database/NewDataSourcePersistService.java      | 10 +--
 .../database/NewDatabaseBasedPersistService.java   | 44 -----------
 .../NewDatabaseRuleBasedPersistService.java        |  2 +-
 .../database/NewDatabaseRulePersistService.java    | 28 ++++---
 .../NewGlobalRulePersistService.java}              | 67 ++++++++--------
 .../config/global/NewPropertiesPersistService.java | 52 +++++++++++++
 .../persist/node/NewDatabaseMetaDataNodeTest.java  | 10 +--
 .../metadata/persist/node/NewGlobalNodeTest.java   | 52 +++++++++++++
 .../watcher/NewMetaDataChangedWatcher.java         |  2 +-
 13 files changed, 307 insertions(+), 147 deletions(-)

diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapperEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapperEngine.java
index 188740d7953..43c41b856ea 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapperEngine.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/NewYamlRuleConfigurationSwapperEngine.java
@@ -45,17 +45,13 @@ public final class NewYamlRuleConfigurationSwapperEngine {
     /**
      * Swap from YAML rule configurations to rule configurations.
      *
-     * @param ruleName rule name
      * @param dataNodes YAML data nodes
      * @return rule configurations
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
-    public Collection<RuleConfiguration> swapToRuleConfigurations(final String ruleName, final Collection<YamlDataNode> dataNodes) {
+    public Collection<RuleConfiguration> swapToRuleConfigurations(final Collection<YamlDataNode> dataNodes) {
         Collection<RuleConfiguration> result = new LinkedList<>();
         for (NewYamlRuleConfigurationSwapper each : OrderedSPILoader.getServices(NewYamlRuleConfigurationSwapper.class)) {
-            if (!each.getRuleTagName().toLowerCase().equals(ruleName)) {
-                continue;
-            }
             result.add((RuleConfiguration) each.swapToObject(dataNodes));
         }
         return result;
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
index 373b3722943..dafa7bf4a68 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/NewMetaDataPersistService.java
@@ -27,11 +27,11 @@ import org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCrea
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.metadata.persist.data.ShardingSphereDataPersistService;
 import org.apache.shardingsphere.metadata.persist.service.config.database.NewDataSourcePersistService;
+import org.apache.shardingsphere.metadata.persist.service.config.database.NewDatabaseRulePersistService;
+import org.apache.shardingsphere.metadata.persist.service.config.global.NewGlobalRulePersistService;
+import org.apache.shardingsphere.metadata.persist.service.config.global.NewPropertiesPersistService;
 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.DatabaseRulePersistService;
-import org.apache.shardingsphere.metadata.persist.service.config.global.GlobalRulePersistService;
-import org.apache.shardingsphere.metadata.persist.service.config.global.PropertiesPersistService;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 
 import javax.sql.DataSource;
@@ -55,11 +55,11 @@ public final class NewMetaDataPersistService implements MetaDataBasedPersistServ
     
     private final DatabaseMetaDataPersistService databaseMetaDataService;
     
-    private final DatabaseRulePersistService databaseRulePersistService;
+    private final NewDatabaseRulePersistService databaseRulePersistService;
     
-    private final GlobalRulePersistService globalRuleService;
+    private final NewGlobalRulePersistService globalRuleService;
     
-    private final PropertiesPersistService propsService;
+    private final NewPropertiesPersistService propsService;
     
     private final MetaDataVersionPersistService metaDataVersionPersistService;
     
@@ -69,9 +69,9 @@ public final class NewMetaDataPersistService implements MetaDataBasedPersistServ
         this.repository = repository;
         dataSourceService = new NewDataSourcePersistService(repository);
         databaseMetaDataService = new DatabaseMetaDataPersistService(repository);
-        databaseRulePersistService = new DatabaseRulePersistService(repository);
-        globalRuleService = new GlobalRulePersistService(repository);
-        propsService = new PropertiesPersistService(repository);
+        databaseRulePersistService = new NewDatabaseRulePersistService(repository);
+        globalRuleService = new NewGlobalRulePersistService(repository);
+        propsService = new NewPropertiesPersistService(repository);
         metaDataVersionPersistService = new MetaDataVersionPersistService(repository);
         shardingSphereDataPersistService = new ShardingSphereDataPersistService(repository);
     }
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNode.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNode.java
index 11601b52683..1317c48205e 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNode.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNode.java
@@ -41,103 +41,102 @@ public final class NewDatabaseMetaDataNode {
     private static final String VERSIONS = "versions";
     
     /**
-     * Get data Sources path.
+     * Get data Sources node.
      *
      * @param databaseName database name
-     * @return data sources path
+     * @return data sources node
      */
-    public static String getDataSourcesPath(final String databaseName) {
-        return String.join("/", getMetaDataNodePath(), DataSourceNodeConverter.getDataSourcesPath(databaseName));
+    public static String getDataSourcesNode(final String databaseName) {
+        return String.join("/", getMetaDataNodeNode(), DataSourceNodeConverter.getDataSourcesPath(databaseName));
     }
     
     /**
-     * Get data Source path.
+     * Get data Source node.
      *
      * @param databaseName database name
      * @param dataSourceName data source name
      * @param version version
-     * @return data source path
+     * @return data source node
      */
-    public static String getDataSourcePath(final String databaseName, final String dataSourceName, final String version) {
-        return String.join("/", getMetaDataNodePath(), DataSourceNodeConverter.getDataSourcePath(databaseName, dataSourceName, version));
+    public static String getDataSourceNode(final String databaseName, final String dataSourceName, final String version) {
+        return String.join("/", getMetaDataNodeNode(), DataSourceNodeConverter.getDataSourcePath(databaseName, dataSourceName, version));
     }
     
     /**
-     * Get data Source active version path.
+     * Get data Source active version node.
      *
      * @param databaseName database name
      * @param dataSourceName data source name
-     * @return data source active version path
+     * @return data source active version node
      */
-    public static String getDataSourceActiveVersionPath(final String databaseName, final String dataSourceName) {
-        return String.join("/", getMetaDataNodePath(), DataSourceNodeConverter.getActiveVersionPath(databaseName, dataSourceName));
+    public static String getDataSourceActiveVersionNode(final String databaseName, final String dataSourceName) {
+        return String.join("/", getMetaDataNodeNode(), DataSourceNodeConverter.getActiveVersionPath(databaseName, dataSourceName));
     }
     
     /**
-     * Get database rule active version path.
+     * Get database rule active version node.
      *
      * @param databaseName database name
      * @param ruleName rule name
      * @param key key
-     * @return database rule active version path
+     * @return database rule active version node
      */
-    public static String getDatabaseRuleActiveVersionPath(final String databaseName, final String ruleName, final String key) {
-        return String.join("/", getDatabaseRulePath(databaseName, ruleName), key, ACTIVE_VERSION);
+    public static String getDatabaseRuleActiveVersionNode(final String databaseName, final String ruleName, final String key) {
+        return String.join("/", getDatabaseRuleNode(databaseName, ruleName), key, ACTIVE_VERSION);
     }
     
     /**
-     * Get database rule versions path.
+     * Get database rule versions node.
      *
      * @param databaseName database name
      * @param ruleName rule name
      * @param key key
-     * @return database rule versions path
+     * @return database rule versions node
      */
-    public static String getDatabaseRuleVersionsPath(final String databaseName, final String ruleName, final String key) {
-        return String.join("/", getDatabaseRulePath(databaseName, ruleName), key, VERSIONS);
+    public static String getDatabaseRuleVersionsNode(final String databaseName, final String ruleName, final String key) {
+        return String.join("/", getDatabaseRuleNode(databaseName, ruleName), key, VERSIONS);
     }
     
     /**
-     * Get database rule version path.
+     * Get database rule version node.
      *
      * @param databaseName database name
      * @param ruleName rule name
      * @param key key
-     * @param nextVersion next version
+     * @param version version
      * @return database rule next version
      */
-    public static String getDatabaseRuleVersionPath(final String databaseName, final String ruleName, final String key, final String nextVersion) {
-        return String.join("/", getDatabaseRulePath(databaseName, ruleName), key, VERSIONS, nextVersion);
+    public static String getDatabaseRuleVersionNode(final String databaseName, final String ruleName, final String key, final String version) {
+        return String.join("/", getDatabaseRuleNode(databaseName, ruleName), key, VERSIONS, version);
+    }
+    
+    private static String getDatabaseRuleNode(final String databaseName, final String ruleName) {
+        return String.join("/", getRulesNode(databaseName), ruleName);
     }
     
     /**
-     * Get database rule path.
+     * Get database rules node.
      *
      * @param databaseName database name
-     * @param ruleName rule name
-     * @return database rule path
+     * @return database rules node
      */
-    public static String getDatabaseRulePath(final String databaseName, final String ruleName) {
-        return String.join("/", getRulesPath(databaseName), ruleName);
+    public static String getRulesNode(final String databaseName) {
+        return String.join("/", getMetaDataNodeNode(), databaseName, RULE_NODE);
     }
     
     /**
-     * Get database name by path.
+     * Get database name by node.
      *
      * @param path config path
      * @return database name
      */
-    public static Optional<String> getDatabaseNameByPath(final String path) {
-        Pattern pattern = Pattern.compile(getMetaDataNodePath() + "/([\\w\\-]+)?", Pattern.CASE_INSENSITIVE);
+    public static Optional<String> getDatabaseNameByNode(final String path) {
+        Pattern pattern = Pattern.compile(getMetaDataNodeNode() + "/([\\w\\-]+)?", Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(path);
         return matcher.find() ? Optional.of(matcher.group(1)) : Optional.empty();
     }
     
-    private static String getRulesPath(final String databaseName) {
-        return String.join("/", getMetaDataNodePath(), databaseName, RULE_NODE);
-    }
-    
-    private static String getMetaDataNodePath() {
+    private static String getMetaDataNodeNode() {
         return String.join("/", "", ROOT_NODE);
     }
 }
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNode.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNode.java
new file mode 100644
index 00000000000..9067d2252eb
--- /dev/null
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNode.java
@@ -0,0 +1,90 @@
+/*
+ * 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.node;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+/**
+ * TODO Rename GlobalNode when metadata structure adjustment completed. #25485
+ * Global node.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class NewGlobalNode {
+    
+    private static final String RULE_NODE = "rules";
+    
+    private static final String PROPS_NODE = "props";
+    
+    private static final String ACTIVE_VERSION = "active_version";
+    
+    private static final String VERSIONS = "versions";
+    
+    /**
+     * Get global rule active version node.
+     *
+     * @param ruleName rule name
+     * @return global rule active version node
+     */
+    public static String getGlobalRuleActiveVersionNode(final String ruleName) {
+        return String.join("/", getGlobalRuleRootNode(), ruleName, ACTIVE_VERSION);
+    }
+    
+    /**
+     * Get global rule version node.
+     *
+     * @param ruleName rule name
+     * @param version version
+     * @return global rule version node
+     */
+    public static String getGlobalRuleVersionNode(final String ruleName, final String version) {
+        return String.join("/", getGlobalRuleRootNode(), ruleName, VERSIONS, version);
+    }
+    
+    /**
+     * Get global rule root node.
+     *
+     * @return global rule root node
+     */
+    public static String getGlobalRuleRootNode() {
+        return String.join("/", "", RULE_NODE);
+    }
+    
+    /**
+     * Get properties active version node.
+     *
+     * @return properties active version node
+     */
+    public static String getPropsActiveVersionNode() {
+        return String.join("/", getPropsRootNode(), ACTIVE_VERSION);
+    }
+    
+    /**
+     * Get properties version node.
+     *
+     * @param version version
+     * @return properties version node
+     */
+    public static String getPropsVersionNode(final String version) {
+        return String.join("/", getPropsRootNode(), VERSIONS, version);
+    }
+    
+    private static String getPropsRootNode() {
+        return String.join("/", "", PROPS_NODE);
+    }
+}
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDataSourcePersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDataSourcePersistService.java
index 479b697be74..ddc8d105b92 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDataSourcePersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDataSourcePersistService.java
@@ -47,9 +47,9 @@ public final class NewDataSourcePersistService implements DatabaseBasedPersistSe
         for (Entry<String, DataSourceProperties> entry : dataSourceConfigs.entrySet()) {
             String activeVersion = getDatabaseActiveVersion(databaseName, entry.getKey());
             if (Strings.isNullOrEmpty(activeVersion)) {
-                repository.persist(NewDatabaseMetaDataNode.getDataSourceActiveVersionPath(databaseName, entry.getKey()), DEFAULT_VERSION);
+                repository.persist(NewDatabaseMetaDataNode.getDataSourceActiveVersionNode(databaseName, entry.getKey()), DEFAULT_VERSION);
             }
-            repository.persist(NewDatabaseMetaDataNode.getDataSourcePath(databaseName, entry.getKey(), DEFAULT_VERSION),
+            repository.persist(NewDatabaseMetaDataNode.getDataSourceNode(databaseName, entry.getKey(), DEFAULT_VERSION),
                     YamlEngine.marshal(new YamlDataSourceConfigurationSwapper().swapToMap(entry.getValue())));
         }
     }
@@ -57,7 +57,7 @@ public final class NewDataSourcePersistService implements DatabaseBasedPersistSe
     @Override
     public Map<String, DataSourceProperties> load(final String databaseName) {
         Map<String, DataSourceProperties> result = new LinkedHashMap<>();
-        for (String each : repository.getChildrenKeys(NewDatabaseMetaDataNode.getDataSourcesPath(databaseName))) {
+        for (String each : repository.getChildrenKeys(NewDatabaseMetaDataNode.getDataSourcesNode(databaseName))) {
             result.put(each, getDataSourceProps(databaseName, each));
         }
         return result;
@@ -70,12 +70,12 @@ public final class NewDataSourcePersistService implements DatabaseBasedPersistSe
     }
     
     private DataSourceProperties getDataSourceProps(final String databaseName, final String dataSourceName) {
-        String result = repository.getDirectly(NewDatabaseMetaDataNode.getDataSourcePath(databaseName, getDatabaseActiveVersion(databaseName, dataSourceName), dataSourceName));
+        String result = repository.getDirectly(NewDatabaseMetaDataNode.getDataSourceNode(databaseName, getDatabaseActiveVersion(databaseName, dataSourceName), dataSourceName));
         Preconditions.checkState(!Strings.isNullOrEmpty(result), "Not found `%s` data source config in `%s` database", dataSourceName, databaseName);
         return YamlEngine.unmarshal(result, DataSourceProperties.class);
     }
     
     private String getDatabaseActiveVersion(final String databaseName, final String dataSourceName) {
-        return repository.getDirectly(NewDatabaseMetaDataNode.getDataSourceActiveVersionPath(databaseName, dataSourceName));
+        return repository.getDirectly(NewDatabaseMetaDataNode.getDataSourceActiveVersionNode(databaseName, dataSourceName));
     }
 }
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseBasedPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseBasedPersistService.java
deleted file mode 100644
index 868c34f9690..00000000000
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseBasedPersistService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.config.database;
-
-/**
- * TODO Rename DatabaseBasedPersistService when metadata structure adjustment completed. #25485
- * Database based persist service.
- *
- * @param <T> type of configuration
- */
-public interface NewDatabaseBasedPersistService<T> {
-    
-    /**
-     * Persist configurations.
-     *
-     * @param databaseName database name
-     * @param configs configurations
-     */
-    void persist(String databaseName, T configs);
-    
-    /**
-     * Load configurations.
-     *
-     * @param databaseName database name
-     * @param ruleName rule name
-     * @return configurations
-     */
-    T load(String databaseName, String ruleName);
-}
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRuleBasedPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRuleBasedPersistService.java
index 086ec06f705..7e6ffce1e80 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRuleBasedPersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRuleBasedPersistService.java
@@ -29,7 +29,7 @@ import java.util.Map;
  *
  * @param <T> type of configuration
  */
-public interface NewDatabaseRuleBasedPersistService<T> extends NewDatabaseBasedPersistService<T> {
+public interface NewDatabaseRuleBasedPersistService<T> extends DatabaseBasedPersistService<T> {
     
     /**
      * Persist configurations.
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java
index 16c259deee6..6b1eb4775a8 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java
@@ -33,6 +33,7 @@ import java.util.List;
 import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Map.Entry;
 
 /**
  * TODO Rename DatabaseRulePersistService when metadata structure adjustment completed. #25485
@@ -55,7 +56,7 @@ public final class NewDatabaseRulePersistService implements NewDatabaseRuleBased
     @Override
     public void persist(final String databaseName, final Collection<RuleConfiguration> configs) {
         Map<RuleConfiguration, NewYamlRuleConfigurationSwapper> yamlConfigs = new NewYamlRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(configs);
-        for (Map.Entry<RuleConfiguration, NewYamlRuleConfigurationSwapper> entry : yamlConfigs.entrySet()) {
+        for (Entry<RuleConfiguration, NewYamlRuleConfigurationSwapper> entry : yamlConfigs.entrySet()) {
             Collection<YamlDataNode> dataNodes = entry.getValue().swapToDataNodes(entry.getKey());
             if (dataNodes.isEmpty()) {
                 continue;
@@ -66,34 +67,41 @@ public final class NewDatabaseRulePersistService implements NewDatabaseRuleBased
     
     private void persistDataNodes(final String databaseName, final String ruleName, final Collection<YamlDataNode> dataNodes) {
         for (YamlDataNode each : dataNodes) {
-            if (Strings.isNullOrEmpty(repository.getDirectly(each.getKey()))) {
-                repository.persist(NewDatabaseMetaDataNode.getDatabaseRuleActiveVersionPath(databaseName, ruleName, each.getKey()), DEFAULT_VERSION);
+            if (Strings.isNullOrEmpty(NewDatabaseMetaDataNode.getDatabaseRuleActiveVersionNode(databaseName, ruleName, each.getKey()))) {
+                repository.persist(NewDatabaseMetaDataNode.getDatabaseRuleActiveVersionNode(databaseName, ruleName, each.getKey()), DEFAULT_VERSION);
             }
-            List<String> versions = repository.getChildrenKeys(NewDatabaseMetaDataNode.getDatabaseRuleVersionsPath(databaseName, ruleName, each.getKey()));
-            repository.persist(NewDatabaseMetaDataNode.getDatabaseRuleVersionPath(databaseName, ruleName, each.getKey(), versions.isEmpty()
+            List<String> versions = repository.getChildrenKeys(NewDatabaseMetaDataNode.getDatabaseRuleVersionsNode(databaseName, ruleName, each.getKey()));
+            repository.persist(NewDatabaseMetaDataNode.getDatabaseRuleVersionNode(databaseName, ruleName, each.getKey(), versions.isEmpty()
                     ? DEFAULT_VERSION
                     : String.valueOf(Integer.parseInt(versions.get(0)) + 1)), each.getValue());
         }
     }
     
     @Override
-    public Collection<RuleConfiguration> load(final String databaseName, final String ruleName) {
+    public Collection<RuleConfiguration> load(final String databaseName) {
         Collection<String> result = new LinkedHashSet<>();
-        getAllKeys(result, NewDatabaseMetaDataNode.getDatabaseRulePath(databaseName, ruleName));
+        getAllNodes(result, NewDatabaseMetaDataNode.getRulesNode(databaseName));
         if (1 == result.size()) {
             return Collections.emptyList();
         }
-        return new NewYamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(ruleName, getDataNodes(result));
+        return new NewYamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(getDataNodes(result));
     }
     
-    private void getAllKeys(final Collection<String> keys, final String path) {
+    @Deprecated
+    @Override
+    public Collection<RuleConfiguration> load(final String databaseName, final String version) {
+        // TODO Remove this method when metadata structure adjustment completed. #25485
+        return Collections.emptyList();
+    }
+    
+    private void getAllNodes(final Collection<String> keys, final String path) {
         keys.add(path);
         List<String> childrenKeys = repository.getChildrenKeys(path);
         if (childrenKeys.isEmpty()) {
             return;
         }
         for (String each : childrenKeys) {
-            getAllKeys(keys, String.join("/", "", path, each));
+            getAllNodes(keys, String.join("/", "", path, each));
         }
     }
     
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/NewGlobalRulePersistService.java
similarity index 56%
copy from kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java
copy to kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/NewGlobalRulePersistService.java
index 16c259deee6..9137d33fa5c 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/NewDatabaseRulePersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/NewGlobalRulePersistService.java
@@ -15,85 +15,80 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.metadata.persist.service.config.database;
+package org.apache.shardingsphere.metadata.persist.service.config.global;
 
 import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.authority.config.AuthorityRuleConfiguration;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.metadata.user.ShardingSphereUser;
 import org.apache.shardingsphere.infra.util.yaml.datanode.YamlDataNode;
 import org.apache.shardingsphere.infra.yaml.config.swapper.rule.NewYamlRuleConfigurationSwapper;
 import org.apache.shardingsphere.infra.yaml.config.swapper.rule.NewYamlRuleConfigurationSwapperEngine;
-import org.apache.shardingsphere.metadata.persist.node.NewDatabaseMetaDataNode;
+import org.apache.shardingsphere.metadata.persist.node.NewGlobalNode;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 
-import javax.sql.DataSource;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.Optional;
 import java.util.List;
-import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.Map;
+import java.util.Map.Entry;
 
 /**
- * TODO Rename DatabaseRulePersistService when metadata structure adjustment completed. #25485
- * Database rule persist service.
+ * TODO Rename GlobalRulePersistService when metadata structure adjustment completed. #25485
+ * New Global rule persist service.
  */
 @RequiredArgsConstructor
-public final class NewDatabaseRulePersistService implements NewDatabaseRuleBasedPersistService<Collection<RuleConfiguration>> {
+public final class NewGlobalRulePersistService implements GlobalPersistService<Collection<RuleConfiguration>> {
     
     private static final String DEFAULT_VERSION = "0";
     
     private final PersistRepository repository;
     
-    @Override
-    public void persist(final String databaseName, final Map<String, DataSource> dataSources,
-                        final Collection<ShardingSphereRule> rules, final Collection<RuleConfiguration> configs) {
-        // TODO Load single table refer to #22887
-    }
-    
     @SuppressWarnings({"unchecked", "rawtypes"})
     @Override
-    public void persist(final String databaseName, final Collection<RuleConfiguration> configs) {
-        Map<RuleConfiguration, NewYamlRuleConfigurationSwapper> yamlConfigs = new NewYamlRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(configs);
-        for (Map.Entry<RuleConfiguration, NewYamlRuleConfigurationSwapper> entry : yamlConfigs.entrySet()) {
+    public void persist(final Collection<RuleConfiguration> globalRuleConfigs) {
+        Map<RuleConfiguration, NewYamlRuleConfigurationSwapper> yamlConfigs = new NewYamlRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(globalRuleConfigs);
+        for (Entry<RuleConfiguration, NewYamlRuleConfigurationSwapper> entry : yamlConfigs.entrySet()) {
             Collection<YamlDataNode> dataNodes = entry.getValue().swapToDataNodes(entry.getKey());
             if (dataNodes.isEmpty()) {
                 continue;
             }
-            persistDataNodes(databaseName, entry.getValue().getRuleTagName().toLowerCase(), dataNodes);
+            persistDataNodes(dataNodes);
         }
     }
     
-    private void persistDataNodes(final String databaseName, final String ruleName, final Collection<YamlDataNode> dataNodes) {
+    private void persistDataNodes(final Collection<YamlDataNode> dataNodes) {
         for (YamlDataNode each : dataNodes) {
-            if (Strings.isNullOrEmpty(repository.getDirectly(each.getKey()))) {
-                repository.persist(NewDatabaseMetaDataNode.getDatabaseRuleActiveVersionPath(databaseName, ruleName, each.getKey()), DEFAULT_VERSION);
+            if (Strings.isNullOrEmpty(NewGlobalNode.getGlobalRuleActiveVersionNode(each.getKey()))) {
+                repository.persist(NewGlobalNode.getGlobalRuleActiveVersionNode(each.getKey()), DEFAULT_VERSION);
             }
-            List<String> versions = repository.getChildrenKeys(NewDatabaseMetaDataNode.getDatabaseRuleVersionsPath(databaseName, ruleName, each.getKey()));
-            repository.persist(NewDatabaseMetaDataNode.getDatabaseRuleVersionPath(databaseName, ruleName, each.getKey(), versions.isEmpty()
-                    ? DEFAULT_VERSION
-                    : String.valueOf(Integer.parseInt(versions.get(0)) + 1)), each.getValue());
+            repository.persist(NewGlobalNode.getGlobalRuleVersionNode(each.getKey(), DEFAULT_VERSION), each.getValue());
         }
     }
     
     @Override
-    public Collection<RuleConfiguration> load(final String databaseName, final String ruleName) {
+    @SuppressWarnings("unchecked")
+    public Collection<RuleConfiguration> load() {
         Collection<String> result = new LinkedHashSet<>();
-        getAllKeys(result, NewDatabaseMetaDataNode.getDatabaseRulePath(databaseName, ruleName));
+        getAllNodes(result, NewGlobalNode.getGlobalRuleRootNode());
         if (1 == result.size()) {
             return Collections.emptyList();
         }
-        return new NewYamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(ruleName, getDataNodes(result));
+        return new NewYamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(getDataNodes(result));
     }
     
-    private void getAllKeys(final Collection<String> keys, final String path) {
+    // TODO Consider merge NewGlobalRulePersistService and NewDatabaseRulePersistService load method.
+    private void getAllNodes(final Collection<String> keys, final String path) {
         keys.add(path);
         List<String> childrenKeys = repository.getChildrenKeys(path);
         if (childrenKeys.isEmpty()) {
             return;
         }
         for (String each : childrenKeys) {
-            getAllKeys(keys, String.join("/", "", path, each));
+            getAllNodes(keys, String.join("/", "", path, each));
         }
     }
     
@@ -104,4 +99,16 @@ public final class NewDatabaseRulePersistService implements NewDatabaseRuleBased
         }
         return result;
     }
+    
+    /**
+     * Load all users.
+     * 
+     * @return collection of user
+     */
+    @Override
+    public Collection<ShardingSphereUser> loadUsers() {
+        Optional<AuthorityRuleConfiguration> authorityRuleConfig = load().stream()
+                .filter(AuthorityRuleConfiguration.class::isInstance).map(AuthorityRuleConfiguration.class::cast).findFirst();
+        return authorityRuleConfig.isPresent() ? authorityRuleConfig.get().getUsers() : Collections.emptyList();
+    }
 }
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/NewPropertiesPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/NewPropertiesPersistService.java
new file mode 100644
index 00000000000..26537b1eb6a
--- /dev/null
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/NewPropertiesPersistService.java
@@ -0,0 +1,52 @@
+/*
+ * 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.config.global;
+
+import com.google.common.base.Strings;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
+import org.apache.shardingsphere.metadata.persist.node.NewGlobalNode;
+import org.apache.shardingsphere.mode.spi.PersistRepository;
+
+import java.util.Properties;
+
+/**
+ * TODO Rename PropertiesPersistService when metadata structure adjustment completed. #25485
+ * Properties persist service.
+ */
+@RequiredArgsConstructor
+public final class NewPropertiesPersistService implements GlobalPersistService<Properties> {
+    
+    private static final String DEFAULT_VERSION = "0";
+    
+    private final PersistRepository repository;
+    
+    @Override
+    public void persist(final Properties props) {
+        if (Strings.isNullOrEmpty(repository.getDirectly(NewGlobalNode.getPropsActiveVersionNode()))) {
+            repository.persist(NewGlobalNode.getPropsActiveVersionNode(), DEFAULT_VERSION);
+        }
+        repository.persist(NewGlobalNode.getPropsVersionNode(DEFAULT_VERSION), YamlEngine.marshal(props));
+    }
+    
+    @Override
+    public Properties load() {
+        // TODO
+        return new Properties();
+    }
+}
diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNodeTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNodeTest.java
index bfafe7fa08c..57a5164a9af 100644
--- a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNodeTest.java
+++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewDatabaseMetaDataNodeTest.java
@@ -30,27 +30,27 @@ class NewDatabaseMetaDataNodeTest {
     
     @Test
     void assertGetMetaDataDataSourcesPath() {
-        assertThat(NewDatabaseMetaDataNode.getDataSourcesPath("foo_db"), is("/metadata/foo_db/data_sources"));
+        assertThat(NewDatabaseMetaDataNode.getDataSourcesNode("foo_db"), is("/metadata/foo_db/data_sources"));
     }
     
     @Test
     void assertGetMetaDataDataSourcePath() {
-        assertThat(NewDatabaseMetaDataNode.getDataSourcePath("foo_db", "foo_ds", "0"), is("/metadata/foo_db/data_sources/foo_ds/versions/0"));
+        assertThat(NewDatabaseMetaDataNode.getDataSourceNode("foo_db", "foo_ds", "0"), is("/metadata/foo_db/data_sources/foo_ds/versions/0"));
     }
     
     @Test
     void assertGetDatabaseRuleActiveVersionPath() {
-        assertThat(NewDatabaseMetaDataNode.getDatabaseRuleActiveVersionPath("foo_db", "foo_rule", "foo_tables"), is("/metadata/foo_db/rules/foo_rule/foo_tables/active_version"));
+        assertThat(NewDatabaseMetaDataNode.getDatabaseRuleActiveVersionNode("foo_db", "foo_rule", "foo_tables"), is("/metadata/foo_db/rules/foo_rule/foo_tables/active_version"));
     }
     
     @Test
     void assertGetDatabaseRuleVersionPath() {
-        assertThat(NewDatabaseMetaDataNode.getDatabaseRuleVersionPath("foo_db", "foo_rule", "foo_tables", "1"), is("/metadata/foo_db/rules/foo_rule/foo_tables/versions/1"));
+        assertThat(NewDatabaseMetaDataNode.getDatabaseRuleVersionNode("foo_db", "foo_rule", "foo_tables", "1"), is("/metadata/foo_db/rules/foo_rule/foo_tables/versions/1"));
     }
     
     @Test
     void assertGetDatabaseNameByPath() {
-        Optional<String> actual = NewDatabaseMetaDataNode.getDatabaseNameByPath("/metadata/foo_db/readwrite_splitting");
+        Optional<String> actual = NewDatabaseMetaDataNode.getDatabaseNameByNode("/metadata/foo_db/readwrite_splitting");
         assertTrue(actual.isPresent());
         assertThat(actual.get(), is("foo_db"));
     }
diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNodeTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNodeTest.java
new file mode 100644
index 00000000000..6fefcbd1297
--- /dev/null
+++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/node/NewGlobalNodeTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.node;
+
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+// TODO Rename GlobalNodeTest when metadata structure adjustment completed. #25485
+class NewGlobalNodeTest {
+    
+    @Test
+    void assertGetGlobalRuleRootNode() {
+        assertThat(NewGlobalNode.getGlobalRuleRootNode(), is("/rules"));
+    }
+    
+    @Test
+    void assertGetPropsActiveVersionNode() {
+        assertThat(NewGlobalNode.getPropsActiveVersionNode(), is("/props/active_version"));
+    }
+    
+    @Test
+    void assertGetPropsVersionNode() {
+        assertThat(NewGlobalNode.getPropsVersionNode("0"), is("/props/versions/0"));
+    }
+    
+    @Test
+    void assertGetGlobalRuleActiveVersionNode() {
+        assertThat(NewGlobalNode.getGlobalRuleActiveVersionNode("transaction"), is("/rules/transaction/active_version"));
+    }
+    
+    @Test
+    void assertGetGlobalRuleVersionNode() {
+        assertThat(NewGlobalNode.getGlobalRuleVersionNode("transaction", "0"), is("/rules/transaction/versions/0"));
+    }
+}
diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/NewMetaDataChangedWatcher.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/NewMetaDataChangedWatcher.java
index 74e81e9b50d..3918cd4d0d6 100644
--- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/NewMetaDataChangedWatcher.java
+++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/NewMetaDataChangedWatcher.java
@@ -57,7 +57,7 @@ public final class NewMetaDataChangedWatcher implements NewGovernanceWatcher<Gov
     
     // TODO Change to map to avoid loops.
     private Optional<GovernanceEvent> createRuleEvent(final DataChangedEvent event) {
-        Optional<String> databaseName = NewDatabaseMetaDataNode.getDatabaseNameByPath(event.getKey());
+        Optional<String> databaseName = NewDatabaseMetaDataNode.getDatabaseNameByNode(event.getKey());
         if (!databaseName.isPresent()) {
             return Optional.empty();
         }