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

wuweijie 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 024432e  Split RegistryCenterNode to multiple nodes (#10511)
024432e is described below

commit 024432e8359c13cac2ac414ce0f93e7a0cd11530
Author: Liang Zhang <[email protected]>
AuthorDate: Thu May 27 23:52:48 2021 +0800

    Split RegistryCenterNode to multiple nodes (#10511)
    
    * Update GlobalRuleRegistryService
    
    * Static RegistryCenterNode
    
    * Static RegistryCenterNode
    
    * Rename RegistryCenterNode.STATES_NODE
    
    * add StatesNode
    
    * Refactor StatesNode
    
    * Refactor StatesNode
    
    * Add PropertiesNode
    
    * Add PropertiesNode
    
    * Refactor StatesNode
    
    * Add GlobalRuleNode
    
    * Merge GlobalNode
    
    * Add SchemaMetadataNode
    
    * Add CacheNode
    
    * Add ProcessNode
    
    * Add SchemaNameUtil
    
    * Update SchemaNameUtil
---
 .../listener/PrivilegeNodeChangedListener.java     |   4 +-
 .../authority/listener/UserChangedListener.java    |   4 +-
 .../governance/core/facade/GovernanceFacade.java   |   2 +-
 .../governance/core/registry/RegistryCenter.java   |  23 +-
 .../core/registry/RegistryCenterNode.java          | 389 ---------------------
 .../governance/core/registry/UserNode.java         |  40 +++
 .../governance/core/registry/cache/CacheNode.java  |  41 +++
 .../registry/{ => cache}/RegistryCacheManager.java |   6 +-
 .../ScalingRegistrySubscriber.java                 |  20 +-
 .../listener/impl/DataSourceChangedListener.java   |  11 +-
 .../impl/DataSourceStateChangedListener.java       |  15 +-
 .../listener/impl/GlobalRuleChangedListener.java   |   4 +-
 .../listener/impl/MetaDataChangedListener.java     |  14 +-
 .../listener/impl/PropertiesChangedListener.java   |   6 +-
 .../listener/impl/RuleChangedListener.java         |  14 +-
 .../listener/impl/SchemaChangedListener.java       |   8 +-
 .../impl/TerminalStateChangedListener.java         |   6 +-
 .../config/impl/DataSourceRegistryService.java     |  11 +-
 .../config/impl/GlobalRuleRegistryService.java     |  27 +-
 .../config/impl/PropertiesRegistryService.java     |  10 +-
 .../config/impl/SchemaRuleRegistryService.java     |  12 +-
 .../registry/service/config/node/GlobalNode.java   |  51 +++
 .../service/config/node/SchemaMetadataNode.java    | 155 ++++++++
 .../core/registry/service/process/ProcessNode.java |  50 +++
 .../service/process/ProcessRegistrySubscriber.java |  14 +-
 .../service/schema/SchemaRegistryService.java      |  24 +-
 .../state/DataSourceStatusRegistryService.java     |  12 +-
 .../service/state/LockRegistryService.java         |   6 +-
 .../core/registry/service/state/StatesNode.java    | 185 ++++++++++
 .../core/registry/util/SchemaNameUtil.java         |  45 +++
 .../core/facade/GovernanceFacadeTest.java          |   2 +-
 .../core/registry/RegistryCenterNodeTest.java      | 134 -------
 .../core/registry/RegistryCenterTest.java          |   2 +-
 .../governance/core/registry/UserNodeTest.java     |  31 ++
 .../ScalingRegistrySubscriberTest.java             |   3 +-
 .../service/config/node/GlobalNodeTest.java        |  36 ++
 .../config/node/SchemaMetadataNodeTest.java        |  61 ++++
 .../state/DataSourceStatusRegistryServiceTest.java |   5 +-
 .../registry/service/state/StatesNodeTest.java     |  84 +++++
 .../impl/GovernanceBootstrapInitializerTest.java   |  15 +-
 40 files changed, 899 insertions(+), 683 deletions(-)

diff --git 
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/listener/PrivilegeNodeChangedListener.java
 
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/listener/PrivilegeNodeChangedListener.java
index 951d4f4..c21a9d3 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/listener/PrivilegeNodeChangedListener.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/listener/PrivilegeNodeChangedListener.java
@@ -18,9 +18,9 @@
 package org.apache.shardingsphere.governance.context.authority.listener;
 
 import 
org.apache.shardingsphere.governance.context.authority.listener.event.AuthorityChangedEvent;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.listener.PostGovernanceRepositoryEventListener;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.GovernanceEvent;
+import 
org.apache.shardingsphere.governance.core.registry.service.state.StatesNode;
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import 
org.apache.shardingsphere.infra.metadata.user.yaml.config.YamlUsersConfigurationConverter;
@@ -36,7 +36,7 @@ import java.util.Optional;
 public final class PrivilegeNodeChangedListener extends 
PostGovernanceRepositoryEventListener<GovernanceEvent> {
     
     public PrivilegeNodeChangedListener(final RegistryCenterRepository 
registryCenterRepository) {
-        super(registryCenterRepository, Collections.singletonList(new 
RegistryCenterNode().getPrivilegeNodePath()));
+        super(registryCenterRepository, 
Collections.singletonList(StatesNode.getPrivilegeNodePath()));
     }
     
     @Override
diff --git 
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/listener/UserChangedListener.java
 
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/listener/UserChangedListener.java
index 6054d84..60dd435 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/listener/UserChangedListener.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/authority/listener/UserChangedListener.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.governance.context.authority.listener;
 
 import 
org.apache.shardingsphere.governance.context.authority.listener.event.AuthorityChangedEvent;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
+import org.apache.shardingsphere.governance.core.registry.UserNode;
 import 
org.apache.shardingsphere.governance.core.registry.listener.PostGovernanceRepositoryEventListener;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.GovernanceEvent;
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent;
@@ -36,7 +36,7 @@ import java.util.Optional;
 public final class UserChangedListener extends 
PostGovernanceRepositoryEventListener<GovernanceEvent> {
     
     public UserChangedListener(final RegistryCenterRepository 
registryCenterRepository) {
-        super(registryCenterRepository, Collections.singletonList(new 
RegistryCenterNode().getUsersNode()));
+        super(registryCenterRepository, 
Collections.singletonList(UserNode.getRootNode()));
     }
     
     @Override
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/facade/GovernanceFacade.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/facade/GovernanceFacade.java
index 76dbce6..271c58e 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/facade/GovernanceFacade.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/facade/GovernanceFacade.java
@@ -78,7 +78,7 @@ public final class GovernanceFacade implements AutoCloseable {
      */
     public void onlineInstance() {
         registryCenter.registerInstanceOnline();
-        registryCenter.initNodes();
+        registryCenter.initStateNodes();
         listenerManager.initListeners();
     }
     
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCenter.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCenter.java
index d682323..7b46a57 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCenter.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCenter.java
@@ -25,11 +25,13 @@ import 
org.apache.shardingsphere.governance.core.registry.service.config.impl.Da
 import 
org.apache.shardingsphere.governance.core.registry.service.config.impl.GlobalRuleRegistryService;
 import 
org.apache.shardingsphere.governance.core.registry.service.config.impl.PropertiesRegistryService;
 import 
org.apache.shardingsphere.governance.core.registry.service.config.impl.SchemaRuleRegistryService;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.SchemaMetadataNode;
 import 
org.apache.shardingsphere.governance.core.registry.service.process.ProcessRegistrySubscriber;
-import 
org.apache.shardingsphere.governance.core.registry.service.scaling.ScalingRegistrySubscriber;
+import 
org.apache.shardingsphere.governance.core.registry.cache.ScalingRegistrySubscriber;
 import 
org.apache.shardingsphere.governance.core.registry.service.schema.SchemaRegistryService;
 import 
org.apache.shardingsphere.governance.core.registry.service.state.DataSourceStatusRegistryService;
 import 
org.apache.shardingsphere.governance.core.registry.service.state.LockRegistryService;
+import 
org.apache.shardingsphere.governance.core.registry.service.state.StatesNode;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.config.datasource.DataSourceConfiguration;
@@ -50,8 +52,6 @@ public final class RegistryCenter {
     
     private final RegistryCenterRepository repository;
     
-    private final RegistryCenterNode node;
-    
     @Getter
     private final DataSourceRegistryService dataSourceService;
     
@@ -76,7 +76,6 @@ public final class RegistryCenter {
     public RegistryCenter(final RegistryCenterRepository repository) {
         instanceId = GovernanceInstance.getInstance().getId();
         this.repository = repository;
-        node = new RegistryCenterNode();
         dataSourceService = new DataSourceRegistryService(repository);
         schemaRuleService = new SchemaRuleRegistryService(repository);
         globalRuleService = new GlobalRuleRegistryService(repository);
@@ -90,11 +89,11 @@ public final class RegistryCenter {
     }
     
     /**
-     * Initialize nodes.
+     * Initialize state nodes.
      */
-    public void initNodes() {
-        repository.persist(node.getDataNodesPath(), "");
-        repository.persist(node.getPrimaryNodesPath(), "");
+    public void initStateNodes() {
+        repository.persist(StatesNode.getDataNodesPath(), "");
+        repository.persist(StatesNode.getPrimaryNodesPath(), "");
     }
     
     /**
@@ -120,9 +119,9 @@ public final class RegistryCenter {
     }
     
     private void persistSchemaName(final String schemaName) {
-        String schemaNamesStr = repository.get(node.getMetadataNodePath());
+        String schemaNamesStr = 
repository.get(SchemaMetadataNode.getMetadataNodePath());
         if (Strings.isNullOrEmpty(schemaNamesStr)) {
-            repository.persist(node.getMetadataNodePath(), schemaName);
+            repository.persist(SchemaMetadataNode.getMetadataNodePath(), 
schemaName);
             return;
         }
         Collection<String> schemaNames = 
Splitter.on(",").splitToList(schemaNamesStr);
@@ -131,13 +130,13 @@ public final class RegistryCenter {
         }
         Collection<String> newSchemaNames = new ArrayList<>(schemaNames);
         newSchemaNames.add(schemaName);
-        repository.persist(node.getMetadataNodePath(), String.join(",", 
newSchemaNames));
+        repository.persist(SchemaMetadataNode.getMetadataNodePath(), 
String.join(",", newSchemaNames));
     }
     
     /**
      * Register instance online.
      */
     public void registerInstanceOnline() {
-        repository.persistEphemeral(node.getProxyNodePath(instanceId), "");
+        repository.persistEphemeral(StatesNode.getProxyNodePath(instanceId), 
"");
     }
 }
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterNode.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterNode.java
deleted file mode 100644
index 3dd24d3..0000000
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterNode.java
+++ /dev/null
@@ -1,389 +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.governance.core.registry;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import 
org.apache.shardingsphere.governance.core.registry.schema.GovernanceSchema;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Optional;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-/**
- * Registry center node.
- */
-public final class RegistryCenterNode {
-    
-    private static final String ROOT = "states";
-    
-    private static final String PROXY_NODES_NAME = "proxynodes";
-    
-    private static final String DATA_NODES_NAME = "datanodes";
-    
-    private static final String PRIMARY_NODES_NAME = "primarynodes";
-    
-    private static final String EXECUTION_NODES_NAME = "executionnodes";
-    
-    private static final String METADATA_NODE = "metadata";
-    
-    private static final String DATA_SOURCES_NODE = "dataSources";
-    
-    private static final String RULES_NODE = "rules";
-    
-    private static final String SCHEMA_NODE = "schema";
-    
-    private static final String USERS_NODE = "users";
-
-    private static final String GLOBAL_RULE_NODE = "rules";
-
-    private static final String PRIVILEGE_NODE = "privilegenode";
-    
-    private static final String PROPS_NODE = "props";
-    
-    private static final String COMMA_SEPARATOR = ",";
-    
-    private static final String PATH_SEPARATOR = "/";
-    
-    private static final String CACHE_NODE = "cache";
-    
-    /**
-     * Get proxy node path.
-     *
-     * @param instanceId instance id
-     * @return proxy node path
-     */
-    public String getProxyNodePath(final String instanceId) {
-        return Joiner.on("/").join("", ROOT, PROXY_NODES_NAME, instanceId);
-    }
-    
-    /**
-     * Get data nodes path.
-     *
-     * @return data nodes path
-     */
-    public String getDataNodesPath() {
-        return Joiner.on("/").join("", ROOT, DATA_NODES_NAME);
-    }
-    
-    /**
-     * Get primary nodes path.
-     *
-     * @return primary nodes path
-     */
-    public String getPrimaryNodesPath() {
-        return Joiner.on("/").join("", ROOT, PRIMARY_NODES_NAME);
-    }
-    
-    /**
-     * Get schema path.
-     * 
-     * @param schemaName schema name
-     * @return schema path
-     */
-    public String getSchemaPath(final String schemaName) {
-        return Joiner.on("/").join("", ROOT, DATA_NODES_NAME, schemaName);
-    }
-    
-    /**
-     * Get primary nodes schema path.
-     *
-     * @param schemaName schema name
-     * @return schema path
-     */
-    public String getPrimaryNodesSchemaPath(final String schemaName) {
-        return Joiner.on("/").join("", ROOT, PRIMARY_NODES_NAME, schemaName);
-    }
-    
-    /**
-     * Get data source path.
-     * 
-     * @param schemaName schema name
-     * @param dataSourceName data source name
-     * @return data source path
-     */
-    public String getDataSourcePath(final String schemaName, final String 
dataSourceName) {
-        return Joiner.on("/").join("", ROOT, DATA_NODES_NAME, schemaName, 
dataSourceName);
-    }
-    
-    /**
-     * Get metadata data source path.
-     *
-     * @param schemaName schema name
-     * @return data source path
-     */
-    public String getMetadataDataSourcePath(final String schemaName) {
-        return getFullMetadataPath(schemaName, DATA_SOURCES_NODE);
-    }
-    
-    /**
-     * Get primary data source path.
-     *
-     * @param schemaName schema name
-     * @param groupName group name
-     * @return data source path
-     */
-    public String getPrimaryDataSourcePath(final String schemaName, final 
String groupName) {
-        return Joiner.on("/").join("", ROOT, PRIMARY_NODES_NAME, schemaName, 
groupName);
-    }
-    
-    /**
-     * Get governance schema.
-     *
-     * @param dataSourceNodeFullPath data source node full path
-     * @return governance schema
-     */
-    public Optional<GovernanceSchema> getGovernanceSchema(final String 
dataSourceNodeFullPath) {
-        Pattern pattern = Pattern.compile(getDataNodesPath() + "/" + 
"(\\w+)/(\\S+)$", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(dataSourceNodeFullPath);
-        return matcher.find() ? Optional.of(new 
GovernanceSchema(matcher.group(1), matcher.group(2))) : Optional.empty();
-    }
-    
-    /**
-     * Get primary nodes governance schema.
-     *
-     * @param dataSourceNodeFullPath data source node full path
-     * @return primary nodes governance schema
-     */
-    public Optional<GovernanceSchema> getPrimaryNodesGovernanceSchema(final 
String dataSourceNodeFullPath) {
-        Pattern pattern = Pattern.compile(getPrimaryNodesPath() + "/" + 
"(\\w+)/(\\w+)$", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(dataSourceNodeFullPath);
-        return matcher.find() ? Optional.of(new 
GovernanceSchema(matcher.group(1), matcher.group(2))) : Optional.empty();
-    }
-    
-    /**
-     * Is primary data source path.
-     *
-     * @param dataSourceNodeFullPath data source node full path
-     * @return is primary data source path
-     */
-    public boolean isPrimaryDataSourcePath(final String 
dataSourceNodeFullPath) {
-        Pattern pattern = Pattern.compile(getPrimaryNodesPath() + "/" + 
"(\\w+)/(\\w+)$", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(dataSourceNodeFullPath);
-        return matcher.find();
-    }
-    
-    /**
-     * Get all schema path.
-     * 
-     * @param schemaNames collection of schema name
-     * @return collection of schema path
-     */
-    public Collection<String> getAllSchemaPaths(final Collection<String> 
schemaNames) {
-        Collection<String> result = new ArrayList<>(schemaNames.size());
-        for (String schemaName : schemaNames) {
-            result.add(getSchemaPath(schemaName));
-            result.add(getPrimaryNodesSchemaPath(schemaName));
-        }
-        return result;
-    }
-    
-    /**
-     * Get proxy nodes path.
-     *
-     * @return proxy nodes path
-     */
-    public String getProxyNodesPath() {
-        return Joiner.on("/").join("", ROOT, PROXY_NODES_NAME);
-    }
-    
-    /**
-     * Get metadata node path.
-     *
-     * @return metadata node path
-     */
-    public String getMetadataNodePath() {
-        return Joiner.on(PATH_SEPARATOR).join("", METADATA_NODE);
-    }
-    
-    /**
-     * Get schema name path.
-     *
-     * @param schemaName schema name
-     * @return schema name path
-     */
-    public String getSchemaNamePath(final String schemaName) {
-        return Joiner.on(PATH_SEPARATOR).join("", METADATA_NODE, schemaName);
-    }
-    
-    /**
-     * Get rule path.
-     *
-     * @param schemaName schema name
-     * @return rule path
-     */
-    public String getRulePath(final String schemaName) {
-        return getFullMetadataPath(schemaName, RULES_NODE);
-    }
-    
-    /**
-     * Get metadata schema path.
-     *
-     * @param schemaName schema name
-     * @return schema path
-     */
-    public String getMetadataSchemaPath(final String schemaName) {
-        return getFullMetadataPath(schemaName, SCHEMA_NODE);
-    }
-
-    /**
-     * Get users path.
-     *
-     * @return users path
-     */
-    public String getUsersNode() {
-        return getFullPath(USERS_NODE);
-    }
-    
-    /**
-     * Get global rule node path.
-     *
-     * @return global rule node path
-     */
-    public String getGlobalRuleNode() {
-        return getFullPath(GLOBAL_RULE_NODE);
-    }
-    
-    /**
-     * Get privilege node path.
-     *
-     * @return privilege node path
-     */
-    public String getPrivilegeNodePath() {
-        return Joiner.on(PATH_SEPARATOR).join("", ROOT, PRIVILEGE_NODE);
-    }
-    
-    /**
-     * Get properties path.
-     *
-     * @return properties path
-     */
-    public String getPropsPath() {
-        return getFullPath(PROPS_NODE);
-    }
-    
-    private String getFullMetadataPath(final String schemaName, final String 
node) {
-        return Joiner.on(PATH_SEPARATOR).join("", METADATA_NODE, schemaName, 
node);
-    }
-    
-    private String getFullPath(final String node) {
-        return Joiner.on(PATH_SEPARATOR).join("", node);
-    }
-    
-    /**
-     * Get schema name.
-     *
-     * @param configurationNodeFullPath configuration node full path
-     * @return schema name
-     */
-    public String getSchemaName(final String configurationNodeFullPath) {
-        Pattern pattern = Pattern.compile(getMetadataNodePath() + "/(\\w+)" + 
"(/datasource|/rule)?", Pattern.CASE_INSENSITIVE);
-        Matcher matcher = pattern.matcher(configurationNodeFullPath);
-        return matcher.find() ? matcher.group(1) : "";
-    }
-    
-    /**
-     * Split schema name.
-     *
-     * @param schemaNames schema names
-     * @return schema names
-     */
-    public Collection<String> splitSchemaName(final String schemaNames) {
-        return Strings.isNullOrEmpty(schemaNames) ? Collections.emptyList() : 
Splitter.on(COMMA_SEPARATOR).splitToList(schemaNames);
-    }
-    
-    /**
-     * Get all schema config paths.
-     *
-     * @param schemaNames schema names
-     * @return config paths list
-     */
-    public Collection<String> getAllSchemaConfigPaths(final Collection<String> 
schemaNames) {
-        Collection<String> result = new 
ArrayList<>(Collections.singleton(getMetadataNodePath()));
-        for (String schemaName : schemaNames) {
-            result.add(getRulePath(schemaName));
-            result.add(getMetadataDataSourcePath(schemaName));
-            result.add(getMetadataSchemaPath(schemaName));
-        }
-        return result;
-    }
-    
-    /**
-     * Get cache path.
-     *
-     * @param path path
-     * @return cache path
-     */
-    public String getCachePath(final String path) {
-        return Joiner.on(PATH_SEPARATOR).join(path, CACHE_NODE);
-    }
-    
-    /**
-     * Get all metadata schema paths.
-     *
-     * @param schemaNames schema names
-     * @return list of schema path
-     */
-    public Collection<String> getAllMetadataSchemaPaths(final 
Collection<String> schemaNames) {
-        return 
schemaNames.stream().map(this::getMetadataSchemaPath).collect(Collectors.toList());
-    }
-    
-    /**
-     * Get all rule paths.
-     *
-     * @param schemaNames schema names
-     * @return list of rule path
-     */
-    public Collection<String> getAllRulePaths(final Collection<String> 
schemaNames) {
-        return 
schemaNames.stream().map(this::getRulePath).collect(Collectors.toList());
-    }
-    
-    /**
-     * Get all data source paths.
-     *
-     * @param schemaNames schema names
-     * @return list of data source path
-     */
-    public Collection<String> getAllDataSourcePaths(final Collection<String> 
schemaNames) {
-        return 
schemaNames.stream().map(this::getMetadataDataSourcePath).collect(Collectors.toList());
-    }
-    
-    /**
-     * Get execution nodes path.
-     *
-     * @return execution nodes path
-     */
-    public String getExecutionNodesPath() {
-        return Joiner.on("/").join("", EXECUTION_NODES_NAME);
-    }
-    
-    /**
-     * Get execution path.
-     *
-     * @param executionId execution id
-     * @return execution path
-     */
-    public String getExecutionPath(final String executionId) {
-        return Joiner.on("/").join("", EXECUTION_NODES_NAME, executionId);
-    }
-}
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/UserNode.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/UserNode.java
new file mode 100644
index 0000000..10456da
--- /dev/null
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/UserNode.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.governance.core.registry;
+
+import com.google.common.base.Joiner;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+/**
+ * User node.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class UserNode {
+    
+    private static final String ROOT_NODE = "users";
+    
+    /**
+     * Get users path.
+     *
+     * @return users path
+     */
+    public static String getRootNode() {
+        return Joiner.on("/").join("", ROOT_NODE);
+    }
+}
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/cache/CacheNode.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/cache/CacheNode.java
new file mode 100644
index 0000000..1da73e9
--- /dev/null
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/cache/CacheNode.java
@@ -0,0 +1,41 @@
+/*
+ * 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.governance.core.registry.cache;
+
+import com.google.common.base.Joiner;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+/**
+ * Cache node.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class CacheNode {
+    
+    private static final String CACHE_NODE = "cache";
+    
+    /**
+     * Get cache path.
+     *
+     * @param path path
+     * @return cache path
+     */
+    public static String getCachePath(final String path) {
+        return Joiner.on("/").join(path, CACHE_NODE);
+    }
+}
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCacheManager.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/cache/RegistryCacheManager.java
similarity index 92%
rename from 
shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCacheManager.java
rename to 
shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/cache/RegistryCacheManager.java
index a170c7b..c1bdadb 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/RegistryCacheManager.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/cache/RegistryCacheManager.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.governance.core.registry;
+package org.apache.shardingsphere.governance.core.registry.cache;
 
 import com.google.common.base.Joiner;
 import lombok.RequiredArgsConstructor;
@@ -33,8 +33,6 @@ public final class RegistryCacheManager {
     
     private final RegistryCenterRepository repository;
     
-    private final RegistryCenterNode node;
-    
     /**
      * Cache configuration.
      * 
@@ -74,6 +72,6 @@ public final class RegistryCacheManager {
     }
     
     private String getCachePath(final String path, final String cacheId) {
-        return Joiner.on(PATH_SEPARATOR).join(node.getCachePath(path), 
cacheId);
+        return Joiner.on(PATH_SEPARATOR).join(CacheNode.getCachePath(path), 
cacheId);
     }
 }
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/scaling/ScalingRegistrySubscriber.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/cache/ScalingRegistrySubscriber.java
similarity index 81%
rename from 
shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/scaling/ScalingRegistrySubscriber.java
rename to 
shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/cache/ScalingRegistrySubscriber.java
index 157cb0a..3dfcfd1 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/scaling/ScalingRegistrySubscriber.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/cache/ScalingRegistrySubscriber.java
@@ -15,15 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.governance.core.registry.service.scaling;
+package org.apache.shardingsphere.governance.core.registry.cache;
 
 import com.google.common.eventbus.Subscribe;
-import org.apache.shardingsphere.governance.core.registry.RegistryCacheManager;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.rule.RuleConfigurationCachedEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.rule.SwitchRuleConfigurationEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.scaling.StartScalingEvent;
 import 
org.apache.shardingsphere.governance.core.registry.service.config.impl.SchemaRuleRegistryService;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.SchemaMetadataNode;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
@@ -40,17 +39,14 @@ public final class ScalingRegistrySubscriber {
     
     private final RegistryCenterRepository repository;
     
-    private final RegistryCenterNode node;
-    
     private final SchemaRuleRegistryService schemaRuleService;
     
     private final RegistryCacheManager registryCacheManager;
     
     public ScalingRegistrySubscriber(final RegistryCenterRepository 
repository, final SchemaRuleRegistryService schemaRuleService) {
         this.repository = repository;
-        node = new RegistryCenterNode();
         this.schemaRuleService = schemaRuleService;
-        registryCacheManager = new RegistryCacheManager(repository, node);
+        registryCacheManager = new RegistryCacheManager(repository);
         ShardingSphereEventBus.getInstance().register(this);
     }
     
@@ -62,13 +58,13 @@ public final class ScalingRegistrySubscriber {
     @Subscribe
     public void switchRuleConfiguration(final SwitchRuleConfigurationEvent 
event) {
         schemaRuleService.persist(event.getSchemaName(), 
loadCachedRuleConfigurations(event.getSchemaName(), 
event.getRuleConfigurationCacheId()));
-        
registryCacheManager.deleteCache(node.getRulePath(event.getSchemaName()), 
event.getRuleConfigurationCacheId());
+        
registryCacheManager.deleteCache(SchemaMetadataNode.getRulePath(event.getSchemaName()),
 event.getRuleConfigurationCacheId());
     }
     
     @SuppressWarnings("unchecked")
     private Collection<RuleConfiguration> loadCachedRuleConfigurations(final 
String schemaName, final String ruleConfigCacheId) {
         return new 
YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(
-                
YamlEngine.unmarshal(registryCacheManager.loadCache(node.getRulePath(schemaName),
 ruleConfigCacheId), Collection.class));
+                
YamlEngine.unmarshal(registryCacheManager.loadCache(SchemaMetadataNode.getRulePath(schemaName),
 ruleConfigCacheId), Collection.class));
     }
     
     /**
@@ -79,9 +75,9 @@ public final class ScalingRegistrySubscriber {
     @Subscribe
     public void cacheRuleConfiguration(final RuleConfigurationCachedEvent 
event) {
         StartScalingEvent startScalingEvent = new 
StartScalingEvent(event.getSchemaName(),
-                
repository.get(node.getMetadataDataSourcePath(event.getSchemaName())),
-                repository.get(node.getRulePath(event.getSchemaName())),
-                
registryCacheManager.loadCache(node.getRulePath(event.getSchemaName()), 
event.getCacheId()), event.getCacheId());
+                
repository.get(SchemaMetadataNode.getMetadataDataSourcePath(event.getSchemaName())),
+                
repository.get(SchemaMetadataNode.getRulePath(event.getSchemaName())),
+                
registryCacheManager.loadCache(SchemaMetadataNode.getRulePath(event.getSchemaName()),
 event.getCacheId()), event.getCacheId());
         ShardingSphereEventBus.getInstance().post(startScalingEvent);
     }
 }
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/DataSourceChangedListener.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/DataSourceChangedListener.java
index 828b784..884b5b6 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/DataSourceChangedListener.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/DataSourceChangedListener.java
@@ -18,10 +18,10 @@
 package org.apache.shardingsphere.governance.core.registry.listener.impl;
 
 import com.google.common.base.Strings;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.listener.PostGovernanceRepositoryEventListener;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.GovernanceEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.datasource.DataSourceChangedEvent;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.SchemaMetadataNode;
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
@@ -40,16 +40,13 @@ import java.util.stream.Collectors;
  */
 public final class DataSourceChangedListener extends 
PostGovernanceRepositoryEventListener<GovernanceEvent> {
     
-    private final RegistryCenterNode registryCenterNode;
-    
     public DataSourceChangedListener(final RegistryCenterRepository 
registryCenterRepository, final Collection<String> schemaNames) {
-        super(registryCenterRepository, new 
RegistryCenterNode().getAllDataSourcePaths(schemaNames));
-        registryCenterNode = new RegistryCenterNode();
+        super(registryCenterRepository, 
SchemaMetadataNode.getAllDataSourcePaths(schemaNames));
     }
     
     @Override
     protected Optional<GovernanceEvent> createEvent(final DataChangedEvent 
event) {
-        String schemaName = new 
RegistryCenterNode().getSchemaName(event.getKey());
+        String schemaName = SchemaMetadataNode.getSchemaName(event.getKey());
         if (Strings.isNullOrEmpty(schemaName) || 
!isDataSourceChangedEvent(schemaName, event.getKey()) 
                 || Strings.isNullOrEmpty(event.getValue())) {
             return Optional.empty();
@@ -58,7 +55,7 @@ public final class DataSourceChangedListener extends 
PostGovernanceRepositoryEve
     }
     
     private boolean isDataSourceChangedEvent(final String schemaName, final 
String eventPath) {
-        return 
registryCenterNode.getMetadataDataSourcePath(schemaName).equals(eventPath);
+        return 
SchemaMetadataNode.getMetadataDataSourcePath(schemaName).equals(eventPath);
     }
     
     @SuppressWarnings("unchecked")
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/DataSourceStateChangedListener.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/DataSourceStateChangedListener.java
index 47149c4..df4a592 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/DataSourceStateChangedListener.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/DataSourceStateChangedListener.java
@@ -17,15 +17,15 @@
 
 package org.apache.shardingsphere.governance.core.registry.listener.impl;
 
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.RegistryCenterNodeStatus;
 import 
org.apache.shardingsphere.governance.core.registry.listener.PostGovernanceRepositoryEventListener;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.GovernanceEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.readwritesplitting.DisabledStateChangedEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.readwritesplitting.PrimaryStateChangedEvent;
-import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
+import 
org.apache.shardingsphere.governance.core.registry.service.state.StatesNode;
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent;
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent.Type;
+import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 
 import java.util.Collection;
 import java.util.Optional;
@@ -35,19 +35,16 @@ import java.util.Optional;
  */
 public final class DataSourceStateChangedListener extends 
PostGovernanceRepositoryEventListener<GovernanceEvent> {
     
-    private final RegistryCenterNode registryCenterNode;
-    
     public DataSourceStateChangedListener(final RegistryCenterRepository 
registryCenterRepository, final Collection<String> schemaNames) {
-        super(registryCenterRepository, new 
RegistryCenterNode().getAllSchemaPaths(schemaNames));
-        registryCenterNode = new RegistryCenterNode();
+        super(registryCenterRepository, 
StatesNode.getAllSchemaPaths(schemaNames));
     }
     
     @Override
     protected Optional<GovernanceEvent> createEvent(final DataChangedEvent 
event) {
-        if (registryCenterNode.isPrimaryDataSourcePath(event.getKey())) {
-            return 
registryCenterNode.getPrimaryNodesGovernanceSchema(event.getKey()).map(schema 
-> new PrimaryStateChangedEvent(schema, event.getValue()));
+        if (StatesNode.isPrimaryDataSourcePath(event.getKey())) {
+            return 
StatesNode.getPrimaryNodesGovernanceSchema(event.getKey()).map(schema -> new 
PrimaryStateChangedEvent(schema, event.getValue()));
         }
-        return 
registryCenterNode.getGovernanceSchema(event.getKey()).map(schema -> new 
DisabledStateChangedEvent(schema, isDataSourceDisabled(event)));
+        return StatesNode.getGovernanceSchema(event.getKey()).map(schema -> 
new DisabledStateChangedEvent(schema, isDataSourceDisabled(event)));
     }
     
     private boolean isDataSourceDisabled(final DataChangedEvent event) {
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/GlobalRuleChangedListener.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/GlobalRuleChangedListener.java
index 69176da..2339aef 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/GlobalRuleChangedListener.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/GlobalRuleChangedListener.java
@@ -18,10 +18,10 @@
 package org.apache.shardingsphere.governance.core.registry.listener.impl;
 
 import com.google.common.base.Preconditions;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.listener.PostGovernanceRepositoryEventListener;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.GovernanceEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.rule.GlobalRuleConfigurationsChangedEvent;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.GlobalNode;
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
@@ -39,7 +39,7 @@ import java.util.Optional;
 public final class GlobalRuleChangedListener extends 
PostGovernanceRepositoryEventListener<GovernanceEvent> {
     
     public GlobalRuleChangedListener(final RegistryCenterRepository 
registryCenterRepository) {
-        super(registryCenterRepository, Collections.singleton(new 
RegistryCenterNode().getGlobalRuleNode()));
+        super(registryCenterRepository, 
Collections.singleton(GlobalNode.getGlobalRuleNode()));
     }
     
     @Override
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/MetaDataChangedListener.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/MetaDataChangedListener.java
index 18b7c95..18b5e7d 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/MetaDataChangedListener.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/MetaDataChangedListener.java
@@ -18,13 +18,14 @@
 package org.apache.shardingsphere.governance.core.registry.listener.impl;
 
 import org.apache.commons.collections4.SetUtils;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.listener.PostGovernanceRepositoryEventListener;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.GovernanceEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.metadata.MetaDataDeletedEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.metadata.MetaDataPersistedEvent;
-import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.SchemaMetadataNode;
+import org.apache.shardingsphere.governance.core.registry.util.SchemaNameUtil;
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent;
+import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -40,18 +41,15 @@ public final class MetaDataChangedListener extends 
PostGovernanceRepositoryEvent
     
     private final Collection<String> existedSchemaNames;
     
-    private final RegistryCenterNode registryCenterNode;
-    
     public MetaDataChangedListener(final RegistryCenterRepository 
registryCenterRepository, final Collection<String> schemaNames) {
-        super(registryCenterRepository, Collections.singleton(new 
RegistryCenterNode().getMetadataNodePath()));
-        registryCenterNode = new RegistryCenterNode();
+        super(registryCenterRepository, 
Collections.singleton(SchemaMetadataNode.getMetadataNodePath()));
         existedSchemaNames = new LinkedHashSet<>(schemaNames);
     }
     
     @Override
     protected Optional<GovernanceEvent> createEvent(final DataChangedEvent 
event) {
-        if (registryCenterNode.getMetadataNodePath().equals(event.getKey())) {
-            Collection<String> persistedSchemaNames = 
registryCenterNode.splitSchemaName(event.getValue());
+        if (SchemaMetadataNode.getMetadataNodePath().equals(event.getKey())) {
+            Collection<String> persistedSchemaNames = 
SchemaNameUtil.splitSchemaName(event.getValue());
             Set<String> addedSchemaNames = SetUtils.difference(new 
HashSet<>(persistedSchemaNames), new HashSet<>(existedSchemaNames));
             if (!addedSchemaNames.isEmpty()) {
                 // TODO support multiple schemaNames
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/PropertiesChangedListener.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/PropertiesChangedListener.java
index eae7e91..358ea30 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/PropertiesChangedListener.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/PropertiesChangedListener.java
@@ -17,12 +17,12 @@
 
 package org.apache.shardingsphere.governance.core.registry.listener.impl;
 
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.listener.PostGovernanceRepositoryEventListener;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.GovernanceEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.props.PropertiesChangedEvent;
-import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.GlobalNode;
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent;
+import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 
 import java.util.Collections;
@@ -35,7 +35,7 @@ import java.util.Properties;
 public final class PropertiesChangedListener extends 
PostGovernanceRepositoryEventListener<GovernanceEvent> {
     
     public PropertiesChangedListener(final RegistryCenterRepository 
registryCenterRepository) {
-        super(registryCenterRepository, Collections.singletonList(new 
RegistryCenterNode().getPropsPath()));
+        super(registryCenterRepository, 
Collections.singletonList(GlobalNode.getPropsPath()));
     }
     
     @Override
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/RuleChangedListener.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/RuleChangedListener.java
index 6652804..055c3e6 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/RuleChangedListener.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/RuleChangedListener.java
@@ -19,11 +19,12 @@ package 
org.apache.shardingsphere.governance.core.registry.listener.impl;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.listener.PostGovernanceRepositoryEventListener;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.GovernanceEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.rule.RuleConfigurationCachedEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.rule.RuleConfigurationsChangedEvent;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.SchemaMetadataNode;
+import org.apache.shardingsphere.governance.core.registry.cache.CacheNode;
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
@@ -39,16 +40,13 @@ import java.util.Optional;
  */
 public final class RuleChangedListener extends 
PostGovernanceRepositoryEventListener<GovernanceEvent> {
     
-    private final RegistryCenterNode registryCenterNode;
-    
     public RuleChangedListener(final RegistryCenterRepository 
registryCenterRepository, final Collection<String> schemaNames) {
-        super(registryCenterRepository, new 
RegistryCenterNode().getAllRulePaths(schemaNames));
-        registryCenterNode = new RegistryCenterNode();
+        super(registryCenterRepository, 
SchemaMetadataNode.getAllRulePaths(schemaNames));
     }
     
     @Override
     protected Optional<GovernanceEvent> createEvent(final DataChangedEvent 
event) {
-        String schemaName = registryCenterNode.getSchemaName(event.getKey());
+        String schemaName = SchemaMetadataNode.getSchemaName(event.getKey());
         if (Strings.isNullOrEmpty(schemaName) || 
Strings.isNullOrEmpty(event.getValue())) {
             return Optional.empty();
         }
@@ -61,12 +59,12 @@ public final class RuleChangedListener extends 
PostGovernanceRepositoryEventList
     }
     
     private boolean isRuleChangedEvent(final String schemaName, final String 
eventPath) {
-        String rulePath = registryCenterNode.getRulePath(schemaName);
+        String rulePath = SchemaMetadataNode.getRulePath(schemaName);
         return rulePath.equals(eventPath);
     }
     
     private boolean isRuleCachedEvent(final String schemaName, final String 
key) {
-        String ruleCachePath = 
registryCenterNode.getCachePath(registryCenterNode.getRulePath(schemaName));
+        String ruleCachePath = 
CacheNode.getCachePath(SchemaMetadataNode.getRulePath(schemaName));
         return ruleCachePath.equals(key);
     }
     
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/SchemaChangedListener.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/SchemaChangedListener.java
index 6ac0c72..f90cc50 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/SchemaChangedListener.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/SchemaChangedListener.java
@@ -17,14 +17,14 @@
 
 package org.apache.shardingsphere.governance.core.registry.listener.impl;
 
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.listener.PostGovernanceRepositoryEventListener;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.GovernanceEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.schema.SchemaChangedEvent;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.SchemaMetadataNode;
 import org.apache.shardingsphere.governance.core.yaml.schema.pojo.YamlSchema;
 import 
org.apache.shardingsphere.governance.core.yaml.schema.swapper.SchemaYamlSwapper;
-import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent;
+import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 
 import java.util.Collection;
@@ -36,12 +36,12 @@ import java.util.Optional;
 public final class SchemaChangedListener extends 
PostGovernanceRepositoryEventListener<GovernanceEvent> {
     
     public SchemaChangedListener(final RegistryCenterRepository 
registryCenterRepository, final Collection<String> schemaNames) {
-        super(registryCenterRepository, new 
RegistryCenterNode().getAllMetadataSchemaPaths(schemaNames));
+        super(registryCenterRepository, 
SchemaMetadataNode.getAllMetadataSchemaPaths(schemaNames));
     }
     
     @Override
     protected Optional<GovernanceEvent> createEvent(final DataChangedEvent 
event) {
-        String schemaName = new 
RegistryCenterNode().getSchemaName(event.getKey());
+        String schemaName = SchemaMetadataNode.getSchemaName(event.getKey());
         return Optional.of(new SchemaChangedEvent(schemaName, new 
SchemaYamlSwapper().swapToObject(YamlEngine.unmarshal(event.getValue(), 
YamlSchema.class))));
     }
 }
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/TerminalStateChangedListener.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/TerminalStateChangedListener.java
index a392fc2..c9a51d1 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/TerminalStateChangedListener.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/listener/impl/TerminalStateChangedListener.java
@@ -17,12 +17,12 @@
 
 package org.apache.shardingsphere.governance.core.registry.listener.impl;
 
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.RegistryCenterNodeStatus;
 import 
org.apache.shardingsphere.governance.core.registry.instance.GovernanceInstance;
 import 
org.apache.shardingsphere.governance.core.registry.listener.PostGovernanceRepositoryEventListener;
-import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
+import 
org.apache.shardingsphere.governance.core.registry.service.state.StatesNode;
 import 
org.apache.shardingsphere.governance.repository.api.listener.DataChangedEvent;
+import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.state.StateEvent;
 import org.apache.shardingsphere.infra.state.StateType;
 
@@ -35,7 +35,7 @@ import java.util.Optional;
 public final class TerminalStateChangedListener extends 
PostGovernanceRepositoryEventListener<StateEvent> {
     
     public TerminalStateChangedListener(final RegistryCenterRepository 
registryCenterRepository) {
-        super(registryCenterRepository, Collections.singleton(new 
RegistryCenterNode().getProxyNodePath(GovernanceInstance.getInstance().getId())));
+        super(registryCenterRepository, 
Collections.singleton(StatesNode.getProxyNodePath(GovernanceInstance.getInstance().getId())));
     }
     
     @Override
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/DataSourceRegistryService.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/DataSourceRegistryService.java
index 36816ee..0970e81 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/DataSourceRegistryService.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/DataSourceRegistryService.java
@@ -19,10 +19,10 @@ package 
org.apache.shardingsphere.governance.core.registry.service.config.impl;
 
 import com.google.common.base.Strings;
 import com.google.common.eventbus.Subscribe;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.datasource.DataSourceAddedEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.datasource.DataSourceAlteredEvent;
 import 
org.apache.shardingsphere.governance.core.registry.service.config.SchemaBasedRegistryService;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.SchemaMetadataNode;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import 
org.apache.shardingsphere.infra.config.datasource.DataSourceConfiguration;
 import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
@@ -41,11 +41,8 @@ public final class DataSourceRegistryService implements 
SchemaBasedRegistryServi
     
     private final RegistryCenterRepository repository;
     
-    private final RegistryCenterNode node;
-    
     public DataSourceRegistryService(final RegistryCenterRepository 
repository) {
         this.repository = repository;
-        node = new RegistryCenterNode();
         ShardingSphereEventBus.getInstance().register(this);
     }
     
@@ -58,7 +55,7 @@ public final class DataSourceRegistryService implements 
SchemaBasedRegistryServi
     
     @Override
     public void persist(final String schemaName, final Map<String, 
DataSourceConfiguration> dataSourceConfigs) {
-        repository.persist(node.getMetadataDataSourcePath(schemaName), 
YamlEngine.marshal(swapYamlDataSourceConfiguration(dataSourceConfigs)));
+        
repository.persist(SchemaMetadataNode.getMetadataDataSourcePath(schemaName), 
YamlEngine.marshal(swapYamlDataSourceConfiguration(dataSourceConfigs)));
     }
     
     private Map<String, Map<String, Object>> 
swapYamlDataSourceConfiguration(final Map<String, DataSourceConfiguration> 
dataSourceConfigs) {
@@ -68,7 +65,7 @@ public final class DataSourceRegistryService implements 
SchemaBasedRegistryServi
     
     @Override
     public Map<String, DataSourceConfiguration> load(final String schemaName) {
-        return isExisted(schemaName) ? 
getDataSourceConfigurations(repository.get(node.getMetadataDataSourcePath(schemaName)))
 : new LinkedHashMap<>();
+        return isExisted(schemaName) ? 
getDataSourceConfigurations(repository.get(SchemaMetadataNode.getMetadataDataSourcePath(schemaName)))
 : new LinkedHashMap<>();
     }
     
     @SuppressWarnings("unchecked")
@@ -84,7 +81,7 @@ public final class DataSourceRegistryService implements 
SchemaBasedRegistryServi
     
     @Override
     public boolean isExisted(final String schemaName) {
-        return 
!Strings.isNullOrEmpty(repository.get(node.getMetadataDataSourcePath(schemaName)));
+        return 
!Strings.isNullOrEmpty(repository.get(SchemaMetadataNode.getMetadataDataSourcePath(schemaName)));
     }
     
     /**
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/GlobalRuleRegistryService.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/GlobalRuleRegistryService.java
index 263c420..5501034 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/GlobalRuleRegistryService.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/GlobalRuleRegistryService.java
@@ -21,8 +21,9 @@ import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.google.common.eventbus.Subscribe;
 import 
org.apache.shardingsphere.authority.api.config.AuthorityRuleConfiguration;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.service.config.GlobalRegistryService;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.GlobalNode;
+import 
org.apache.shardingsphere.governance.core.registry.service.state.StatesNode;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.metadata.mapper.event.dcl.impl.CreateUserStatementEvent;
@@ -45,17 +46,14 @@ public final class GlobalRuleRegistryService implements 
GlobalRegistryService<Co
     
     private final RegistryCenterRepository repository;
     
-    private final RegistryCenterNode node;
-    
     public GlobalRuleRegistryService(final RegistryCenterRepository 
repository) {
         this.repository = repository;
-        node = new RegistryCenterNode();
     }
     
     @Override
     public void persist(final Collection<RuleConfiguration> globalRuleConfigs, 
final boolean isOverwrite) {
         if (!globalRuleConfigs.isEmpty() && (isOverwrite || !isExisted())) {
-            repository.persist(node.getGlobalRuleNode(), 
YamlEngine.marshal(new 
YamlRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(globalRuleConfigs)));
+            repository.persist(GlobalNode.getGlobalRuleNode(), 
YamlEngine.marshal(new 
YamlRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(globalRuleConfigs)));
         }
     }
     
@@ -63,11 +61,12 @@ public final class GlobalRuleRegistryService implements 
GlobalRegistryService<Co
     @SuppressWarnings("unchecked")
     public Collection<RuleConfiguration> load() {
         return isExisted()
-                ? new 
YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(YamlEngine.unmarshal(repository.get(node.getGlobalRuleNode()),
 Collection.class)) : Collections.emptyList();
+                ? new 
YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(YamlEngine.unmarshal(repository.get(GlobalNode.getGlobalRuleNode()),
 Collection.class))
+                : Collections.emptyList();
     }
     
     private boolean isExisted() {
-        return 
!Strings.isNullOrEmpty(repository.get(node.getGlobalRuleNode()));
+        return 
!Strings.isNullOrEmpty(repository.get(GlobalNode.getGlobalRuleNode()));
     }
     
     
@@ -94,18 +93,18 @@ public final class GlobalRuleRegistryService implements 
GlobalRegistryService<Co
     @Subscribe
     public void update(final GrantStatementEvent event) {
         if (!event.getUsers().isEmpty()) {
-            repository.persist(node.getPrivilegeNodePath(), 
YamlEngine.marshal(YamlUsersConfigurationConverter.convertYamlUserConfigurations(event.getUsers())));
+            repository.persist(StatesNode.getPrivilegeNodePath(), 
YamlEngine.marshal(YamlUsersConfigurationConverter.convertYamlUserConfigurations(event.getUsers())));
         }
     }
     
-    private void refreshAuthorityRuleConfiguration(final 
AuthorityRuleConfiguration authRuleConfig, final Collection<ShardingSphereUser> 
createUsers) {
-        Collection<ShardingSphereUser> oldUsers = authRuleConfig.getUsers();
-        Collection<ShardingSphereUser> newUsers = oldUsers.isEmpty() ? 
createUsers : getChangedShardingSphereUsers(oldUsers, createUsers);
-        authRuleConfig.getUsers().removeAll(oldUsers);
-        authRuleConfig.getUsers().addAll(newUsers);
+    private void refreshAuthorityRuleConfiguration(final 
AuthorityRuleConfiguration authorityRuleConfig, final 
Collection<ShardingSphereUser> createdUsers) {
+        Collection<ShardingSphereUser> oldUsers = 
authorityRuleConfig.getUsers();
+        Collection<ShardingSphereUser> newUsers = oldUsers.isEmpty() ? 
createdUsers : getChangedUsers(oldUsers, createdUsers);
+        authorityRuleConfig.getUsers().removeAll(oldUsers);
+        authorityRuleConfig.getUsers().addAll(newUsers);
     }
     
-    private Collection<ShardingSphereUser> getChangedShardingSphereUsers(final 
Collection<ShardingSphereUser> oldUsers, final Collection<ShardingSphereUser> 
newUsers) {
+    private Collection<ShardingSphereUser> getChangedUsers(final 
Collection<ShardingSphereUser> oldUsers, final Collection<ShardingSphereUser> 
newUsers) {
         Collection<ShardingSphereUser> result = new LinkedList<>(oldUsers);
         ShardingSphereUsers shardingSphereUsers = new 
ShardingSphereUsers(oldUsers);
         for (ShardingSphereUser each : newUsers) {
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/PropertiesRegistryService.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/PropertiesRegistryService.java
index 8ee605d..97d47f7 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/PropertiesRegistryService.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/PropertiesRegistryService.java
@@ -19,8 +19,8 @@ package 
org.apache.shardingsphere.governance.core.registry.service.config.impl;
 
 import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.service.config.GlobalRegistryService;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.GlobalNode;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 
@@ -34,21 +34,19 @@ public final class PropertiesRegistryService implements 
GlobalRegistryService<Pr
     
     private final RegistryCenterRepository repository;
     
-    private final RegistryCenterNode node = new RegistryCenterNode();
-    
     @Override
     public void persist(final Properties props, final boolean isOverwrite) {
         if (!props.isEmpty() && (isOverwrite || !isExisted())) {
-            repository.persist(node.getPropsPath(), YamlEngine.marshal(props));
+            repository.persist(GlobalNode.getPropsPath(), 
YamlEngine.marshal(props));
         }
     }
     
     private boolean isExisted() {
-        return !Strings.isNullOrEmpty(repository.get(node.getPropsPath()));
+        return 
!Strings.isNullOrEmpty(repository.get(GlobalNode.getPropsPath()));
     }
     
     @Override
     public Properties load() {
-        return Strings.isNullOrEmpty(repository.get(node.getPropsPath())) ? 
new Properties() : YamlEngine.unmarshal(repository.get(node.getPropsPath()), 
Properties.class);
+        return 
Strings.isNullOrEmpty(repository.get(GlobalNode.getPropsPath())) ? new 
Properties() : YamlEngine.unmarshal(repository.get(GlobalNode.getPropsPath()), 
Properties.class);
     }
 }
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/SchemaRuleRegistryService.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/SchemaRuleRegistryService.java
index 9c8d4e1..8cae1d2 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/SchemaRuleRegistryService.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/impl/SchemaRuleRegistryService.java
@@ -19,11 +19,11 @@ package 
org.apache.shardingsphere.governance.core.registry.service.config.impl;
 
 import com.google.common.base.Strings;
 import com.google.common.eventbus.Subscribe;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.checker.RuleConfigurationChecker;
 import 
org.apache.shardingsphere.governance.core.registry.checker.RuleConfigurationCheckerFactory;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.rule.RuleConfigurationsAlteredEvent;
 import 
org.apache.shardingsphere.governance.core.registry.service.config.SchemaBasedRegistryService;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.SchemaMetadataNode;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
@@ -42,11 +42,8 @@ public final class SchemaRuleRegistryService implements 
SchemaBasedRegistryServi
     
     private final RegistryCenterRepository repository;
     
-    private final RegistryCenterNode node;
-    
     public SchemaRuleRegistryService(final RegistryCenterRepository 
repository) {
         this.repository = repository;
-        node = new RegistryCenterNode();
         ShardingSphereEventBus.getInstance().register(this);
     }
     
@@ -59,7 +56,7 @@ public final class SchemaRuleRegistryService implements 
SchemaBasedRegistryServi
     
     @Override
     public void persist(final String schemaName, final 
Collection<RuleConfiguration> configs) {
-        repository.persist(node.getRulePath(schemaName), 
YamlEngine.marshal(createYamlRuleConfigurations(schemaName, configs)));
+        repository.persist(SchemaMetadataNode.getRulePath(schemaName), 
YamlEngine.marshal(createYamlRuleConfigurations(schemaName, configs)));
     }
     
     private Collection<YamlRuleConfiguration> 
createYamlRuleConfigurations(final String schemaName, final 
Collection<RuleConfiguration> ruleConfigs) {
@@ -78,12 +75,13 @@ public final class SchemaRuleRegistryService implements 
SchemaBasedRegistryServi
     @SuppressWarnings("unchecked")
     public Collection<RuleConfiguration> load(final String schemaName) {
         return isExisted(schemaName)
-                ? new 
YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(YamlEngine.unmarshal(repository.get(node.getRulePath(schemaName)),
 Collection.class)) : new LinkedList<>();
+                ? new 
YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(YamlEngine.unmarshal(repository.get(SchemaMetadataNode.getRulePath(schemaName)),
 Collection.class))
+                : new LinkedList<>();
     }
     
     @Override
     public boolean isExisted(final String schemaName) {
-        return 
!Strings.isNullOrEmpty(repository.get(node.getRulePath(schemaName)));
+        return 
!Strings.isNullOrEmpty(repository.get(SchemaMetadataNode.getRulePath(schemaName)));
     }
     
     /**
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/node/GlobalNode.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/node/GlobalNode.java
new file mode 100644
index 0000000..25ac806
--- /dev/null
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/node/GlobalNode.java
@@ -0,0 +1,51 @@
+/*
+ * 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.governance.core.registry.service.config.node;
+
+import com.google.common.base.Joiner;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+/**
+ * Global node.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class GlobalNode {
+    
+    private static final String RULE_NODE = "rules";
+    
+    private static final String PROPS_NODE = "props";
+    
+    /**
+     * Get global rule node path.
+     *
+     * @return global rule node path
+     */
+    public static String getGlobalRuleNode() {
+        return Joiner.on("/").join("", RULE_NODE);
+    }
+    
+    /**
+     * Get properties path.
+     *
+     * @return properties path
+     */
+    public static String getPropsPath() {
+        return Joiner.on("/").join("", PROPS_NODE);
+    }
+}
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/node/SchemaMetadataNode.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/node/SchemaMetadataNode.java
new file mode 100644
index 0000000..69f5233
--- /dev/null
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/config/node/SchemaMetadataNode.java
@@ -0,0 +1,155 @@
+/*
+ * 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.governance.core.registry.service.config.node;
+
+import com.google.common.base.Joiner;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * Schema metadata node.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class SchemaMetadataNode {
+    
+    private static final String ROOT_NODE = "metadata";
+    
+    private static final String DATA_SOURCE_NODE = "dataSources";
+    
+    private static final String RULE_NODE = "rules";
+    
+    private static final String SCHEMA_NODE = "schema";
+    
+    /**
+     * Get metadata data source path.
+     *
+     * @param schemaName schema name
+     * @return data source path
+     */
+    public static String getMetadataDataSourcePath(final String schemaName) {
+        return getFullMetadataPath(schemaName, DATA_SOURCE_NODE);
+    }
+    
+    /**
+     * Get metadata node path.
+     *
+     * @return metadata node path
+     */
+    public static String getMetadataNodePath() {
+        return Joiner.on("/").join("", ROOT_NODE);
+    }
+    
+    /**
+     * Get schema name path.
+     *
+     * @param schemaName schema name
+     * @return schema name path
+     */
+    public static String getSchemaNamePath(final String schemaName) {
+        return Joiner.on("/").join("", ROOT_NODE, schemaName);
+    }
+    
+    /**
+     * Get rule path.
+     *
+     * @param schemaName schema name
+     * @return rule path
+     */
+    public static String getRulePath(final String schemaName) {
+        return getFullMetadataPath(schemaName, RULE_NODE);
+    }
+    
+    /**
+     * Get metadata schema path.
+     *
+     * @param schemaName schema name
+     * @return schema path
+     */
+    public static String getMetadataSchemaPath(final String schemaName) {
+        return getFullMetadataPath(schemaName, SCHEMA_NODE);
+    }
+    
+    private static String getFullMetadataPath(final String schemaName, final 
String node) {
+        return Joiner.on("/").join("", ROOT_NODE, schemaName, node);
+    }
+    
+    /**
+     * Get schema name.
+     *
+     * @param configurationNodeFullPath configuration node full path
+     * @return schema name
+     */
+    public static String getSchemaName(final String configurationNodeFullPath) 
{
+        Pattern pattern = Pattern.compile(getMetadataNodePath() + "/(\\w+)" + 
"(/datasource|/rule)?", Pattern.CASE_INSENSITIVE);
+        Matcher matcher = pattern.matcher(configurationNodeFullPath);
+        return matcher.find() ? matcher.group(1) : "";
+    }
+    
+    /**
+     * Get all schema config paths.
+     *
+     * @param schemaNames schema names
+     * @return config paths list
+     */
+    public static Collection<String> getAllSchemaConfigPaths(final 
Collection<String> schemaNames) {
+        Collection<String> result = new 
ArrayList<>(Collections.singleton(getMetadataNodePath()));
+        for (String schemaName : schemaNames) {
+            result.add(getRulePath(schemaName));
+            result.add(getMetadataDataSourcePath(schemaName));
+            result.add(getMetadataSchemaPath(schemaName));
+        }
+        return result;
+    }
+    
+    /**
+     * Get all metadata schema paths.
+     *
+     * @param schemaNames schema names
+     * @return list of schema path
+     */
+    public static Collection<String> getAllMetadataSchemaPaths(final 
Collection<String> schemaNames) {
+        return 
schemaNames.stream().map(SchemaMetadataNode::getMetadataSchemaPath).collect(Collectors.toList());
+    }
+    
+    /**
+     * Get all rule paths.
+     *
+     * @param schemaNames schema names
+     * @return list of rule path
+     */
+    public static Collection<String> getAllRulePaths(final Collection<String> 
schemaNames) {
+        return 
schemaNames.stream().map(SchemaMetadataNode::getRulePath).collect(Collectors.toList());
+    }
+    
+    /**
+     * Get all data source paths.
+     *
+     * @param schemaNames schema names
+     * @return list of data source path
+     */
+    public static Collection<String> getAllDataSourcePaths(final 
Collection<String> schemaNames) {
+        return 
schemaNames.stream().map(SchemaMetadataNode::getMetadataDataSourcePath).collect(Collectors.toList());
+    }
+}
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/process/ProcessNode.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/process/ProcessNode.java
new file mode 100644
index 0000000..39c429e
--- /dev/null
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/process/ProcessNode.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.governance.core.registry.service.process;
+
+import com.google.common.base.Joiner;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+/**
+ * Process node.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class ProcessNode {
+    
+    private static final String EXECUTION_NODE_NAME = "executionnodes";
+    
+    /**
+     * Get execution nodes path.
+     *
+     * @return execution nodes path
+     */
+    public static String getExecutionNodesPath() {
+        return Joiner.on("/").join("", EXECUTION_NODE_NAME);
+    }
+    
+    /**
+     * Get execution path.
+     *
+     * @param executionId execution id
+     * @return execution path
+     */
+    public static String getExecutionPath(final String executionId) {
+        return Joiner.on("/").join("", EXECUTION_NODE_NAME, executionId);
+    }
+}
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/process/ProcessRegistrySubscriber.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/process/ProcessRegistrySubscriber.java
index d43630b..d670a65 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/process/ProcessRegistrySubscriber.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/process/ProcessRegistrySubscriber.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.governance.core.registry.service.process;
 
 import com.google.common.eventbus.Subscribe;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.invocation.ExecuteProcessReportEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.invocation.ExecuteProcessSummaryReportEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.invocation.ExecuteProcessUnitReportEvent;
@@ -44,11 +43,8 @@ public final class ProcessRegistrySubscriber {
     
     private final RegistryCenterRepository repository;
     
-    private final RegistryCenterNode node;
-    
     public ProcessRegistrySubscriber(final RegistryCenterRepository 
repository) {
         this.repository = repository;
-        node = new RegistryCenterNode();
         ShardingSphereEventBus.getInstance().register(this);
     }
     
@@ -59,8 +55,8 @@ public final class ProcessRegistrySubscriber {
      */
     @Subscribe
     public void loadShowProcessListData(final ShowProcessListRequestEvent 
event) {
-        List<String> childrenKeys = 
repository.getChildrenKeys(node.getExecutionNodesPath());
-        Collection<String> processListData = childrenKeys.stream().map(key -> 
repository.get(node.getExecutionPath(key))).collect(Collectors.toList());
+        List<String> childrenKeys = 
repository.getChildrenKeys(ProcessNode.getExecutionNodesPath());
+        Collection<String> processListData = childrenKeys.stream().map(key -> 
repository.get(ProcessNode.getExecutionPath(key))).collect(Collectors.toList());
         ShardingSphereEventBus.getInstance().post(new 
ShowProcessListResponseEvent(processListData));
     }
     
@@ -72,7 +68,7 @@ public final class ProcessRegistrySubscriber {
     @Subscribe
     public void reportExecuteProcessSummary(final 
ExecuteProcessSummaryReportEvent event) {
         ExecuteProcessContext executeProcessContext = 
event.getExecuteProcessContext();
-        
repository.persist(node.getExecutionPath(executeProcessContext.getExecutionID()),
 YamlEngine.marshal(new YamlExecuteProcessContext(executeProcessContext)));
+        
repository.persist(ProcessNode.getExecutionPath(executeProcessContext.getExecutionID()),
 YamlEngine.marshal(new YamlExecuteProcessContext(executeProcessContext)));
     }
     
     /**
@@ -83,7 +79,7 @@ public final class ProcessRegistrySubscriber {
     @Subscribe
     public void reportExecuteProcessUnit(final ExecuteProcessUnitReportEvent 
event) {
         // TODO lock on the same jvm
-        String executionPath = node.getExecutionPath(event.getExecutionID());
+        String executionPath = 
ProcessNode.getExecutionPath(event.getExecutionID());
         YamlExecuteProcessContext yamlExecuteProcessContext = 
YamlEngine.unmarshal(repository.get(executionPath), 
YamlExecuteProcessContext.class);
         ExecuteProcessUnit executeProcessUnit = event.getExecuteProcessUnit();
         for (YamlExecuteProcessUnit unit : 
yamlExecuteProcessContext.getUnitStatuses()) {
@@ -101,7 +97,7 @@ public final class ProcessRegistrySubscriber {
      */
     @Subscribe
     public void reportExecuteProcess(final ExecuteProcessReportEvent event) {
-        String executionPath = node.getExecutionPath(event.getExecutionID());
+        String executionPath = 
ProcessNode.getExecutionPath(event.getExecutionID());
         YamlExecuteProcessContext yamlExecuteProcessContext = 
YamlEngine.unmarshal(repository.get(executionPath), 
YamlExecuteProcessContext.class);
         for (YamlExecuteProcessUnit unit : 
yamlExecuteProcessContext.getUnitStatuses()) {
             if (unit.getStatus() != 
ExecuteProcessConstants.EXECUTE_STATUS_DONE) {
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/schema/SchemaRegistryService.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/schema/SchemaRegistryService.java
index 63500a4..988f2ee 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/schema/SchemaRegistryService.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/schema/SchemaRegistryService.java
@@ -21,9 +21,10 @@ import com.google.common.base.Joiner;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
 import com.google.common.eventbus.Subscribe;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.metadata.MetaDataCreatedEvent;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.metadata.MetaDataDroppedEvent;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.SchemaMetadataNode;
+import org.apache.shardingsphere.governance.core.registry.util.SchemaNameUtil;
 import org.apache.shardingsphere.governance.core.yaml.schema.pojo.YamlSchema;
 import 
org.apache.shardingsphere.governance.core.yaml.schema.swapper.SchemaYamlSwapper;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
@@ -44,11 +45,8 @@ public final class SchemaRegistryService {
     
     private final RegistryCenterRepository repository;
     
-    private final RegistryCenterNode node;
-
     public SchemaRegistryService(final RegistryCenterRepository repository) {
         this.repository = repository;
-        node = new RegistryCenterNode();
         ShardingSphereEventBus.getInstance().register(this);
     }
 
@@ -59,7 +57,7 @@ public final class SchemaRegistryService {
      * @param schema schema to be persisted
      */
     public void persist(final String schemaName, final ShardingSphereSchema 
schema) {
-        repository.persist(node.getMetadataSchemaPath(schemaName), 
YamlEngine.marshal(new SchemaYamlSwapper().swapToYamlConfiguration(schema)));
+        
repository.persist(SchemaMetadataNode.getMetadataSchemaPath(schemaName), 
YamlEngine.marshal(new SchemaYamlSwapper().swapToYamlConfiguration(schema)));
     }
     
     /**
@@ -68,7 +66,7 @@ public final class SchemaRegistryService {
      * @param schemaName schema name to be deleted
      */
     public void delete(final String schemaName) {
-        repository.delete(node.getSchemaNamePath(schemaName));
+        repository.delete(SchemaMetadataNode.getSchemaNamePath(schemaName));
     }
     
     /**
@@ -78,7 +76,7 @@ public final class SchemaRegistryService {
      * @return Loaded schema
      */
     public Optional<ShardingSphereSchema> load(final String schemaName) {
-        String path = repository.get(node.getMetadataSchemaPath(schemaName));
+        String path = 
repository.get(SchemaMetadataNode.getMetadataSchemaPath(schemaName));
         return Strings.isNullOrEmpty(path) ? Optional.empty() : 
Optional.of(new SchemaYamlSwapper().swapToObject(YamlEngine.unmarshal(path, 
YamlSchema.class)));
     }
     
@@ -88,8 +86,8 @@ public final class SchemaRegistryService {
      * @return all schema names
      */
     public Collection<String> loadAllNames() {
-        String schemaNames = repository.get(node.getMetadataNodePath());
-        return Strings.isNullOrEmpty(schemaNames) ? new LinkedList<>() : 
node.splitSchemaName(schemaNames);
+        String schemaNames = 
repository.get(SchemaMetadataNode.getMetadataNodePath());
+        return Strings.isNullOrEmpty(schemaNames) ? new LinkedList<>() : 
SchemaNameUtil.splitSchemaName(schemaNames);
     }
     
     /**
@@ -99,11 +97,11 @@ public final class SchemaRegistryService {
      */
     @Subscribe
     public void update(final MetaDataCreatedEvent event) {
-        String schemaNames = repository.get(node.getMetadataNodePath());
+        String schemaNames = 
repository.get(SchemaMetadataNode.getMetadataNodePath());
         Collection<String> schemas = Strings.isNullOrEmpty(schemaNames) ? new 
LinkedHashSet<>() : new 
LinkedHashSet<>(Splitter.on(",").splitToList(schemaNames));
         if (!schemas.contains(event.getSchemaName())) {
             schemas.add(event.getSchemaName());
-            repository.persist(node.getMetadataNodePath(), 
Joiner.on(",").join(schemas));
+            repository.persist(SchemaMetadataNode.getMetadataNodePath(), 
Joiner.on(",").join(schemas));
         }
     }
     
@@ -124,11 +122,11 @@ public final class SchemaRegistryService {
      */
     @Subscribe
     public void update(final MetaDataDroppedEvent event) {
-        String schemaNames = repository.get(node.getMetadataNodePath());
+        String schemaNames = 
repository.get(SchemaMetadataNode.getMetadataNodePath());
         Collection<String> schemas = Strings.isNullOrEmpty(schemaNames) ? new 
LinkedHashSet<>() : new 
LinkedHashSet<>(Splitter.on(",").splitToList(schemaNames));
         if (schemas.contains(event.getSchemaName())) {
             schemas.remove(event.getSchemaName());
-            repository.persist(node.getMetadataNodePath(), 
Joiner.on(",").join(schemas));
+            repository.persist(SchemaMetadataNode.getMetadataNodePath(), 
Joiner.on(",").join(schemas));
         }
     }
 }
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/state/DataSourceStatusRegistryService.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/state/DataSourceStatusRegistryService.java
index 705c6bc..c89559d 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/state/DataSourceStatusRegistryService.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/state/DataSourceStatusRegistryService.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.governance.core.registry.service.state;
 
 import com.google.common.base.Strings;
 import com.google.common.eventbus.Subscribe;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.RegistryCenterNodeStatus;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
@@ -36,11 +35,8 @@ public final class DataSourceStatusRegistryService {
     
     private final RegistryCenterRepository repository;
     
-    private final RegistryCenterNode node;
-    
     public DataSourceStatusRegistryService(final RegistryCenterRepository 
repository) {
         this.repository = repository;
-        node = new RegistryCenterNode();
         ShardingSphereEventBus.getInstance().register(this);
     }
     
@@ -56,11 +52,11 @@ public final class DataSourceStatusRegistryService {
     }
     
     private Collection<String> loadDataSources(final String schemaName) {
-        return repository.getChildrenKeys(node.getSchemaPath(schemaName));
+        return 
repository.getChildrenKeys(StatesNode.getSchemaPath(schemaName));
     }
     
     private String getDataSourceNodeData(final String schemaName, final String 
dataSourceName) {
-        return repository.get(node.getDataSourcePath(schemaName, 
dataSourceName));
+        return repository.get(StatesNode.getDataSourcePath(schemaName, 
dataSourceName));
     }
     
     /**
@@ -71,7 +67,7 @@ public final class DataSourceStatusRegistryService {
     @Subscribe
     public void update(final DataSourceDisabledEvent event) {
         String value = event.isDisabled() ? 
RegistryCenterNodeStatus.DISABLED.toString() : "";
-        repository.persist(node.getDataSourcePath(event.getSchemaName(), 
event.getDataSourceName()), value);
+        repository.persist(StatesNode.getDataSourcePath(event.getSchemaName(), 
event.getDataSourceName()), value);
     }
     
     /**
@@ -81,6 +77,6 @@ public final class DataSourceStatusRegistryService {
      */
     @Subscribe
     public void update(final PrimaryDataSourceEvent event) {
-        
repository.persist(node.getPrimaryDataSourcePath(event.getSchemaName(), 
event.getGroupName()), event.getDataSourceName());
+        
repository.persist(StatesNode.getPrimaryDataSourcePath(event.getSchemaName(), 
event.getGroupName()), event.getDataSourceName());
     }
 }
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/state/LockRegistryService.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/state/LockRegistryService.java
index 1c9e4d9..8f4251c 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/state/LockRegistryService.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/state/LockRegistryService.java
@@ -21,7 +21,6 @@ import com.google.common.base.Joiner;
 import com.google.common.base.Strings;
 import org.apache.shardingsphere.governance.core.lock.node.LockAck;
 import org.apache.shardingsphere.governance.core.lock.node.LockNode;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.instance.GovernanceInstance;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 
@@ -41,14 +40,11 @@ public final class LockRegistryService {
     
     private final RegistryCenterRepository repository;
     
-    private final RegistryCenterNode node;
-    
     private final LockNode lockNode;
     
     public LockRegistryService(final RegistryCenterRepository repository) {
         instanceId = GovernanceInstance.getInstance().getId();
         this.repository = repository;
-        node = new RegistryCenterNode();
         lockNode = new LockNode();
         initLockNode();
     }
@@ -130,7 +126,7 @@ public final class LockRegistryService {
     }
     
     private boolean checkAck(final String lockName, final String ackValue) {
-        Collection<String> instanceIds = 
repository.getChildrenKeys(node.getProxyNodesPath());
+        Collection<String> instanceIds = 
repository.getChildrenKeys(StatesNode.getProxyNodesPath());
         for (int i = 0; i < CHECK_ACK_MAXIMUM; i++) {
             if (check(instanceIds, lockName, ackValue)) {
                 return true;
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/state/StatesNode.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/state/StatesNode.java
new file mode 100644
index 0000000..f3627cb
--- /dev/null
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/service/state/StatesNode.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.governance.core.registry.service.state;
+
+import com.google.common.base.Joiner;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.governance.core.registry.schema.GovernanceSchema;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * States node.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class StatesNode {
+    
+    private static final String ROOT_NODE = "states";
+    
+    private static final String PROXY_NODE = "proxynodes";
+    
+    private static final String DATA_NODE = "datanodes";
+    
+    private static final String PRIMARY_NODE = "primarynodes";
+    
+    private static final String PRIVILEGE_NODE = "privilegenode";
+    
+    /**
+     * Get proxy node path.
+     *
+     * @param instanceId instance id
+     * @return proxy node path
+     */
+    public static String getProxyNodePath(final String instanceId) {
+        return Joiner.on("/").join("", ROOT_NODE, PROXY_NODE, instanceId);
+    }
+    
+    /**
+     * Get data nodes path.
+     *
+     * @return data nodes path
+     */
+    public static String getDataNodesPath() {
+        return Joiner.on("/").join("", ROOT_NODE, DATA_NODE);
+    }
+    
+    /**
+     * Get primary nodes path.
+     *
+     * @return primary nodes path
+     */
+    public static String getPrimaryNodesPath() {
+        return Joiner.on("/").join("", ROOT_NODE, PRIMARY_NODE);
+    }
+    
+    /**
+     * Get schema path.
+     * 
+     * @param schemaName schema name
+     * @return schema path
+     */
+    public static String getSchemaPath(final String schemaName) {
+        return Joiner.on("/").join("", ROOT_NODE, DATA_NODE, schemaName);
+    }
+    
+    /**
+     * Get primary nodes schema path.
+     *
+     * @param schemaName schema name
+     * @return schema path
+     */
+    public static String getPrimaryNodesSchemaPath(final String schemaName) {
+        return Joiner.on("/").join("", ROOT_NODE, PRIMARY_NODE, schemaName);
+    }
+    
+    /**
+     * Get data source path.
+     * 
+     * @param schemaName schema name
+     * @param dataSourceName data source name
+     * @return data source path
+     */
+    public static String getDataSourcePath(final String schemaName, final 
String dataSourceName) {
+        return Joiner.on("/").join("", ROOT_NODE, DATA_NODE, schemaName, 
dataSourceName);
+    }
+    
+    /**
+     * Get primary data source path.
+     *
+     * @param schemaName schema name
+     * @param groupName group name
+     * @return data source path
+     */
+    public static String getPrimaryDataSourcePath(final String schemaName, 
final String groupName) {
+        return Joiner.on("/").join("", ROOT_NODE, PRIMARY_NODE, schemaName, 
groupName);
+    }
+    
+    /**
+     * Get governance schema.
+     *
+     * @param dataSourceNodeFullPath data source node full path
+     * @return governance schema
+     */
+    public static Optional<GovernanceSchema> getGovernanceSchema(final String 
dataSourceNodeFullPath) {
+        Pattern pattern = Pattern.compile(getDataNodesPath() + "/" + 
"(\\w+)/(\\S+)$", Pattern.CASE_INSENSITIVE);
+        Matcher matcher = pattern.matcher(dataSourceNodeFullPath);
+        return matcher.find() ? Optional.of(new 
GovernanceSchema(matcher.group(1), matcher.group(2))) : Optional.empty();
+    }
+    
+    /**
+     * Get primary nodes governance schema.
+     *
+     * @param dataSourceNodeFullPath data source node full path
+     * @return primary nodes governance schema
+     */
+    public static Optional<GovernanceSchema> 
getPrimaryNodesGovernanceSchema(final String dataSourceNodeFullPath) {
+        Pattern pattern = Pattern.compile(getPrimaryNodesPath() + "/" + 
"(\\w+)/(\\w+)$", Pattern.CASE_INSENSITIVE);
+        Matcher matcher = pattern.matcher(dataSourceNodeFullPath);
+        return matcher.find() ? Optional.of(new 
GovernanceSchema(matcher.group(1), matcher.group(2))) : Optional.empty();
+    }
+    
+    /**
+     * Is primary data source path.
+     *
+     * @param dataSourceNodeFullPath data source node full path
+     * @return is primary data source path
+     */
+    public static boolean isPrimaryDataSourcePath(final String 
dataSourceNodeFullPath) {
+        Pattern pattern = Pattern.compile(getPrimaryNodesPath() + "/" + 
"(\\w+)/(\\w+)$", Pattern.CASE_INSENSITIVE);
+        Matcher matcher = pattern.matcher(dataSourceNodeFullPath);
+        return matcher.find();
+    }
+    
+    /**
+     * Get all schema path.
+     * 
+     * @param schemaNames collection of schema name
+     * @return collection of schema path
+     */
+    public static Collection<String> getAllSchemaPaths(final 
Collection<String> schemaNames) {
+        Collection<String> result = new ArrayList<>(schemaNames.size());
+        for (String schemaName : schemaNames) {
+            result.add(getSchemaPath(schemaName));
+            result.add(getPrimaryNodesSchemaPath(schemaName));
+        }
+        return result;
+    }
+    
+    /**
+     * Get proxy nodes path.
+     *
+     * @return proxy nodes path
+     */
+    public static String getProxyNodesPath() {
+        return Joiner.on("/").join("", ROOT_NODE, PROXY_NODE);
+    }
+    
+    /**
+     * Get privilege node path.
+     *
+     * @return privilege node path
+     */
+    public static String getPrivilegeNodePath() {
+        return Joiner.on("/").join("", ROOT_NODE, PRIVILEGE_NODE);
+    }
+}
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/util/SchemaNameUtil.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/util/SchemaNameUtil.java
new file mode 100644
index 0000000..7bab669
--- /dev/null
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/registry/util/SchemaNameUtil.java
@@ -0,0 +1,45 @@
+/*
+ * 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.governance.core.registry.util;
+
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Schema name utility.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class SchemaNameUtil {
+    
+    private static final String SEPARATOR = ",";
+    
+    /**
+     * Split schema name.
+     *
+     * @param schemaNames schema names
+     * @return schema names
+     */
+    public static Collection<String> splitSchemaName(final String schemaNames) 
{
+        return Strings.isNullOrEmpty(schemaNames) ? Collections.emptyList() : 
Splitter.on(SEPARATOR).splitToList(schemaNames);
+    }
+}
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/GovernanceFacadeTest.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/GovernanceFacadeTest.java
index 35942f0..b2a6efd 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/GovernanceFacadeTest.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/facade/GovernanceFacadeTest.java
@@ -76,7 +76,7 @@ public final class GovernanceFacadeTest {
         
governanceFacade.onlineInstance(Collections.singletonMap("sharding_db", 
dataSourceConfigs), schemaRuleConfigs, globalRuleConfigs, props);
         
verify(registryCenter).persistConfigurations(Collections.singletonMap("sharding_db",
 dataSourceConfigs), schemaRuleConfigs, globalRuleConfigs, props, false);
         verify(registryCenter).registerInstanceOnline();
-        verify(registryCenter).initNodes();
+        verify(registryCenter).initStateNodes();
         verify(listenerManager).initListeners();
     }
     
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterNodeTest.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterNodeTest.java
deleted file mode 100644
index f3e3326..0000000
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterNodeTest.java
+++ /dev/null
@@ -1,134 +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.governance.core.registry;
-
-import 
org.apache.shardingsphere.governance.core.registry.schema.GovernanceSchema;
-import org.apache.shardingsphere.infra.database.DefaultSchema;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Optional;
-
-import static org.hamcrest.CoreMatchers.hasItem;
-import static org.hamcrest.CoreMatchers.hasItems;
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
-public final class RegistryCenterNodeTest {
-    
-    private final RegistryCenterNode registryCenterNode = new 
RegistryCenterNode();
-    
-    @Test
-    public void assertGetProxyNodePath() {
-        assertThat(registryCenterNode.getProxyNodePath("testId"), 
is("/states/proxynodes/testId"));
-    }
-    
-    @Test
-    public void assertGetDataNodesPath() {
-        assertThat(registryCenterNode.getDataNodesPath(), 
is("/states/datanodes"));
-    }
-    
-    @Test
-    public void assertGetGovernanceSchema() {
-        Optional<GovernanceSchema> actual = 
registryCenterNode.getGovernanceSchema("/states/datanodes/replica_query_db/replica_ds_0");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get().getSchemaName(), is("replica_query_db"));
-        assertThat(actual.get().getDataSourceName(), is("replica_ds_0"));
-    }
-
-    @Test
-    public void assertGetGovernanceSchemaForIpDataSourceName() {
-        Optional<GovernanceSchema> actual = 
registryCenterNode.getGovernanceSchema("/states/datanodes/replica_query_db/127.0.0.1");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get().getSchemaName(), is("replica_query_db"));
-        assertThat(actual.get().getDataSourceName(), is("127.0.0.1"));
-    }
-    
-    @Test
-    public void assertGetSchemaPath() {
-        assertThat(registryCenterNode.getSchemaPath("replica_query_db"), 
is("/states/datanodes/replica_query_db"));
-    }
-    
-    @Test
-    public void assertGetDataSourcePath() {
-        assertThat(registryCenterNode.getDataSourcePath("replica_query_db", 
"replica_ds_0"), is("/states/datanodes/replica_query_db/replica_ds_0"));
-    }
-    
-    @Test
-    public void assertGetAllSchemaPaths() {
-        Collection<String> schemaPaths = 
registryCenterNode.getAllSchemaPaths(Arrays.asList("replica_query_db", 
"sharding_db"));
-        assertThat(schemaPaths.size(), is(4));
-        assertThat(schemaPaths, hasItem("/states/datanodes/replica_query_db"));
-        assertThat(schemaPaths, hasItem("/states/datanodes/sharding_db"));
-        assertThat(schemaPaths, 
hasItem("/states/primarynodes/replica_query_db"));
-        assertThat(schemaPaths, hasItem("/states/primarynodes/sharding_db"));
-    }
-    
-    @Test
-    public void assertGetRulePath() {
-        assertThat(registryCenterNode.getRulePath(DefaultSchema.LOGIC_NAME), 
is("/metadata/logic_db/rules"));
-    }
-    
-    @Test
-    public void assertGetUsersNodePath() {
-        assertThat(registryCenterNode.getUsersNode(), is("/users"));
-    }
-    
-    @Test
-    public void assertGetGlobalRuleNodePath() {
-        assertThat(registryCenterNode.getGlobalRuleNode(), is("/rules"));
-    }
-    
-    @Test
-    public void assertGetPropsPath() {
-        assertThat(registryCenterNode.getPropsPath(), is("/props"));
-    }
-    
-    @Test
-    public void assertGetSchemaName() {
-        
assertThat(registryCenterNode.getSchemaName("/metadata/logic_db/rules"), 
is(DefaultSchema.LOGIC_NAME));
-    }
-    
-    @Test
-    public void assertGetAllSchemaConfigPaths() {
-        Collection<String> actual = 
registryCenterNode.getAllSchemaConfigPaths(Collections.singletonList(DefaultSchema.LOGIC_NAME));
-        assertThat(actual.size(), is(4));
-        assertThat(actual, hasItems("/metadata"));
-        assertThat(actual, hasItems("/metadata/logic_db/rules"));
-        assertThat(actual, hasItems("/metadata/logic_db/dataSources"));
-        assertThat(actual, hasItems("/metadata/logic_db/schema"));
-    }
-
-    @Test
-    public void assertGetSchemaNamePath() {
-        assertThat(registryCenterNode.getSchemaNamePath("sharding_db"), 
is("/metadata/sharding_db"));
-    }
-
-    @Test
-    public void assertGetTablePath() {
-        assertThat(registryCenterNode.getMetadataSchemaPath("sharding_db"), 
is("/metadata/sharding_db/schema"));
-    }
-    
-    @Test
-    public void assertGetPrivilegeNodePath() {
-        assertThat(registryCenterNode.getPrivilegeNodePath(), 
is("/states/privilegenode"));
-    }
-}
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterTest.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterTest.java
index 5233531..316b841 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterTest.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/RegistryCenterTest.java
@@ -92,7 +92,7 @@ public final class RegistryCenterTest {
     
     @Test
     public void assertInitNodes() {
-        registryCenter.initNodes();
+        registryCenter.initStateNodes();
         verify(registryCenterRepository).persist("/states/datanodes", "");
         verify(registryCenterRepository).persist("/states/primarynodes", "");
     }
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/UserNodeTest.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/UserNodeTest.java
new file mode 100644
index 0000000..f62e885
--- /dev/null
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/UserNodeTest.java
@@ -0,0 +1,31 @@
+/*
+ * 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.governance.core.registry;
+
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public final class UserNodeTest {
+    
+    @Test
+    public void assertGetUsersNodePath() {
+        assertThat(UserNode.getRootNode(), is("/users"));
+    }
+}
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/scaling/ScalingRegistrySubscriberTest.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/cache/ScalingRegistrySubscriberTest.java
similarity index 95%
rename from 
shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/scaling/ScalingRegistrySubscriberTest.java
rename to 
shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/cache/ScalingRegistrySubscriberTest.java
index d5132a6..c8ca2e5 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/scaling/ScalingRegistrySubscriberTest.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/cache/ScalingRegistrySubscriberTest.java
@@ -15,10 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.governance.core.registry.service.scaling;
+package org.apache.shardingsphere.governance.core.registry.cache;
 
 import lombok.SneakyThrows;
-import org.apache.shardingsphere.governance.core.registry.RegistryCacheManager;
 import 
org.apache.shardingsphere.governance.core.registry.listener.event.rule.SwitchRuleConfigurationEvent;
 import 
org.apache.shardingsphere.governance.core.registry.service.config.impl.SchemaRuleRegistryService;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/config/node/GlobalNodeTest.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/config/node/GlobalNodeTest.java
new file mode 100644
index 0000000..27e0bce
--- /dev/null
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/config/node/GlobalNodeTest.java
@@ -0,0 +1,36 @@
+/*
+ * 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.governance.core.registry.service.config.node;
+
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public final class GlobalNodeTest {
+    
+    @Test
+    public void assertGetGlobalRuleNodePath() {
+        assertThat(GlobalNode.getGlobalRuleNode(), is("/rules"));
+    }
+    
+    @Test
+    public void assertGetPropsPath() {
+        assertThat(GlobalNode.getPropsPath(), is("/props"));
+    }
+}
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/config/node/SchemaMetadataNodeTest.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/config/node/SchemaMetadataNodeTest.java
new file mode 100644
index 0000000..7f4828d
--- /dev/null
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/config/node/SchemaMetadataNodeTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.governance.core.registry.service.config.node;
+
+import org.apache.shardingsphere.infra.database.DefaultSchema;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import static org.hamcrest.CoreMatchers.hasItems;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class SchemaMetadataNodeTest {
+    
+    @Test
+    public void assertGetRulePath() {
+        assertThat(SchemaMetadataNode.getRulePath(DefaultSchema.LOGIC_NAME), 
is("/metadata/logic_db/rules"));
+    }
+    
+    @Test
+    public void assertGetSchemaName() {
+        
assertThat(SchemaMetadataNode.getSchemaName("/metadata/logic_db/rules"), 
is(DefaultSchema.LOGIC_NAME));
+    }
+    
+    @Test
+    public void assertGetAllSchemaConfigPaths() {
+        Collection<String> actual = 
SchemaMetadataNode.getAllSchemaConfigPaths(Collections.singletonList(DefaultSchema.LOGIC_NAME));
+        assertThat(actual.size(), is(4));
+        assertThat(actual, hasItems("/metadata"));
+        assertThat(actual, hasItems("/metadata/logic_db/rules"));
+        assertThat(actual, hasItems("/metadata/logic_db/dataSources"));
+        assertThat(actual, hasItems("/metadata/logic_db/schema"));
+    }
+    
+    @Test
+    public void assertGetSchemaNamePath() {
+        assertThat(SchemaMetadataNode.getSchemaNamePath("sharding_db"), 
is("/metadata/sharding_db"));
+    }
+    
+    @Test
+    public void assertGetMetadataSchemaPath() {
+        assertThat(SchemaMetadataNode.getMetadataSchemaPath("sharding_db"), 
is("/metadata/sharding_db/schema"));
+    }
+}
\ No newline at end of file
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/state/DataSourceStatusRegistryServiceTest.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/state/DataSourceStatusRegistryServiceTest.java
index 3525429..a61a4e8 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/state/DataSourceStatusRegistryServiceTest.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/state/DataSourceStatusRegistryServiceTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.governance.core.registry.service.state;
 
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
 import 
org.apache.shardingsphere.governance.core.registry.RegistryCenterNodeStatus;
 import 
org.apache.shardingsphere.governance.repository.spi.RegistryCenterRepository;
 import org.apache.shardingsphere.infra.rule.event.impl.DataSourceDisabledEvent;
@@ -76,7 +75,7 @@ public final class DataSourceStatusRegistryServiceTest {
         String dataSourceName = "replica_ds_0";
         DataSourceDisabledEvent dataSourceDisabledEvent = new 
DataSourceDisabledEvent(schemaName, dataSourceName, isDisabled);
         dataSourceStatusRegistryService.update(dataSourceDisabledEvent);
-        verify(registryCenterRepository).persist(new 
RegistryCenterNode().getDataSourcePath(schemaName, dataSourceName), value);
+        
verify(registryCenterRepository).persist(StatesNode.getDataSourcePath(schemaName,
 dataSourceName), value);
     }
     
     @Test
@@ -86,6 +85,6 @@ public final class DataSourceStatusRegistryServiceTest {
         String dataSourceName = "replica_ds_0";
         PrimaryDataSourceEvent primaryDataSourceEvent = new 
PrimaryDataSourceEvent(schemaName, groupName, dataSourceName);
         dataSourceStatusRegistryService.update(primaryDataSourceEvent);
-        verify(registryCenterRepository).persist(new 
RegistryCenterNode().getPrimaryDataSourcePath(schemaName, groupName), 
dataSourceName);
+        
verify(registryCenterRepository).persist(StatesNode.getPrimaryDataSourcePath(schemaName,
 groupName), dataSourceName);
     }
 }
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/state/StatesNodeTest.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/state/StatesNodeTest.java
new file mode 100644
index 0000000..109aab3
--- /dev/null
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/registry/service/state/StatesNodeTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.governance.core.registry.service.state;
+
+import 
org.apache.shardingsphere.governance.core.registry.schema.GovernanceSchema;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Optional;
+
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+public final class StatesNodeTest {
+    
+    @Test
+    public void assertGetProxyNodePath() {
+        assertThat(StatesNode.getProxyNodePath("testId"), 
is("/states/proxynodes/testId"));
+    }
+    
+    @Test
+    public void assertGetDataNodesPath() {
+        assertThat(StatesNode.getDataNodesPath(), is("/states/datanodes"));
+    }
+    
+    @Test
+    public void assertGetGovernanceSchema() {
+        Optional<GovernanceSchema> actual = 
StatesNode.getGovernanceSchema("/states/datanodes/replica_query_db/replica_ds_0");
+        assertTrue(actual.isPresent());
+        assertThat(actual.get().getSchemaName(), is("replica_query_db"));
+        assertThat(actual.get().getDataSourceName(), is("replica_ds_0"));
+    }
+    
+    @Test
+    public void assertGetGovernanceSchemaForIpDataSourceName() {
+        Optional<GovernanceSchema> actual = 
StatesNode.getGovernanceSchema("/states/datanodes/replica_query_db/127.0.0.1");
+        assertTrue(actual.isPresent());
+        assertThat(actual.get().getSchemaName(), is("replica_query_db"));
+        assertThat(actual.get().getDataSourceName(), is("127.0.0.1"));
+    }
+    
+    @Test
+    public void assertGetSchemaPath() {
+        assertThat(StatesNode.getSchemaPath("replica_query_db"), 
is("/states/datanodes/replica_query_db"));
+    }
+    
+    @Test
+    public void assertGetDataSourcePath() {
+        assertThat(StatesNode.getDataSourcePath("replica_query_db", 
"replica_ds_0"), is("/states/datanodes/replica_query_db/replica_ds_0"));
+    }
+    
+    @Test
+    public void assertGetAllSchemaPaths() {
+        Collection<String> schemaPaths = 
StatesNode.getAllSchemaPaths(Arrays.asList("replica_query_db", "sharding_db"));
+        assertThat(schemaPaths.size(), is(4));
+        assertThat(schemaPaths, hasItem("/states/datanodes/replica_query_db"));
+        assertThat(schemaPaths, hasItem("/states/datanodes/sharding_db"));
+        assertThat(schemaPaths, 
hasItem("/states/primarynodes/replica_query_db"));
+        assertThat(schemaPaths, hasItem("/states/primarynodes/sharding_db"));
+    }
+    
+    @Test
+    public void assertGetPrivilegeNodePath() {
+        assertThat(StatesNode.getPrivilegeNodePath(), 
is("/states/privilegenode"));
+    }
+}
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/test/java/org/apache/shardingsphere/proxy/initializer/impl/GovernanceBootstrapInitializerTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/test/java/org/apache/shardingsphere/proxy/initializer/impl/GovernanceBootstrapInitializerTest.java
index 0403b0c..1c43ee3 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/test/java/org/apache/shardingsphere/proxy/initializer/impl/GovernanceBootstrapInitializerTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/test/java/org/apache/shardingsphere/proxy/initializer/impl/GovernanceBootstrapInitializerTest.java
@@ -20,7 +20,9 @@ package org.apache.shardingsphere.proxy.initializer.impl;
 import lombok.SneakyThrows;
 import 
org.apache.shardingsphere.governance.context.metadata.GovernanceMetaDataContexts;
 import 
org.apache.shardingsphere.governance.context.transaction.GovernanceTransactionContexts;
-import org.apache.shardingsphere.governance.core.registry.RegistryCenterNode;
+import org.apache.shardingsphere.governance.core.registry.UserNode;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.GlobalNode;
+import 
org.apache.shardingsphere.governance.core.registry.service.config.node.SchemaMetadataNode;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import 
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
 import org.apache.shardingsphere.infra.config.datasource.DataSourceParameter;
@@ -82,12 +84,11 @@ public final class GovernanceBootstrapInitializerTest 
extends AbstractBootstrapI
     }
     
     private void initConfigCenter() {
-        RegistryCenterNode node = new RegistryCenterNode();
-        registryCenterRepository.persist(node.getUsersNode(), 
readYAML(USERS_YAML));
-        registryCenterRepository.persist(node.getPropsPath(), 
readYAML(PROPS_YAML));
-        registryCenterRepository.persist(node.getMetadataNodePath(), "db");
-        registryCenterRepository.persist(node.getMetadataDataSourcePath("db"), 
readYAML(DATA_SOURCE_YAML));
-        registryCenterRepository.persist(node.getRulePath("db"), 
readYAML(SHARDING_RULE_YAML));
+        registryCenterRepository.persist(UserNode.getRootNode(), 
readYAML(USERS_YAML));
+        registryCenterRepository.persist(GlobalNode.getPropsPath(), 
readYAML(PROPS_YAML));
+        
registryCenterRepository.persist(SchemaMetadataNode.getMetadataNodePath(), 
"db");
+        
registryCenterRepository.persist(SchemaMetadataNode.getMetadataDataSourcePath("db"),
 readYAML(DATA_SOURCE_YAML));
+        registryCenterRepository.persist(SchemaMetadataNode.getRulePath("db"), 
readYAML(SHARDING_RULE_YAML));
     }
     
     @SneakyThrows({URISyntaxException.class, IOException.class})

Reply via email to