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

tanxinyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 9b2efea9a2f Merge config files to iotdb-system.properties (#12570)
9b2efea9a2f is described below

commit 9b2efea9a2fcd0e941a4012e0f1631e825f7d772
Author: shuwenwei <[email protected]>
AuthorDate: Thu May 30 20:49:52 2024 +0800

    Merge config files to iotdb-system.properties (#12570)
    
    Co-authored-by: Haonan <[email protected]>
---
 .github/workflows/multi-language-client.yml        |   5 +-
 docker/src/main/DockerCompose/entrypoint.sh        |   2 +-
 .../main/DockerCompose/replace-conf-from-env.sh    |  13 +-
 docker/src/main/Dockerfile-1c1d                    |  14 +-
 .../iotdb/it/env/cluster/ClusterConstant.java      |   1 +
 .../iotdb/it/env/cluster/config/MppBaseConfig.java |   2 +-
 .../it/env/cluster/node/AbstractNodeWrapper.java   |   8 +-
 .../it/env/cluster/node/ConfigNodeWrapper.java     |  12 +-
 .../iotdb/it/env/cluster/node/DataNodeWrapper.java |  12 +-
 .../cli/src/assembly/resources/tools/backup.bat    |   7 +-
 .../cli/src/assembly/resources/tools/backup.sh     |   7 +-
 .../src/assembly/resources/tools/collect-info.bat  |   6 +-
 .../src/assembly/resources/tools/collect-info.sh   |   6 +-
 .../org/apache/iotdb/tool/IoTDBDataBackTool.java   |  39 +-
 iotdb-core/confignode/src/assembly/confignode.xml  |   4 +-
 .../resources/conf/iotdb-confignode.properties     | 147 -------
 .../assembly/resources/sbin/start-confignode.bat   |  30 +-
 .../assembly/resources/sbin/stop-confignode.bat    |  10 +-
 .../src/assembly/resources/sbin/stop-confignode.sh |   8 +-
 .../iotdb/confignode/conf/ConfigNodeConstant.java  |   1 -
 .../confignode/conf/ConfigNodeDescriptor.java      |  50 +--
 .../manager/node/ClusterNodeStartUtils.java        |  23 +-
 .../iotdb/confignode/service/ConfigNode.java       |   3 +-
 .../confignode1conf/iotdb-confignode.properties    |  31 --
 ...b-common.properties => iotdb-system.properties} |  13 +
 .../confignode2conf/iotdb-confignode.properties    |  31 --
 ...b-common.properties => iotdb-system.properties} |  13 +
 .../confignode3conf/iotdb-confignode.properties    |  31 --
 ...b-common.properties => iotdb-system.properties} |  13 +
 .../resources/conf/iotdb-datanode.properties       | 316 ---------------
 .../src/assembly/resources/sbin/start-datanode.bat |  48 +--
 .../src/assembly/resources/sbin/stop-datanode.bat  |  10 +-
 .../src/assembly/resources/sbin/stop-datanode.sh   |   7 +-
 iotdb-core/datanode/src/assembly/server.xml        |   4 +-
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |  68 ++--
 .../iotdb/db/conf/rest/IoTDBRestServiceConfig.java |   2 -
 .../db/conf/rest/IoTDBRestServiceDescriptor.java   |   9 +-
 .../schemaengine/schemaregion/tag/TagLogFile.java  |   2 +-
 .../datanode1conf/iotdb-common.properties          |  22 --
 ...datanode.properties => iotdb-system.properties} |   7 +-
 .../datanode2conf/iotdb-common.properties          |  22 --
 ...datanode.properties => iotdb-system.properties} |   5 +
 .../datanode3conf/iotdb-common.properties          |  22 --
 ...datanode.properties => iotdb-system.properties} |   7 +-
 .../src/test/resources/iotdb-system.properties     |  76 ++++
 .../metrics/config/MetricConfigDescriptor.java     |  73 ++--
 .../iotdb/metrics/config/MetricConfigTest.java     |   4 +-
 ...b-common.properties => iotdb-system.properties} | 433 +++++++++++++++++++++
 .../assembly/resources/sbin/destroy-confignode.bat |   6 +-
 .../assembly/resources/sbin/destroy-confignode.sh  |   7 +-
 .../assembly/resources/sbin/destroy-datanode.bat   |   6 +-
 .../assembly/resources/sbin/destroy-datanode.sh    |   8 +-
 .../src/assembly/resources/sbin/health_check.bat   |  76 ++--
 .../src/assembly/resources/sbin/health_check.sh    |   7 +-
 .../src/assembly/resources/sbin/iotdb-common.sh    |  26 +-
 .../apache/iotdb/commons/conf/CommonConfig.java    |   5 +-
 .../commons/conf/ConfigFileAutoUpdateTool.java     | 126 ++++++
 57 files changed, 1022 insertions(+), 924 deletions(-)

diff --git a/.github/workflows/multi-language-client.yml 
b/.github/workflows/multi-language-client.yml
index fcf9c23e87b..b66fa4ed9f5 100644
--- a/.github/workflows/multi-language-client.yml
+++ b/.github/workflows/multi-language-client.yml
@@ -97,7 +97,10 @@ jobs:
       - name: Integration test
         shell: bash
         run: |
-          cd iotdb-client/client-go/ && make e2e_test_for_parent_git_repo 
e2e_test_clean_for_parent_git_repo
+          cd iotdb-client 
+          git clone https://github.com/apache/iotdb-client-go.git 
+          cd iotdb-client-go 
+          make e2e_test_for_parent_git_repo e2e_test_clean_for_parent_git_repo
 
   python:
     runs-on: ubuntu-latest
diff --git a/docker/src/main/DockerCompose/entrypoint.sh 
b/docker/src/main/DockerCompose/entrypoint.sh
index 55be9899b00..72beea010ee 100755
--- a/docker/src/main/DockerCompose/entrypoint.sh
+++ b/docker/src/main/DockerCompose/entrypoint.sh
@@ -36,7 +36,7 @@ function on_stop(){
 trap 'on_stop' SIGTERM SIGKILL SIGQUIT
 
 
-replace-conf-from-env.sh ${start_what}
+replace-conf-from-env.sh
 
 case "$1" in
    datanode)
diff --git a/docker/src/main/DockerCompose/replace-conf-from-env.sh 
b/docker/src/main/DockerCompose/replace-conf-from-env.sh
index 93be28bc242..887faf1bdcd 100755
--- a/docker/src/main/DockerCompose/replace-conf-from-env.sh
+++ b/docker/src/main/DockerCompose/replace-conf-from-env.sh
@@ -19,6 +19,7 @@
 #
 
 conf_path=${IOTDB_HOME}/conf
+target_files="iotdb-system.properties"
 
 function process_single(){
        local key_value="$1"
@@ -48,17 +49,5 @@ function replace_configs(){
   done
 }
 
-case "$1" in
-  confignode)
-    target_files="iotdb-common.properties iotdb-confignode.properties"
-    ;;
-  datanode)
-    target_files="iotdb-common.properties iotdb-datanode.properties"
-    ;;
-  all)
-    target_files="iotdb-common.properties iotdb-confignode.properties 
iotdb-datanode.properties"
-    ;;
-esac
-
 replace_configs
 
diff --git a/docker/src/main/Dockerfile-1c1d b/docker/src/main/Dockerfile-1c1d
index 9aacd0aa0ca..71548de08b7 100644
--- a/docker/src/main/Dockerfile-1c1d
+++ b/docker/src/main/Dockerfile-1c1d
@@ -30,13 +30,13 @@ RUN apt update \
   && rm /apache-iotdb-*-bin.zip \
   && mv /apache-iotdb-* /iotdb \
   && mv /start-1c1d.sh /iotdb/sbin \
-  && sed -i 's/dn_internal_address=127.0.0.1/dn_internal_address=0.0.0.0/g' 
/iotdb/conf/iotdb-datanode.properties \
-  && sed -i 's/cn_internal_address=127.0.0.1/cn_internal_address=0.0.0.0/g' 
/iotdb/conf/iotdb-confignode.properties \
-  && sed -i 
's/cn_seed_config_node=127.0.0.1:10710/cn_seed_config_node=0.0.0.0:10710/g' 
/iotdb/conf/iotdb-confignode.properties \
-  && sed -i 
's/dn_seed_config_node=127.0.0.1:10710/dn_seed_config_node=0.0.0.0:10710/g' 
/iotdb/conf/iotdb-datanode.properties \
-  && sed -i 's/# 
config_node_consensus_protocol_class=org.apache.iotdb.consensus.ratis.RatisConsensus/config_node_consensus_protocol_class=org.apache.iotdb.consensus.simple.SimpleConsensus/g'
 /iotdb/conf/iotdb-common.properties \
-  && sed -i 's/# 
schema_region_consensus_protocol_class=org.apache.iotdb.consensus.ratis.RatisConsensus/schema_region_consensus_protocol_class=org.apache.iotdb.consensus.simple.SimpleConsensus/g'
 /iotdb/conf/iotdb-common.properties \
-  && sed -i 's/# 
data_region_consensus_protocol_class=org.apache.iotdb.consensus.iot.IoTConsensus/data_region_consensus_protocol_class=org.apache.iotdb.consensus.simple.SimpleConsensus/g'
 /iotdb/conf/iotdb-common.properties \
+  && sed -i 's/dn_internal_address=127.0.0.1/dn_internal_address=0.0.0.0/g' 
/iotdb/conf/iotdb-system.properties \
+  && sed -i 's/cn_internal_address=127.0.0.1/cn_internal_address=0.0.0.0/g' 
/iotdb/conf/iotdb-system.properties \
+  && sed -i 
's/cn_seed_config_node=127.0.0.1:10710/cn_seed_config_node=0.0.0.0:10710/g' 
/iotdb/conf/iotdb-system.properties \
+  && sed -i 
's/dn_seed_config_node=127.0.0.1:10710/dn_seed_config_node=0.0.0.0:10710/g' 
/iotdb/conf/iotdb-system.properties \
+  && sed -i 's/# 
config_node_consensus_protocol_class=org.apache.iotdb.consensus.ratis.RatisConsensus/config_node_consensus_protocol_class=org.apache.iotdb.consensus.simple.SimpleConsensus/g'
 /iotdb/conf/iotdb-system.properties \
+  && sed -i 's/# 
schema_region_consensus_protocol_class=org.apache.iotdb.consensus.ratis.RatisConsensus/schema_region_consensus_protocol_class=org.apache.iotdb.consensus.simple.SimpleConsensus/g'
 /iotdb/conf/iotdb-system.properties \
+  && sed -i 's/# 
data_region_consensus_protocol_class=org.apache.iotdb.consensus.iot.IoTConsensus/data_region_consensus_protocol_class=org.apache.iotdb.consensus.simple.SimpleConsensus/g'
 /iotdb/conf/iotdb-system.properties \
   && apt remove unzip -y \
   && apt autoremove -y \
   && apt purge --auto-remove -y \
diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/ClusterConstant.java
 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/ClusterConstant.java
index b827d01e504..b1eff829299 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/ClusterConstant.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/ClusterConstant.java
@@ -118,6 +118,7 @@ public class ClusterConstant {
   public static final String CONFIG_NODE_PROPERTIES_FILE = 
"iotdb-confignode.properties";
   public static final String DATA_NODE_PROPERTIES_FILE = 
"iotdb-datanode.properties";
   public static final String COMMON_PROPERTIES_FILE = 
"iotdb-common.properties";
+  public static final String IOTDB_SYSTEM_PROPERTIES_FILE = 
"iotdb-system.properties";
 
   public static final String SYSTEM_PROPERTIES_FILE = "system.properties";
   public static final String CONFIG_NODE_SYSTEM_PROPERTIES_FILE = 
"confignode-system.properties";
diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppBaseConfig.java
 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppBaseConfig.java
index 04e5dae8872..473d2f1b64c 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppBaseConfig.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppBaseConfig.java
@@ -97,7 +97,7 @@ public abstract class MppBaseConfig {
    * @throws IOException if properties storage failed.
    */
   public final void persistent(String filePath) throws IOException {
-    try (FileWriter confOutput = new FileWriter(filePath)) {
+    try (FileWriter confOutput = new FileWriter(filePath, true)) {
       properties.store(confOutput, null);
     }
   }
diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java
 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java
index ab14613fc41..fa5447bc5b0 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java
@@ -301,8 +301,8 @@ public abstract class AbstractNodeWrapper implements 
BaseNodeWrapper {
       outputNodeConfig.updateProperties(immutableNodeProperties);
 
       // Persistent
-      outputCommonConfig.persistent(getTargetCommonConfigPath());
-      outputNodeConfig.persistent(getTargetNodeConfigPath());
+      outputCommonConfig.persistent(getSystemConfigPath());
+      outputNodeConfig.persistent(getSystemConfigPath());
     } catch (IOException ex) {
       throw new AssertionError("Change the config of node failed. " + ex);
     }
@@ -662,9 +662,7 @@ public abstract class AbstractNodeWrapper implements 
BaseNodeWrapper {
 
   protected abstract void renameFile();
 
-  protected abstract String getTargetNodeConfigPath();
-
-  protected abstract String getTargetCommonConfigPath();
+  protected abstract String getSystemConfigPath();
 
   /** Return the node config file path specified through system variable */
   protected abstract String getDefaultNodeConfigPath();
diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/ConfigNodeWrapper.java
 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/ConfigNodeWrapper.java
index 8cbffe06060..a457149f598 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/ConfigNodeWrapper.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/ConfigNodeWrapper.java
@@ -33,17 +33,16 @@ import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.CN_CONNECTION_TIME
 import static org.apache.iotdb.it.env.cluster.ClusterConstant.CN_CONSENSUS_DIR;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.CN_METRIC_IOTDB_REPORTER_HOST;
 import static org.apache.iotdb.it.env.cluster.ClusterConstant.CN_SYSTEM_DIR;
-import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.COMMON_PROPERTIES_FILE;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.CONFIG_NODE_CONSENSUS_PROTOCOL_CLASS;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.CONFIG_NODE_INIT_HEAP_SIZE;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.CONFIG_NODE_MAX_DIRECT_MEMORY_SIZE;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.CONFIG_NODE_MAX_HEAP_SIZE;
-import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.CONFIG_NODE_PROPERTIES_FILE;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.CONFIG_NODE_SYSTEM_PROPERTIES_FILE;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.DATA_REGION_CONSENSUS_PROTOCOL_CLASS;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.DATA_REPLICATION_FACTOR;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.DEFAULT_CONFIG_NODE_COMMON_PROPERTIES;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.DEFAULT_CONFIG_NODE_PROPERTIES;
+import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.IOTDB_SYSTEM_PROPERTIES_FILE;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.SCHEMA_REGION_CONSENSUS_PROTOCOL_CLASS;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.SCHEMA_REPLICATION_FACTOR;
 import static org.apache.iotdb.it.env.cluster.ClusterConstant.TARGET;
@@ -90,13 +89,8 @@ public class ConfigNodeWrapper extends AbstractNodeWrapper {
   }
 
   @Override
-  protected String getTargetNodeConfigPath() {
-    return workDirFilePath("conf", CONFIG_NODE_PROPERTIES_FILE);
-  }
-
-  @Override
-  protected String getTargetCommonConfigPath() {
-    return workDirFilePath("conf", COMMON_PROPERTIES_FILE);
+  protected String getSystemConfigPath() {
+    return workDirFilePath("conf", IOTDB_SYSTEM_PROPERTIES_FILE);
   }
 
   @Override
diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/DataNodeWrapper.java
 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/DataNodeWrapper.java
index e6d16f9860b..1135f5cd055 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/DataNodeWrapper.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/DataNodeWrapper.java
@@ -29,13 +29,11 @@ import java.util.Arrays;
 import java.util.List;
 
 import static org.apache.iotdb.consensus.ConsensusFactory.SIMPLE_CONSENSUS;
-import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.COMMON_PROPERTIES_FILE;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.CONFIG_NODE_CONSENSUS_PROTOCOL_CLASS;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.DATANODE_INIT_HEAP_SIZE;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.DATANODE_MAX_DIRECT_MEMORY_SIZE;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.DATANODE_MAX_HEAP_SIZE;
 import static org.apache.iotdb.it.env.cluster.ClusterConstant.DATA_NODE_NAME;
-import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.DATA_NODE_PROPERTIES_FILE;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.DATA_REGION_CONSENSUS_PROTOCOL_CLASS;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.DATA_REPLICATION_FACTOR;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.DEFAULT_DATA_NODE_COMMON_PROPERTIES;
@@ -53,6 +51,7 @@ import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.DN_SYNC_DIR;
 import static org.apache.iotdb.it.env.cluster.ClusterConstant.DN_SYSTEM_DIR;
 import static org.apache.iotdb.it.env.cluster.ClusterConstant.DN_TRACING_DIR;
 import static org.apache.iotdb.it.env.cluster.ClusterConstant.DN_WAL_DIRS;
+import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.IOTDB_SYSTEM_PROPERTIES_FILE;
 import static org.apache.iotdb.it.env.cluster.ClusterConstant.MAIN_CLASS_NAME;
 import static 
org.apache.iotdb.it.env.cluster.ClusterConstant.MAX_TSBLOCK_SIZE_IN_BYTES;
 import static org.apache.iotdb.it.env.cluster.ClusterConstant.MQTT_HOST;
@@ -124,13 +123,8 @@ public class DataNodeWrapper extends AbstractNodeWrapper {
   }
 
   @Override
-  protected String getTargetNodeConfigPath() {
-    return workDirFilePath("conf", DATA_NODE_PROPERTIES_FILE);
-  }
-
-  @Override
-  protected String getTargetCommonConfigPath() {
-    return workDirFilePath("conf", COMMON_PROPERTIES_FILE);
+  protected String getSystemConfigPath() {
+    return workDirFilePath("conf", IOTDB_SYSTEM_PROPERTIES_FILE);
   }
 
   @Override
diff --git a/iotdb-client/cli/src/assembly/resources/tools/backup.bat 
b/iotdb-client/cli/src/assembly/resources/tools/backup.bat
index 13178b7f9bb..01be45f9ca0 100644
--- a/iotdb-client/cli/src/assembly/resources/tools/backup.bat
+++ b/iotdb-client/cli/src/assembly/resources/tools/backup.bat
@@ -38,7 +38,12 @@ IF EXIST "%IOTDB_CONF%\datanode-env.bat" (
   echo Can't find datanode-env.bat
 )
 
-IF EXIST "%IOTDB_CONF%\iotdb-datanode.properties" (
+IF EXIST "%IOTDB_CONF%\iotdb-system.properties" (
+  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^dn_rpc_port"
+    "%IOTDB_CONF%\iotdb-system.properties"') do (
+      set dn_rpc_port=%%i
+  )
+) ELSE IF EXIST "%IOTDB_CONF%\iotdb-datanode.properties" (
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^dn_rpc_port"
     "%IOTDB_CONF%\iotdb-datanode.properties"') do (
       set dn_rpc_port=%%i
diff --git a/iotdb-client/cli/src/assembly/resources/tools/backup.sh 
b/iotdb-client/cli/src/assembly/resources/tools/backup.sh
index 43a6f171371..7ef5cdc5777 100644
--- a/iotdb-client/cli/src/assembly/resources/tools/backup.sh
+++ b/iotdb-client/cli/src/assembly/resources/tools/backup.sh
@@ -70,7 +70,12 @@ get_properties_value() {
     local file_name=$1
     local property_name=$2
     local default_value=$3
-    local property_value=$(sed "/^${property_name}=/!d;s/.*=//" 
"${IOTDB_HOME}/conf/${file_name}.properties")
+    if [ -f "${IOTDB_HOME}/conf/iotdb-system.properties" ]; then
+            local file_path="${IOTDB_HOME}/conf/iotdb-system.properties"
+    else
+            local file_path="${IOTDB_HOME}/conf/${file_name}.properties"
+    fi
+    local property_value=$(sed "/^${property_name}=/!d;s/.*=//" "${file_path}")
     if [ -z "$property_value" ]; then
             property_value="$default_value"
     fi
diff --git a/iotdb-client/cli/src/assembly/resources/tools/collect-info.bat 
b/iotdb-client/cli/src/assembly/resources/tools/collect-info.bat
index 0c87d0cba99..246228b9187 100644
--- a/iotdb-client/cli/src/assembly/resources/tools/collect-info.bat
+++ b/iotdb-client/cli/src/assembly/resources/tools/collect-info.bat
@@ -46,7 +46,11 @@ set "passwd_param=root"
 set "host_param=127.0.0.1"
 set "port_param=6667"
 
-set "properties_file=%IOTDB_HOME%\conf\iotdb-datanode.properties"
+if exist "%IOTDB_HOME%\conf\iotdb-system.properties" (
+  set "properties_file=%IOTDB_HOME%\conf\iotdb-system.properties"
+) else (
+  set "properties_file=%IOTDB_HOME%\conf\iotdb-datanode.properties"
+)
 set "key=dn_data_dirs"
 
 for /f "usebackq tokens=1,* delims==" %%a in ("%properties_file%") do (
diff --git a/iotdb-client/cli/src/assembly/resources/tools/collect-info.sh 
b/iotdb-client/cli/src/assembly/resources/tools/collect-info.sh
index a01714b289d..1926309374a 100644
--- a/iotdb-client/cli/src/assembly/resources/tools/collect-info.sh
+++ b/iotdb-client/cli/src/assembly/resources/tools/collect-info.sh
@@ -85,7 +85,11 @@ choose_unit() {
     echo "$unit"
 }
 
-properties_file="$IOTDB_HOME/conf/iotdb-datanode.properties"
+if [ -f "$IOTDB_HOME/conf/iotdb-system.properties" ]; then
+  properties_file="$IOTDB_HOME/conf/iotdb-system.properties"
+else
+  properties_file="$IOTDB_HOME/conf/iotdb-datanode.properties"
+fi
 data_dir_key="dn_data_dirs"
 value=$(get_property_value "$properties_file" "$data_dir_key")
 if [ -n "$value" ]; then
diff --git 
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/IoTDBDataBackTool.java 
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/IoTDBDataBackTool.java
index c9d9df6aae6..b84a2e30a4c 100644
--- 
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/IoTDBDataBackTool.java
+++ 
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/IoTDBDataBackTool.java
@@ -19,8 +19,8 @@
 
 package org.apache.iotdb.tool;
 
+import org.apache.iotdb.commons.conf.CommonConfig;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
-import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 
 import org.slf4j.Logger;
@@ -62,8 +62,6 @@ public class IoTDBDataBackTool {
   static String targetWalDirParam = "";
   static String remoteDnDataDir = "";
 
-  static String DATA_NODE_CONF_NAME = IoTDBConfig.CONFIG_NAME;
-  static String CONFIG_NODE_CONF_NAME = "iotdb-confignode.properties";
   static AtomicInteger fileCount = new AtomicInteger(0);
   static AtomicInteger targetFileCount = new AtomicInteger(0);
   static AtomicInteger processFileCount = new AtomicInteger(0);
@@ -177,10 +175,10 @@ public class IoTDBDataBackTool {
     System.setProperty("IOTDB_HOME", System.getenv("IOTDB_HOME"));
     argsParse(args);
     File sourceDir = new File(sourcePath);
-    Properties dataProperties = getProperties(IoTDBConfig.CONFIG_NAME);
-    initDataNodeProperties(dataProperties);
-    Properties configProperties = getProperties(CONFIG_NODE_CONF_NAME);
-    initConfigNodeProperties(configProperties);
+
+    Properties properties = getProperties(CommonConfig.SYSTEM_CONFIG_NAME);
+    initDataNodeProperties(properties);
+    initConfigNodeProperties(properties);
 
     StringBuilder targetDirString = new StringBuilder();
     Map<String, String> copyMap = new HashMap<>();
@@ -215,7 +213,7 @@ public class IoTDBDataBackTool {
                 + File.separatorChar
                 + "conf"
                 + File.separatorChar
-                + CONFIG_NODE_CONF_NAME,
+                + CommonConfig.SYSTEM_CONFIG_NAME,
             cnMapProperties);
       } else if (nodeTypeParam.equalsIgnoreCase("datanode")) {
         countDataNodeFile(targetDirString.toString(), copyMap, dnDataDirsMap, 
dnMapProperties);
@@ -237,7 +235,7 @@ public class IoTDBDataBackTool {
                 + File.separatorChar
                 + "conf"
                 + File.separatorChar
-                + DATA_NODE_CONF_NAME,
+                + CommonConfig.SYSTEM_CONFIG_NAME,
             dnMapProperties);
       } else if (nodeTypeParam.equalsIgnoreCase("all") || 
nodeTypeParam.isEmpty()) {
         countConfigNodeFile(targetDirString.toString(), copyMap, 
cnMapProperties);
@@ -260,14 +258,14 @@ public class IoTDBDataBackTool {
                 + File.separatorChar
                 + "conf"
                 + File.separatorChar
-                + CONFIG_NODE_CONF_NAME,
+                + CommonConfig.SYSTEM_CONFIG_NAME,
             cnMapProperties);
         propertiesFileUpdate(
             targetDirString.toString()
                 + File.separatorChar
                 + "conf"
                 + File.separatorChar
-                + DATA_NODE_CONF_NAME,
+                + CommonConfig.SYSTEM_CONFIG_NAME,
             dnMapProperties);
       }
 
@@ -293,7 +291,7 @@ public class IoTDBDataBackTool {
                 + File.separatorChar
                 + "conf"
                 + File.separatorChar
-                + CONFIG_NODE_CONF_NAME,
+                + CommonConfig.SYSTEM_CONFIG_NAME,
             cnMapProperties);
       } else if (nodeTypeParam.equalsIgnoreCase("datanode")) {
         countNodeBack(targetDirString.toString(), copyMap);
@@ -313,7 +311,7 @@ public class IoTDBDataBackTool {
                 + File.separatorChar
                 + "conf"
                 + File.separatorChar
-                + DATA_NODE_CONF_NAME,
+                + CommonConfig.SYSTEM_CONFIG_NAME,
             dnMapProperties);
       } else if (nodeTypeParam.equalsIgnoreCase("all") || 
nodeTypeParam.isEmpty()) {
         countNodeBack(targetDirString.toString(), copyMap);
@@ -335,14 +333,14 @@ public class IoTDBDataBackTool {
                 + File.separatorChar
                 + "conf"
                 + File.separatorChar
-                + CONFIG_NODE_CONF_NAME,
+                + CommonConfig.SYSTEM_CONFIG_NAME,
             cnMapProperties);
         propertiesFileUpdate(
             targetDirString.toString()
                 + File.separatorChar
                 + "conf"
                 + File.separatorChar
-                + DATA_NODE_CONF_NAME,
+                + CommonConfig.SYSTEM_CONFIG_NAME,
             dnMapProperties);
       }
     }
@@ -444,10 +442,9 @@ public class IoTDBDataBackTool {
 
   private static void countNodeBack(String targetDirString, Map<String, 
String> copyMap) {
     File sourceDir = new File(sourcePath);
-    Properties dataProperties = getProperties(IoTDBConfig.CONFIG_NAME);
-    initDataNodeProperties(dataProperties);
-    Properties configProperties = getProperties(CONFIG_NODE_CONF_NAME);
-    initConfigNodeProperties(configProperties);
+    Properties properties = getProperties(CommonConfig.SYSTEM_CONFIG_NAME);
+    initDataNodeProperties(properties);
+    initConfigNodeProperties(properties);
 
     copyMap.put(
         sourceDir.getAbsolutePath() + File.separatorChar + ".env",
@@ -495,7 +492,7 @@ public class IoTDBDataBackTool {
       Map<String, String> copyMap,
       Map<String, String> dnDataDirsMap,
       Map<String, String> dnMapProperties) {
-    Properties dataProperties = getProperties(IoTDBConfig.CONFIG_NAME);
+    Properties dataProperties = getProperties(CommonConfig.SYSTEM_CONFIG_NAME);
     initDataNodeProperties(dataProperties);
 
     String dnSystemDir = dataProperties.getProperty("dn_system_dir");
@@ -593,7 +590,7 @@ public class IoTDBDataBackTool {
 
   private static void countConfigNodeFile(
       String targetDirString, Map<String, String> copyMap, Map<String, String> 
cnMapProperties) {
-    Properties configProperties = getProperties(CONFIG_NODE_CONF_NAME);
+    Properties configProperties = 
getProperties(CommonConfig.SYSTEM_CONFIG_NAME);
     initConfigNodeProperties(configProperties);
 
     String bakCnSystemDir = targetDirString + File.separatorChar + 
DEFAULT_CN_SYSTEM_DIR;
diff --git a/iotdb-core/confignode/src/assembly/confignode.xml 
b/iotdb-core/confignode/src/assembly/confignode.xml
index 7e858de63a0..242e3fb810d 100644
--- a/iotdb-core/confignode/src/assembly/confignode.xml
+++ b/iotdb-core/confignode/src/assembly/confignode.xml
@@ -44,8 +44,8 @@
     </fileSets>
     <files>
         <file>
-            
<source>${maven.multiModuleProjectDirectory}/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-common.properties</source>
-            <destName>conf/iotdb-common.properties</destName>
+            
<source>${maven.multiModuleProjectDirectory}/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties</source>
+            <destName>conf/iotdb-system.properties</destName>
         </file>
         <file>
             
<source>${maven.multiModuleProjectDirectory}/iotdb-core/node-commons/src/assembly/resources/sbin/iotdb-common.sh</source>
diff --git 
a/iotdb-core/confignode/src/assembly/resources/conf/iotdb-confignode.properties 
b/iotdb-core/confignode/src/assembly/resources/conf/iotdb-confignode.properties
deleted file mode 100644
index 8257cc04029..00000000000
--- 
a/iotdb-core/confignode/src/assembly/resources/conf/iotdb-confignode.properties
+++ /dev/null
@@ -1,147 +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.
-#
-
-####################
-### Config Node RPC Configuration
-####################
-
-# Used for RPC communication inside cluster.
-# Could set 127.0.0.1(for local test) or ipv4 address.
-# Datatype: String
-cn_internal_address=127.0.0.1
-
-# Used for RPC communication inside cluster.
-# Datatype: int
-cn_internal_port=10710
-
-# Used for consensus communication among ConfigNodes inside cluster.
-# Datatype: int
-cn_consensus_port=10720
-
-####################
-### Seed ConfigNode
-####################
-
-# For the first ConfigNode to start, cn_seed_config_node points to its own 
cn_internal_address:cn_internal_port.
-# For other ConfigNodes that to join the cluster, cn_seed_config_node points 
to any running ConfigNode's cn_internal_address:cn_internal_port.
-# Note: After this ConfigNode successfully joins the cluster for the first 
time, this parameter is no longer used.
-# Each node automatically maintains the list of ConfigNodes and traverses 
connections when restarting.
-# Format: address:port   e.g. 127.0.0.1:10710
-# Datatype: String
-cn_seed_config_node=127.0.0.1:10710
-
-####################
-### Directory configuration
-####################
-
-# system dir
-# If this property is unset, system will save the data in the default relative 
path directory under the confignode folder(i.e., 
%CONFIGNODE_HOME%/data/confignode/system).
-# If it is absolute, system will save the data in exact location it points to.
-# If it is relative, system will save the data in the relative path directory 
it indicates under the confignode folder.
-# For windows platform
-# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
-# cn_system_dir=data\\confignode\\system
-# For Linux platform
-# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
-# cn_system_dir=data/confignode/system
-
-# consensus dir
-# If this property is unset, system will save the data in the default relative 
path directory under the confignode folder(i.e., 
%CONFIGNODE_HOME%/data/confignode/consensus).
-# If it is absolute, system will save the data in exact location it points to.
-# If it is relative, system will save the data in the relative path directory 
it indicates under the confignode folder.
-# Note: If data_dir is assigned an empty string(i.e.,zero-size), it will be 
handled as a relative path.
-# For windows platform
-# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
-# cn_consensus_dir=data\\confignode\\consensus
-# For Linux platform
-# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
-# cn_consensus_dir=data/confignode/consensus
-
-# pipe_receiver_file_dir
-# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., 
%IOTDB_HOME%/${cn_system_dir}/pipe/receiver).
-# If it is absolute, system will save the data in the exact location it points 
to.
-# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
-# Note: If pipe_receiver_file_dir is assigned an empty string(i.e.,zero-size), 
it will be handled as a relative path.
-# For windows platform
-# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
-# pipe_receiver_file_dir=data\\confignode\\system\\pipe\\receiver
-# For Linux platform
-# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
-# pipe_receiver_file_dir=data/confignode/system/pipe/receiver
-
-####################
-### thrift rpc configuration
-####################
-
-# this feature is under development, set this as false before it is done.
-# Datatype: boolean
-# cn_rpc_thrift_compression_enable=false
-
-# if true, a snappy based compression method will be called before sending 
data by the network
-# Datatype: boolean
-# this feature is under development, set this as false before it is done.
-# cn_rpc_advanced_compression_enable=false
-
-# Datatype: int
-# cn_rpc_max_concurrent_client_num=65535
-
-# thrift max frame size, 512MB by default
-# Datatype: int
-# cn_thrift_max_frame_size=536870912
-
-# thrift init buffer size
-# Datatype: int
-# cn_thrift_init_buffer_size=1024
-
-# Thrift socket and connection timeout between raft nodes, in milliseconds.
-# Datatype: int
-# cn_connection_timeout_ms=60000
-
-# selector thread (TAsyncClientManager) nums for async thread in a 
clientManager
-# Datatype: int
-# cn_selector_thread_nums_of_client_manager=1
-
-# The maximum number of clients that can be allocated for a node in a 
clientManager.
-# when the number of the client to a single node exceeds this number, the 
thread for applying for a client will be blocked
-# for a while, then ClientManager will throw ClientManagerException if there 
are no clients after the block time.
-# Datatype: int
-# cn_max_client_count_for_each_node_in_client_manager=300
-
-####################
-### Metric Configuration
-####################
-
-# The reporters of metric module to report metrics
-# If there are more than one reporter, please separate them by commas ",".
-# Options: [JMX, PROMETHEUS]
-# Datatype: String
-# cn_metric_reporter_list=
-
-# The level of metric module
-# Options: [OFF, CORE, IMPORTANT, NORMAL, ALL]
-# Datatype: String
-# cn_metric_level=CORE
-
-# The period of async collection of some metrics in second
-# Datatype: int
-# cn_metric_async_collect_period=5
-
-# The port of prometheus reporter of metric module
-# Datatype: int
-# cn_metric_prometheus_reporter_port=9091
\ No newline at end of file
diff --git 
a/iotdb-core/confignode/src/assembly/resources/sbin/start-confignode.bat 
b/iotdb-core/confignode/src/assembly/resources/sbin/start-confignode.bat
index 532c7993305..98399a9990b 100644
--- a/iotdb-core/confignode/src/assembly/resources/sbin/start-confignode.bat
+++ b/iotdb-core/confignode/src/assembly/resources/sbin/start-confignode.bat
@@ -83,26 +83,30 @@ IF EXIST "%CONFIGNODE_CONF%\confignode-env.bat" (
     )
 
 @REM CHECK THE PORT USAGES
-IF EXIST "%CONFIGNODE_CONF%\iotdb-confignode.properties" (
+@REM SET CONFIG FILE
+IF EXIST "%CONFIGNODE_CONF%\iotdb-system.properties" (
+  set CONFIG_FILE="%CONFIGNODE_CONF%\iotdb-system.properties"
+) ELSE IF EXIST "%CONFIGNODE_HOME%\conf\iotdb-system.properties" (
+  set CONFIG_FILE="%CONFIGNODE_HOME%\conf\iotdb-system.properties"
+) ELSE IF EXIST "%CONFIGNODE_CONF%\iotdb-confignode.properties" (
+  set CONFIG_FILE="%CONFIGNODE_CONF%\iotdb-confignode.properties"
+) ELSE IF EXIST "%CONFIGNODE_HOME%\conf\iotdb-confignode.properties" (
+  set CONFIG_FILE="%CONFIGNODE_HOME%\conf\iotdb-confignode.properties"
+) ELSE (
+  set CONFIG_FILE=
+)
+
+IF DEFINED CONFIG_FILE (
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^cn_internal_port"
-    "%CONFIGNODE_CONF%\iotdb-confignode.properties"') do (
+    "%CONFIG_FILE%"') do (
       set cn_internal_port=%%i
   )
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^cn_consensus_port"
-    "%CONFIGNODE_CONF%\iotdb-confignode.properties"') do (
+    "%CONFIG_FILE%"') do (
       set cn_consensus_port=%%i
   )
-) ELSE IF EXIST "%CONFIGNODE_HOME%\conf\iotdb-confignode.properties" (
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^cn_internal_port"
-      "%CONFIGNODE_HOME%\conf\iotdb-confignode.properties"') do (
-        set cn_internal_port=%%i
-  )
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^cn_consensus_port"
-      "%CONFIGNODE_HOME%\conf\iotdb-confignode.properties"') do (
-        set cn_consensus_port=%%i
-  )
 ) ELSE (
-  echo "Can't find iotdb-confignode.properties, check the default ports"
+  echo "Can't find iotdb-system.properties or iotdb-confignode.properties, 
check the default ports"
   set cn_internal_port=10710
   set cn_consensus_port=10720
 )
diff --git 
a/iotdb-core/confignode/src/assembly/resources/sbin/stop-confignode.bat 
b/iotdb-core/confignode/src/assembly/resources/sbin/stop-confignode.bat
index c82a095ec1f..e6976426688 100644
--- a/iotdb-core/confignode/src/assembly/resources/sbin/stop-confignode.bat
+++ b/iotdb-core/confignode/src/assembly/resources/sbin/stop-confignode.bat
@@ -22,15 +22,21 @@
 set current_dir=%~dp0
 set superior_dir=%current_dir%\..\
 
+IF EXIST "%superior%\conf\iotdb-system.properties" (
+  set config_file="%superior_dir%\conf\iotdb-system.properties"
+) ELSE (
+  set config_file="%superior_dir%\conf\iotdb-confignode.properties"
+)
+
 for /f  "eol=; tokens=2,2 delims==" %%i in ('findstr /i "^cn_internal_port"
-"%superior_dir%\conf\iotdb-confignode.properties"') do (
+"%config_file%"') do (
   set cn_internal_port=%%i
 )
 
 echo "check whether the cn_internal_port is used..., port is 
%cn_internal_port%"
 
 for /f  "eol=; tokens=2,2 delims==" %%i in ('findstr /i "cn_internal_address"
-"%superior_dir%\conf\iotdb-confignode.properties"') do (
+"%config_file%"') do (
   set cn_internal_address=%%i
 )
 
diff --git 
a/iotdb-core/confignode/src/assembly/resources/sbin/stop-confignode.sh 
b/iotdb-core/confignode/src/assembly/resources/sbin/stop-confignode.sh
index c9467faec55..5604afd3d32 100644
--- a/iotdb-core/confignode/src/assembly/resources/sbin/stop-confignode.sh
+++ b/iotdb-core/confignode/src/assembly/resources/sbin/stop-confignode.sh
@@ -19,7 +19,13 @@
 #
 
 CONFIGNODE_CONF="$(dirname "$0")/../conf"
-cn_internal_port=$(sed '/^cn_internal_port=/!d;s/.*=//' 
"${CONFIGNODE_CONF}"/iotdb-confignode.properties)
+
+if [ -f "${CONFIGNODE_CONF}/iotdb-system.properties" ]; then
+    cn_internal_port=$(sed '/^cn_internal_port=/!d;s/.*=//' 
"${CONFIGNODE_CONF}"/iotdb-system.properties)
+else
+    cn_internal_port=$(sed '/^cn_internal_port=/!d;s/.*=//' 
"${CONFIGNODE_CONF}"/iotdb-confignode.properties)
+fi
+
 
 echo Check whether the internal_port is used..., port is "$cn_internal_port"
 
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConstant.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConstant.java
index ca521e3a73c..5724eb1862f 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConstant.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConstant.java
@@ -25,7 +25,6 @@ public class ConfigNodeConstant {
   public static final String CONFIGNODE_CONF = "CONFIGNODE_CONF";
   public static final String CONFIGNODE_HOME = "CONFIGNODE_HOME";
 
-  public static final String CONF_FILE_NAME = "iotdb-confignode.properties";
   public static final String SYSTEM_FILE_NAME = "confignode-system.properties";
 
   public static final String CONFIGNODE_PACKAGE = 
"org.apache.iotdb.confignode.service";
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java
index ee9621d2393..ce713b2e0e8 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.confignode.conf;
 
 import org.apache.iotdb.commons.conf.CommonConfig;
 import org.apache.iotdb.commons.conf.CommonDescriptor;
+import org.apache.iotdb.commons.conf.ConfigFileAutoUpdateTool;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.BadNodeUrlException;
 import org.apache.iotdb.commons.schema.SchemaConstant;
@@ -36,7 +37,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -54,6 +54,19 @@ public class ConfigNodeDescriptor {
 
   private final ConfigNodeConfig conf = new ConfigNodeConfig();
 
+  static {
+    ConfigFileAutoUpdateTool updateTool = new ConfigFileAutoUpdateTool();
+    URL systemConfigUrl = getPropsUrl(CommonConfig.SYSTEM_CONFIG_NAME);
+    URL configNodeUrl = getPropsUrl(CommonConfig.OLD_CONFIG_NODE_CONFIG_NAME);
+    URL dataNodeUrl = getPropsUrl(CommonConfig.OLD_DATA_NODE_CONFIG_NAME);
+    URL commonConfigUrl = getPropsUrl(CommonConfig.OLD_COMMON_CONFIG_NAME);
+    try {
+      updateTool.checkAndMayUpdate(systemConfigUrl, configNodeUrl, 
dataNodeUrl, commonConfigUrl);
+    } catch (Exception e) {
+      LOGGER.error("Failed to update config file", e);
+    }
+  }
+
   private ConfigNodeDescriptor() {
     loadProps();
   }
@@ -67,7 +80,7 @@ public class ConfigNodeDescriptor {
    *
    * @return url object if location exit, otherwise null.
    */
-  public URL getPropsUrl(String configFileName) {
+  public static URL getPropsUrl(String configFileName) {
     // Check if a config-directory was specified first.
     String urlString = System.getProperty(ConfigNodeConstant.CONFIGNODE_CONF, 
null);
     // If it wasn't, check if a home directory was provided
@@ -102,37 +115,12 @@ public class ConfigNodeDescriptor {
   }
 
   private void loadProps() {
-    URL url = getPropsUrl(CommonConfig.CONFIG_NAME);
     Properties commonProperties = new Properties();
-    if (url != null) {
-      try (InputStream inputStream = url.openStream()) {
-
-        LOGGER.info("Start to read config file {}", url);
-        commonProperties.load(new InputStreamReader(inputStream, 
StandardCharsets.UTF_8));
-
-      } catch (FileNotFoundException e) {
-        LOGGER.error("Fail to find config file {}, reject ConfigNode 
startup.", url, e);
-        System.exit(-1);
-      } catch (IOException e) {
-        LOGGER.error("Cannot load config file, reject ConfigNode startup.", e);
-        System.exit(-1);
-      } catch (Exception e) {
-        LOGGER.error("Incorrect format in config file, reject ConfigNode 
startup.", e);
-        System.exit(-1);
-      }
-    } else {
-      LOGGER.warn(
-          "Couldn't load the configuration {} from any of the known sources.",
-          CommonConfig.CONFIG_NAME);
-    }
-
-    url = getPropsUrl(ConfigNodeConstant.CONF_FILE_NAME);
+    URL url = getPropsUrl(CommonConfig.SYSTEM_CONFIG_NAME);
     if (url != null) {
       try (InputStream inputStream = url.openStream()) {
         LOGGER.info("start reading ConfigNode conf file: {}", url);
-        Properties properties = new Properties();
-        properties.load(new InputStreamReader(inputStream, 
StandardCharsets.UTF_8));
-        commonProperties.putAll(properties);
+        commonProperties.load(new InputStreamReader(inputStream, 
StandardCharsets.UTF_8));
         loadProperties(commonProperties);
       } catch (IOException | BadNodeUrlException e) {
         LOGGER.error("Couldn't load ConfigNode conf file, reject ConfigNode 
startup.", e);
@@ -142,7 +130,7 @@ public class ConfigNodeDescriptor {
         commonDescriptor
             .getConfig()
             .updatePath(System.getProperty(ConfigNodeConstant.CONFIGNODE_HOME, 
null));
-        MetricConfigDescriptor.getInstance().loadProps(commonProperties);
+        MetricConfigDescriptor.getInstance().loadProps(commonProperties, true);
         MetricConfigDescriptor.getInstance()
             .getMetricConfig()
             .updateRpcInstance(
@@ -151,7 +139,7 @@ public class ConfigNodeDescriptor {
     } else {
       LOGGER.warn(
           "Couldn't load the configuration {} from any of the known sources.",
-          ConfigNodeConstant.CONF_FILE_NAME);
+          CommonConfig.SYSTEM_CONFIG_NAME);
     }
   }
 
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/ClusterNodeStartUtils.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/ClusterNodeStartUtils.java
index 697dd65525d..13cd42393fa 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/ClusterNodeStartUtils.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/ClusterNodeStartUtils.java
@@ -25,8 +25,7 @@ import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
 import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
 import org.apache.iotdb.commons.cluster.NodeType;
-import org.apache.iotdb.commons.conf.IoTDBConstant;
-import org.apache.iotdb.confignode.conf.ConfigNodeConstant;
+import org.apache.iotdb.commons.conf.CommonConfig;
 import org.apache.iotdb.confignode.conf.ConfigNodeDescriptor;
 import org.apache.iotdb.confignode.manager.ConfigManager;
 import org.apache.iotdb.rpc.TSStatusCode;
@@ -56,11 +55,6 @@ public class ClusterNodeStartUtils {
 
   public static TSStatus confirmNodeRegistration(
       NodeType nodeType, String clusterName, Object nodeLocation, 
ConfigManager configManager) {
-
-    final String CONF_FILE_NAME =
-        NodeType.ConfigNode.equals(nodeType)
-            ? ConfigNodeConstant.CONF_FILE_NAME
-            : IoTDBConstant.DATA_NODE_CONF_FILE_NAME;
     TSStatus status = new TSStatus();
 
     /* Reject start if the cluster name is error */
@@ -77,8 +71,8 @@ public class ClusterNodeStartUtils {
               nodeType.getNodeType(),
               clusterName,
               CLUSTER_NAME,
-              CONF_FILE_NAME,
-              CONF_FILE_NAME));
+              CommonConfig.SYSTEM_CONFIG_NAME,
+              CommonConfig.SYSTEM_CONFIG_NAME));
       return status;
     }
 
@@ -116,7 +110,7 @@ public class ClusterNodeStartUtils {
               nodeType.getNodeType(),
               conflictEndPoints,
               nodeType.getNodeType(),
-              CONF_FILE_NAME));
+              CommonConfig.SYSTEM_CONFIG_NAME));
       return status;
     } else {
       /* Accept registration if all TEndPoints aren't conflict */
@@ -130,11 +124,6 @@ public class ClusterNodeStartUtils {
       int nodeId,
       Object nodeLocation,
       ConfigManager configManager) {
-
-    final String CONF_FILE_NAME =
-        NodeType.ConfigNode.equals(nodeType)
-            ? ConfigNodeConstant.CONF_FILE_NAME
-            : IoTDBConstant.DATA_NODE_CONF_FILE_NAME;
     TSStatus status = new TSStatus();
 
     /* Reject restart if the cluster name is error */
@@ -151,8 +140,8 @@ public class ClusterNodeStartUtils {
               nodeType.getNodeType(),
               clusterName,
               CLUSTER_NAME,
-              CONF_FILE_NAME,
-              CONF_FILE_NAME));
+              CommonConfig.SYSTEM_CONFIG_NAME,
+              CommonConfig.SYSTEM_CONFIG_NAME));
       return status;
     }
 
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
index 65ffa13614c..eb33b0d70eb 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
@@ -329,8 +329,7 @@ public class ConfigNode implements ConfigNodeMBean {
 
     TEndPoint seedConfigNode = CONF.getSeedConfigNode();
     if (seedConfigNode == null) {
-      LOGGER.error(
-          "Please set the cn_seed_config_node parameter in 
iotdb-confignode.properties file.");
+      LOGGER.error("Please set the cn_seed_config_node parameter in 
iotdb-system.properties file.");
       throw new StartupException("The seedConfigNode setting in conf is 
empty");
     }
 
diff --git 
a/iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-confignode.properties
 
b/iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-confignode.properties
deleted file mode 100644
index ade8959df99..00000000000
--- 
a/iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-confignode.properties
+++ /dev/null
@@ -1,31 +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.
-#
-
-cn_internal_address=127.0.0.1
-cn_internal_port=10710
-cn_consensus_port=10720
-cn_seed_config_node=127.0.0.1:10710
-cn_system_dir=target/confignode1/system
-cn_data_dirs=target/confignode1/data
-cn_consensus_dir=target/confignode1/consensus
-
-cn_metric_reporter_list=PROMETHEUS
-cn_metric_level=IMPORTANT
-cn_metric_async_collect_period=5
-cn_metric_prometheus_reporter_port=9091
\ No newline at end of file
diff --git 
a/iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-common.properties
 
b/iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-system.properties
similarity index 73%
rename from 
iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-common.properties
rename to 
iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-system.properties
index 8981b21285b..b396e373f86 100644
--- 
a/iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-common.properties
+++ 
b/iotdb-core/confignode/src/test/resources/confignode1conf/iotdb-system.properties
@@ -17,6 +17,19 @@
 # under the License.
 #
 
+cn_internal_address=127.0.0.1
+cn_internal_port=10710
+cn_consensus_port=10720
+cn_seed_config_node=127.0.0.1:10710
+cn_system_dir=target/confignode1/system
+cn_data_dirs=target/confignode1/data
+cn_consensus_dir=target/confignode1/consensus
+
+cn_metric_reporter_list=PROMETHEUS
+cn_metric_level=IMPORTANT
+cn_metric_async_collect_period=5
+cn_metric_prometheus_reporter_port=9091
+
 timestamp_precision=ms
 
data_region_consensus_protocol_class=org.apache.iotdb.consensus.iot.IoTConsensus
 
schema_region_consensus_protocol_class=org.apache.iotdb.consensus.ratis.RatisConsensus
diff --git 
a/iotdb-core/confignode/src/test/resources/confignode2conf/iotdb-confignode.properties
 
b/iotdb-core/confignode/src/test/resources/confignode2conf/iotdb-confignode.properties
deleted file mode 100644
index eabd45e89e9..00000000000
--- 
a/iotdb-core/confignode/src/test/resources/confignode2conf/iotdb-confignode.properties
+++ /dev/null
@@ -1,31 +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.
-#
-
-cn_internal_address=127.0.0.1
-cn_internal_port=10711
-cn_consensus_port=10721
-cn_seed_config_node=127.0.0.1:10710
-cn_system_dir=target/confignode2/system
-cn_data_dirs=target/confignode2/data
-cn_consensus_dir=target/confignode2/consensus
-
-cn_metric_reporter_list=PROMETHEUS
-cn_metric_level=IMPORTANT
-cn_metric_async_collect_period=5
-cn_metric_prometheus_reporter_port=9093
\ No newline at end of file
diff --git 
a/iotdb-core/confignode/src/test/resources/confignode2conf/iotdb-common.properties
 
b/iotdb-core/confignode/src/test/resources/confignode2conf/iotdb-system.properties
similarity index 73%
rename from 
iotdb-core/confignode/src/test/resources/confignode2conf/iotdb-common.properties
rename to 
iotdb-core/confignode/src/test/resources/confignode2conf/iotdb-system.properties
index a9789fedabb..ef3ba921f96 100644
--- 
a/iotdb-core/confignode/src/test/resources/confignode2conf/iotdb-common.properties
+++ 
b/iotdb-core/confignode/src/test/resources/confignode2conf/iotdb-system.properties
@@ -17,6 +17,19 @@
 # under the License.
 #
 
+cn_internal_address=127.0.0.1
+cn_internal_port=10711
+cn_consensus_port=10721
+cn_seed_config_node=127.0.0.1:10710
+cn_system_dir=target/confignode2/system
+cn_data_dirs=target/confignode2/data
+cn_consensus_dir=target/confignode2/consensus
+
+cn_metric_reporter_list=PROMETHEUS
+cn_metric_level=IMPORTANT
+cn_metric_async_collect_period=5
+cn_metric_prometheus_reporter_port=9093
+
 timestamp_precision=ms
 
data_region_consensus_protocol_class=org.apache.iotdb.consensus.iot.IoTConsensus
 
schema_region_consensus_protocol_class=org.apache.iotdb.consensus.ratis.RatisConsensus
diff --git 
a/iotdb-core/confignode/src/test/resources/confignode3conf/iotdb-confignode.properties
 
b/iotdb-core/confignode/src/test/resources/confignode3conf/iotdb-confignode.properties
deleted file mode 100644
index ad706b698ec..00000000000
--- 
a/iotdb-core/confignode/src/test/resources/confignode3conf/iotdb-confignode.properties
+++ /dev/null
@@ -1,31 +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.
-#
-
-cn_internal_address=127.0.0.1
-cn_internal_port=10712
-cn_consensus_port=10722
-cn_seed_config_node=127.0.0.1:10710
-cn_system_dir=target/confignode3/system
-cn_data_dirs=target/confignode3/data
-cn_consensus_dir=target/confignode3/consensus
-
-cn_metric_reporter_list=PROMETHEUS
-cn_metric_level=IMPORTANT
-cn_metric_async_collect_period=5
-cn_metric_prometheus_reporter_port=9095
\ No newline at end of file
diff --git 
a/iotdb-core/confignode/src/test/resources/confignode3conf/iotdb-common.properties
 
b/iotdb-core/confignode/src/test/resources/confignode3conf/iotdb-system.properties
similarity index 73%
rename from 
iotdb-core/confignode/src/test/resources/confignode3conf/iotdb-common.properties
rename to 
iotdb-core/confignode/src/test/resources/confignode3conf/iotdb-system.properties
index 6a95388bd72..48f99317a2f 100644
--- 
a/iotdb-core/confignode/src/test/resources/confignode3conf/iotdb-common.properties
+++ 
b/iotdb-core/confignode/src/test/resources/confignode3conf/iotdb-system.properties
@@ -17,6 +17,19 @@
 # under the License.
 #
 
+cn_internal_address=127.0.0.1
+cn_internal_port=10712
+cn_consensus_port=10722
+cn_seed_config_node=127.0.0.1:10710
+cn_system_dir=target/confignode3/system
+cn_data_dirs=target/confignode3/data
+cn_consensus_dir=target/confignode3/consensus
+
+cn_metric_reporter_list=PROMETHEUS
+cn_metric_level=IMPORTANT
+cn_metric_async_collect_period=5
+cn_metric_prometheus_reporter_port=9095
+
 timestamp_precision=ms
 
data_region_consensus_protocol_class=org.apache.iotdb.consensus.iot.IoTConsensus
 
schema_region_consensus_protocol_class=org.apache.iotdb.consensus.ratis.RatisConsensus
diff --git 
a/iotdb-core/datanode/src/assembly/resources/conf/iotdb-datanode.properties 
b/iotdb-core/datanode/src/assembly/resources/conf/iotdb-datanode.properties
deleted file mode 100644
index 949e3400750..00000000000
--- a/iotdb-core/datanode/src/assembly/resources/conf/iotdb-datanode.properties
+++ /dev/null
@@ -1,316 +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.
-#
-
-####################
-### Data Node RPC Configuration
-####################
-
-# Used for connection of IoTDB native clients(Session)
-# Could set 127.0.0.1(for local test) or ipv4 address
-# Datatype: String
-dn_rpc_address=0.0.0.0
-
-# Used for connection of IoTDB native clients(Session)
-# Bind with dn_rpc_address
-# Datatype: int
-dn_rpc_port=6667
-
-# Used for communication inside cluster.
-# could set 127.0.0.1(for local test) or ipv4 address.
-# Datatype: String
-dn_internal_address=127.0.0.1
-
-# Used for communication inside cluster.
-# Bind with dn_internal_address
-# Datatype: int
-dn_internal_port=10730
-
-# Port for data exchange among DataNodes inside cluster
-# Bind with dn_internal_address
-# Datatype: int
-dn_mpp_data_exchange_port=10740
-
-# port for consensus's communication for schema region inside cluster.
-# Bind with dn_internal_address
-# Datatype: int
-dn_schema_region_consensus_port=10750
-
-# port for consensus's communication for data region inside cluster.
-# Bind with dn_internal_address
-# Datatype: int
-dn_data_region_consensus_port=10760
-
-# Datatype: long
-# The time of data node waiting for the next retry to join into the cluster.
-# dn_join_cluster_retry_interval_ms=5000
-
-####################
-### SSL Configuration
-####################
-
-# Does dn_rpc_port enable SSL
-# enable_thrift_ssl=false
-
-# Rest Service enabled SSL
-# enable_https=false
-
-# SSL key store path
-# linux e.g. /home/iotdb/server.keystore (absolute path) or server.keystore 
(relative path)
-# windows e.g. C:\\iotdb\\server.keystore (absolute path) or server.keystore 
(relative path)
-# key_store_path=
-
-# SSL key store password
-# key_store_pwd=
-
-####################
-### Seed ConfigNode
-####################
-
-# dn_seed_config_node points to any running ConfigNode's 
cn_internal_address:cn_internal_port.
-# Note: After this DataNode successfully joins the cluster for the first time, 
this parameter is no longer used.
-# Each node automatically maintains the list of ConfigNodes and traverses 
connections when restarting.
-# Format: address:port   e.g. 127.0.0.1:10710
-# Datatype: String
-dn_seed_config_node=127.0.0.1:10710
-
-####################
-### Connection Configuration
-####################
-
-# The maximum session idle time. unit: ms
-# Idle sessions are the ones that performs neither query or non-query 
operations for a period of time
-# Set to 0 to disable session timeout
-# Datatype: int
-# dn_session_timeout_threshold=0
-
-# Datatype: boolean
-# dn_rpc_thrift_compression_enable=false
-
-# if true, a snappy based compression method will be called before sending 
data by the network
-# Datatype: boolean
-# this feature is under development, set this as false before it is done.
-# dn_rpc_advanced_compression_enable=false
-
-# Datatype: int
-# dn_rpc_selector_thread_count=1
-
-# Datatype: int
-# dn_rpc_min_concurrent_client_num=1
-
-# Datatype: int
-# dn_rpc_max_concurrent_client_num=65535
-
-# thrift max frame size, 512MB by default
-# Datatype: int
-# dn_thrift_max_frame_size=536870912
-
-# thrift init buffer size
-# Datatype: int
-# dn_thrift_init_buffer_size=1024
-
-# Thrift socket and connection timeout between raft nodes, in milliseconds.
-# Datatype: int
-# dn_connection_timeout_ms=60000
-
-# selector thread (TAsyncClientManager) nums for async thread in a 
clientManager
-# Datatype: int
-# dn_selector_thread_count_of_client_manager=1
-
-# The maximum number of clients that can be allocated for a node in a 
clientManager.
-# When the number of the client to a single node exceeds this number, the 
thread for applying for a client will be blocked
-# for a while, then ClientManager will throw ClientManagerException if there 
are no clients after the block time.
-# Datatype: int
-# dn_max_client_count_for_each_node_in_client_manager=300
-
-####################
-### Directory Configuration
-####################
-
-# system dir
-# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., %IOTDB_HOME%/data/datanode/system).
-# If it is absolute, system will save the data in exact location it points to.
-# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
-# For windows platform
-# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
-# dn_system_dir=data\\datanode\\system
-# For Linux platform
-# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
-# dn_system_dir=data/datanode/system
-
-
-# data dirs
-# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., %IOTDB_HOME%/data/datanode/data).
-# If it is absolute, system will save the data in exact location it points to.
-# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
-# If there are more than one directory, please separate them by commas ",".
-# Note: If data_dirs is assigned an empty string(i.e.,zero-size), it will be 
handled as a relative path.
-# For windows platform
-# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
-# dn_data_dirs=data\\datanode\\data
-# For Linux platform
-# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
-# dn_data_dirs=data/datanode/data
-
-
-# multi_dir_strategy
-# The strategy is used to choose a directory from data_dirs for the system to 
store a new tsfile.
-# System provides two strategies to choose from, or user can create his own 
strategy by extending 
org.apache.iotdb.db.conf.directories.strategy.DirectoryStrategy.
-# The info of the two strategies are as follows:
-# 1. SequenceStrategy: the system will choose the directory in sequence.
-# 2. MaxDiskUsableSpaceFirstStrategy: the system will choose the directory 
whose disk has the maximum space.
-# Set SequenceStrategy or MaxDiskUsableSpaceFirstStrategy to apply the 
corresponding strategy.
-# If this property is unset, system will use SequenceStrategy as default 
strategy.
-# For this property, fully-qualified class name (include package name) and 
simple class name are both acceptable.
-# dn_multi_dir_strategy=SequenceStrategy
-
-# consensus dir
-# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., %IOTDB_HOME%/data/datanode).
-# If it is absolute, system will save the data in the exact location it points 
to.
-# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
-# Note: If consensus_dir is assigned an empty string(i.e.,zero-size), it will 
be handled as a relative path.
-# For windows platform
-# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
-# dn_consensus_dir=data\\datanode\\consensus
-# For Linux platform
-# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
-# dn_consensus_dir=data/datanode/consensus
-
-# wal dirs
-# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., %IOTDB_HOME%/data/datanode).
-# If it is absolute, system will save the data in the exact location it points 
to.
-# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
-# If there are more than one directory, please separate them by commas ",".
-# Note: If wal_dirs is assigned an empty string(i.e.,zero-size), it will be 
handled as a relative path.
-# For windows platform
-# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
-# dn_wal_dirs=data\\datanode\\wal
-# For Linux platform
-# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
-# dn_wal_dirs=data/datanode/wal
-
-# tracing dir
-# Uncomment following fields to configure the tracing root directory.
-# For Windows platform, the index is as follows:
-# dn_tracing_dir=datanode\\tracing
-# For Linux platform
-# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
-# dn_tracing_dir=datanode/tracing
-
-# sync dir
-# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., %IOTDB_HOME%/data/datanode).
-# If it is absolute, system will save the data in the exact location it points 
to.
-# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
-# Note: If sync_dir is assigned an empty string(i.e.,zero-size), it will be 
handled as a relative path.
-# For windows platform
-# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
-# dn_sync_dir=data\\datanode\\sync
-# For Linux platform
-# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
-# dn_sync_dir=data/datanode/sync
-
-# sort_tmp_dir
-# This property is used to configure the temporary directory for sorting 
operation.
-# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., %IOTDB_HOME%/data/datanode).
-# If it is absolute, system will save the data in the exact location it points 
to.
-# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
-# Note: If sort_tmp_dir is assigned an empty string(i.e.,zero-size), it will 
be handled as a relative path.
-# For windows platform
-# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
-# sort_tmp_dir=data\\datanode\\tmp
-# For Linux platform
-# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
-# sort_tmp_dir=data/datanode/tmp
-
-# pipe_receiver_file_dirs
-# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., 
%IOTDB_HOME%/${dn_system_dir}/pipe/receiver).
-# If it is absolute, system will save the data in the exact location it points 
to.
-# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
-# If there are more than one directory, please separate them by commas ",".
-# Note: If pipe_receiver_file_dirs is assigned an empty 
string(i.e.,zero-size), it will be handled as a relative path.
-# For windows platform
-# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
-# pipe_receiver_file_dirs=data\\datanode\\system\\pipe\\receiver
-# For Linux platform
-# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
-# pipe_receiver_file_dirs=data/datanode/system/pipe/receiver
-
-####################
-### Metric Configuration
-####################
-
-# The reporters of metric module to report metrics
-# If there are more than one reporter, please separate them by commas ",".
-# Options: [JMX, PROMETHEUS]
-# Datatype: String
-# dn_metric_reporter_list=
-
-# The level of metric module
-# Options: [OFF, CORE, IMPORTANT, NORMAL, ALL]
-# Datatype: String
-# dn_metric_level=CORE
-
-# The period of async collection of some metrics in second
-# Datatype: int
-# dn_metric_async_collect_period=5
-
-# The port of prometheus reporter of metric module
-# Datatype: int
-dn_metric_prometheus_reporter_port=9092
-
-# The type of internal reporter in metric module, used for checking flushed 
point number
-# Options: [MEMORY, IOTDB]
-# Datatype: String
-# dn_metric_internal_reporter_type=MEMORY
-
-####################
-### REST Service Configuration
-####################
-
-# Is the REST service enabled
-# enable_rest_service=false
-
-# the binding port of the REST service
-# rest_service_port=18080
-
-# Whether to display rest service interface information through swagger. eg: 
http://ip:port/swagger.json
-# enable_swagger=false
-
-# the default row limit to a REST query response when the rowSize parameter is 
not given in request
-# rest_query_default_row_size_limit=10000
-
-# the expiration time of the user login information cache (in seconds)
-# cache_expire_in_seconds=28800
-
-# maximum number of users can be stored in the user login cache.
-# cache_max_num=100
-
-# init capacity of users can be stored in the user login cache.
-# cache_init_num=10
-
-# Is client authentication required
-# client_auth=false
-
-# SSL trust store path
-# trust_store_path=""
-
-# SSL trust store password.
-# trust_store_pwd=""
-
-# SSL timeout (in seconds)
-# idle_timeout_in_seconds=50000
diff --git a/iotdb-core/datanode/src/assembly/resources/sbin/start-datanode.bat 
b/iotdb-core/datanode/src/assembly/resources/sbin/start-datanode.bat
index 569374a89d2..c6fd64e8fb3 100755
--- a/iotdb-core/datanode/src/assembly/resources/sbin/start-datanode.bat
+++ b/iotdb-core/datanode/src/assembly/resources/sbin/start-datanode.bat
@@ -102,51 +102,43 @@ IF EXIST "%IOTDB_CONF%\datanode-env.bat" (
   echo "Can't find datanode-env.bat"
 )
 
+@REM SET CONFIG FILE
+IF EXIST "%IOTDB_CONF%\iotdb-system.properties" (
+  set CONFIG_FILE="%IOTDB_CONF%\iotdb-system.properties"
+) ELSE IF EXIST "%IOTDB_HOME%\conf\iotdb-system.properties" (
+  set CONFIG_FILE="%IOTDB_HOME%\conf\iotdb-system.properties"
+) ELSE IF EXIST "%IOTDB_CONF%\iotdb-datanode.properties" (
+  set CONFIG_FILE="%IOTDB_CONF%\iotdb-datanode.properties"
+) ELSE IF EXIST "%IOTDB_HOME%\conf\iotdb-datanode.properties" (
+  set CONFIG_FILE="%IOTDB_HOME%\conf\iotdb-datanode.properties"
+) ELSE (
+  set CONFIG_FILE=
+)
+
 @REM CHECK THE PORT USAGES
-IF EXIST "%IOTDB_CONF%\iotdb-datanode.properties" (
+IF DEFINED CONFIG_FILE (
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^dn_rpc_port"
-    "%IOTDB_CONF%\iotdb-datanode.properties"') do (
+    "%CONFIG_FILE%"') do (
       set dn_rpc_port=%%i
   )
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^dn_internal_port"
-    "%IOTDB_CONF%\iotdb-datanode.properties"') do (
+    "%CONFIG_FILE%"') do (
       set dn_internal_port=%%i
   )
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i 
"^dn_mpp_data_exchange_port"
-    "%IOTDB_CONF%\iotdb-datanode.properties"') do (
-      set dn_mpp_data_exchange_port=%%i
-  )
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i 
"^dn_schema_region_consensus_port"
-    "%IOTDB_CONF%\iotdb-datanode.properties"') do (
-      set dn_schema_region_consensus_port=%%i
-  )
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i 
"^dn_data_region_consensus_port"
-    "%IOTDB_CONF%\iotdb-datanode.properties"') do (
-      set dn_data_region_consensus_port=%%i
-  )
-) ELSE IF EXIST "%IOTDB_HOME%\conf\iotdb-datanode.properties" (
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^dn_rpc_port"
-      "%IOTDB_HOME%\conf\iotdb-datanode.properties"') do (
-        set dn_rpc_port=%%i
-  )
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^dn_internal_port"
-      "%IOTDB_HOME%\conf\iotdb-datanode.properties"') do (
-        set dn_internal_port=%%i
-  )
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i 
"^dn_mpp_data_exchange_port"
-    "%IOTDB_HOME%\conf\iotdb-datanode.properties"') do (
+    "%CONFIG_FILE%"') do (
       set dn_mpp_data_exchange_port=%%i
   )
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i 
"^dn_schema_region_consensus_port"
-    "%IOTDB_HOME%\conf\iotdb-datanode.properties"') do (
+    "%CONFIG_FILE%"') do (
       set dn_schema_region_consensus_port=%%i
   )
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i 
"^dn_data_region_consensus_port"
-    "%IOTDB_HOME%\conf\iotdb-datanode.properties"') do (
+    "%CONFIG_FILE%"') do (
       set dn_data_region_consensus_port=%%i
   )
 ) ELSE (
-  echo "Can't find iotdb-datanode.properties, check the default ports"
+  echo "Can't find iotdb-system.properties or iotdb-datanode.properties, check 
the default ports"
   set dn_rpc_port=6667
   set dn_internal_port=10730
   set dn_mpp_data_exchange_port=10740
diff --git a/iotdb-core/datanode/src/assembly/resources/sbin/stop-datanode.bat 
b/iotdb-core/datanode/src/assembly/resources/sbin/stop-datanode.bat
index 2197251570e..d249d427567 100644
--- a/iotdb-core/datanode/src/assembly/resources/sbin/stop-datanode.bat
+++ b/iotdb-core/datanode/src/assembly/resources/sbin/stop-datanode.bat
@@ -22,15 +22,21 @@
 set current_dir=%~dp0
 set superior_dir=%current_dir%\..\
 
+IF EXIST "%superior%\conf\iotdb-system.properties" (
+  set config_file="%superior_dir%\conf\iotdb-system.properties"
+) ELSE (
+  set config_file="%superior_dir%\conf\iotdb-datanode.properties"
+)
+
 for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^dn_rpc_port"
-"%superior_dir%\conf\iotdb-datanode.properties"') do (
+"%config_file%"') do (
   set dn_rpc_port=%%i
 )
 
 echo Check whether the rpc_port is used..., port is %dn_rpc_port%
 
 for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "dn_rpc_address"
-"%superior_dir%\conf\iotdb-datanode.properties"') do (
+"%config_file%"') do (
   set dn_rpc_address=%%i
 )
 
diff --git a/iotdb-core/datanode/src/assembly/resources/sbin/stop-datanode.sh 
b/iotdb-core/datanode/src/assembly/resources/sbin/stop-datanode.sh
index cb253f1a1ed..71bdcef0a82 100644
--- a/iotdb-core/datanode/src/assembly/resources/sbin/stop-datanode.sh
+++ b/iotdb-core/datanode/src/assembly/resources/sbin/stop-datanode.sh
@@ -19,7 +19,12 @@
 #
 
 DATANODE_CONF="`dirname "$0"`/../conf"
-dn_rpc_port=`sed '/^dn_rpc_port=/!d;s/.*=//' 
${DATANODE_CONF}/iotdb-datanode.properties`
+
+if [ -f "${DATANODE_CONF}/iotdb-system.properties" ]; then
+    dn_rpc_port=`sed '/^dn_rpc_port=/!d;s/.*=//' 
${DATANODE_CONF}/iotdb-system.properties`
+else
+    dn_rpc_port=`sed '/^dn_rpc_port=/!d;s/.*=//' 
${DATANODE_CONF}/iotdb-datanode.properties`
+fi
 
 force=""
 
diff --git a/iotdb-core/datanode/src/assembly/server.xml 
b/iotdb-core/datanode/src/assembly/server.xml
index b1a30259794..96bfdd92748 100644
--- a/iotdb-core/datanode/src/assembly/server.xml
+++ b/iotdb-core/datanode/src/assembly/server.xml
@@ -39,8 +39,8 @@
     </fileSets>
     <files>
         <file>
-            
<source>${maven.multiModuleProjectDirectory}/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-common.properties</source>
-            <destName>conf/iotdb-common.properties</destName>
+            
<source>${maven.multiModuleProjectDirectory}/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties</source>
+            <destName>conf/iotdb-system.properties</destName>
         </file>
         <!-- copy iotdb-common.sh to different script folders-->
         <file>
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
index a532cbe947c..86ad6087fc0 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.db.conf;
 
 import org.apache.iotdb.commons.conf.CommonConfig;
 import org.apache.iotdb.commons.conf.CommonDescriptor;
+import org.apache.iotdb.commons.conf.ConfigFileAutoUpdateTool;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.BadNodeUrlException;
 import org.apache.iotdb.commons.schema.SchemaConstant;
@@ -87,9 +88,9 @@ public class IoTDBDescriptor {
 
   private static final Logger LOGGER = 
LoggerFactory.getLogger(IoTDBDescriptor.class);
 
-  private final CommonDescriptor commonDescriptor = 
CommonDescriptor.getInstance();
+  private static final CommonDescriptor commonDescriptor = 
CommonDescriptor.getInstance();
 
-  private final IoTDBConfig conf = new IoTDBConfig();
+  private static final IoTDBConfig conf = new IoTDBConfig();
 
   private static final long MAX_THROTTLE_THRESHOLD = 600 * 1024 * 1024 * 1024L;
 
@@ -99,6 +100,19 @@ public class IoTDBDescriptor {
 
   private static final double MIN_DIR_USE_PROPORTION = 0.5;
 
+  static {
+    ConfigFileAutoUpdateTool updateTool = new ConfigFileAutoUpdateTool();
+    URL systemConfigUrl = getPropsUrl(CommonConfig.SYSTEM_CONFIG_NAME);
+    URL configNodeUrl = getPropsUrl(CommonConfig.OLD_CONFIG_NODE_CONFIG_NAME);
+    URL dataNodeUrl = getPropsUrl(CommonConfig.OLD_DATA_NODE_CONFIG_NAME);
+    URL commonConfigUrl = getPropsUrl(CommonConfig.OLD_COMMON_CONFIG_NAME);
+    try {
+      updateTool.checkAndMayUpdate(systemConfigUrl, configNodeUrl, 
dataNodeUrl, commonConfigUrl);
+    } catch (Exception e) {
+      LOGGER.error("Failed to update config file", e);
+    }
+  }
+
   protected IoTDBDescriptor() {
     loadProps();
     ServiceLoader<IPropertiesLoader> propertiesLoaderServiceLoader =
@@ -136,7 +150,7 @@ public class IoTDBDescriptor {
    *
    * @return url object if location exit, otherwise null.
    */
-  public URL getPropsUrl(String configFileName) {
+  public static URL getPropsUrl(String configFileName) {
     String urlString = commonDescriptor.getConfDir();
     if (urlString == null) {
       // If urlString wasn't provided, try to find a default config in the 
root of the classpath.
@@ -174,28 +188,9 @@ public class IoTDBDescriptor {
   /** load a property file and set TsfileDBConfig variables. */
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity 
warning
   private void loadProps() {
-    URL url = getPropsUrl(CommonConfig.CONFIG_NAME);
     Properties commonProperties = new Properties();
-    if (url != null) {
-      try (InputStream inputStream = url.openStream()) {
-        LOGGER.info("Start to read config file {}", url);
-        commonProperties.load(new InputStreamReader(inputStream, 
StandardCharsets.UTF_8));
-      } catch (FileNotFoundException e) {
-        LOGGER.error("Fail to find config file {}, reject DataNode startup.", 
url, e);
-        System.exit(-1);
-      } catch (IOException e) {
-        LOGGER.error("Cannot load config file, reject DataNode startup.", e);
-        System.exit(-1);
-      } catch (Exception e) {
-        LOGGER.error("Incorrect format in config file, reject DataNode 
startup.", e);
-        System.exit(-1);
-      }
-    } else {
-      LOGGER.warn(
-          "Couldn't load the configuration {} from any of the known sources.",
-          CommonConfig.CONFIG_NAME);
-    }
-    url = getPropsUrl(IoTDBConfig.CONFIG_NAME);
+    // if new properties file exist, skip old properties files
+    URL url = getPropsUrl(CommonConfig.SYSTEM_CONFIG_NAME);
     if (url != null) {
       try (InputStream inputStream = url.openStream()) {
         LOGGER.info("Start to read config file {}", url);
@@ -216,7 +211,7 @@ public class IoTDBDescriptor {
         // update all data seriesPath
         conf.updatePath();
         
commonDescriptor.getConfig().updatePath(System.getProperty(IoTDBConstant.IOTDB_HOME,
 null));
-        MetricConfigDescriptor.getInstance().loadProps(commonProperties);
+        MetricConfigDescriptor.getInstance().loadProps(commonProperties, 
false);
         MetricConfigDescriptor.getInstance()
             .getMetricConfig()
             .updateRpcInstance(
@@ -225,7 +220,7 @@ public class IoTDBDescriptor {
     } else {
       LOGGER.warn(
           "Couldn't load the configuration {} from any of the known sources.",
-          IoTDBConfig.CONFIG_NAME);
+          CommonConfig.SYSTEM_CONFIG_NAME);
     }
   }
 
@@ -1835,7 +1830,7 @@ public class IoTDBDescriptor {
   }
 
   public void loadHotModifiedProps() throws QueryProcessException {
-    URL url = getPropsUrl(CommonConfig.CONFIG_NAME);
+    URL url = getPropsUrl(CommonConfig.SYSTEM_CONFIG_NAME);
     if (url == null) {
       LOGGER.warn("Couldn't load the configuration from any of the known 
sources.");
       return;
@@ -1845,29 +1840,14 @@ public class IoTDBDescriptor {
     try (InputStream inputStream = url.openStream()) {
       LOGGER.info("Start to reload config file {}", url);
       commonProperties.load(new InputStreamReader(inputStream, 
StandardCharsets.UTF_8));
-    } catch (Exception e) {
-      LOGGER.warn("Fail to reload config file {}", url, e);
-      throw new QueryProcessException(
-          String.format("Fail to reload config file %s because %s", url, 
e.getMessage()));
-    }
-
-    url = getPropsUrl(IoTDBConfig.CONFIG_NAME);
-    if (url == null) {
-      LOGGER.warn("Couldn't load the configuration from any of the known 
sources.");
-      return;
-    }
-    try (InputStream inputStream = url.openStream()) {
-      LOGGER.info("Start to reload config file {}", url);
-      Properties properties = new Properties();
-      properties.load(new InputStreamReader(inputStream, 
StandardCharsets.UTF_8));
-      commonProperties.putAll(properties);
       loadHotModifiedProps(commonProperties);
     } catch (Exception e) {
       LOGGER.warn("Fail to reload config file {}", url, e);
       throw new QueryProcessException(
           String.format("Fail to reload config file %s because %s", url, 
e.getMessage()));
     }
-    ReloadLevel reloadLevel = 
MetricConfigDescriptor.getInstance().loadHotProps(commonProperties);
+    ReloadLevel reloadLevel =
+        MetricConfigDescriptor.getInstance().loadHotProps(commonProperties, 
false);
     LOGGER.info("Reload metric service in level {}", reloadLevel);
     if (reloadLevel == ReloadLevel.RESTART_INTERNAL_REPORTER) {
       IoTDBInternalReporter internalReporter;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/rest/IoTDBRestServiceConfig.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/rest/IoTDBRestServiceConfig.java
index 50c698079ff..64c0f65fe30 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/rest/IoTDBRestServiceConfig.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/rest/IoTDBRestServiceConfig.java
@@ -20,8 +20,6 @@
 package org.apache.iotdb.db.conf.rest;
 
 public class IoTDBRestServiceConfig {
-  static final String CONFIG_NAME = "iotdb-datanode.properties";
-  static final String OLD_CONFIG_NAME = "iotdb-common.properties";
 
   /** If the enableRestService is true, we will start REST Service. */
   private boolean enableRestService = false;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/rest/IoTDBRestServiceDescriptor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/rest/IoTDBRestServiceDescriptor.java
index e0d0df3dee9..48725ef1839 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/rest/IoTDBRestServiceDescriptor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/rest/IoTDBRestServiceDescriptor.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.db.conf.rest;
 
+import org.apache.iotdb.commons.conf.CommonConfig;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 
@@ -40,11 +41,9 @@ public class IoTDBRestServiceDescriptor {
   private final IoTDBRestServiceConfig conf = new IoTDBRestServiceConfig();
 
   protected IoTDBRestServiceDescriptor() {
-    Properties properties = loadProps(IoTDBRestServiceConfig.CONFIG_NAME);
-    if (properties != null) {
-      if (!properties.containsKey("enable_rest_service")) {
-        properties = loadProps(IoTDBRestServiceConfig.OLD_CONFIG_NAME);
-      }
+    URL systemConfig = getPropsUrl(CommonConfig.SYSTEM_CONFIG_NAME);
+    if (systemConfig != null) {
+      Properties properties = loadProps(CommonConfig.SYSTEM_CONFIG_NAME);
       if (properties != null) {
         loadProps(properties);
       }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/tag/TagLogFile.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/tag/TagLogFile.java
index 7a9a16aa20d..9cf9d51cf21 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/tag/TagLogFile.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/tag/TagLogFile.java
@@ -49,7 +49,7 @@ public class TagLogFile implements AutoCloseable {
   private FileChannel fileChannel;
   private static final String LENGTH_EXCEED_MSG =
       "Tag/Attribute exceeds the max length limit. "
-          + "Please enlarge tag_attribute_total_size in 
iotdb-common.properties";
+          + "Please enlarge tag_attribute_total_size in 
iotdb-system.properties";
 
   private static final int MAX_LENGTH =
       CommonDescriptor.getInstance().getConfig().getTagAttributeTotalSize();
diff --git 
a/iotdb-core/datanode/src/test/resources/datanode1conf/iotdb-common.properties 
b/iotdb-core/datanode/src/test/resources/datanode1conf/iotdb-common.properties
deleted file mode 100644
index 143c0e0b7f0..00000000000
--- 
a/iotdb-core/datanode/src/test/resources/datanode1conf/iotdb-common.properties
+++ /dev/null
@@ -1,22 +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.
-#
-timestamp_precision=ms
-udf_lib_dir=target/datanode1/ext/udf
-trigger_lib_dir=target/datanode1/ext/trigger
-pipe_lib_dir=target/datanode1/ext/pipe
\ No newline at end of file
diff --git 
a/iotdb-core/datanode/src/test/resources/datanode1conf/iotdb-datanode.properties
 b/iotdb-core/datanode/src/test/resources/datanode1conf/iotdb-system.properties
similarity index 88%
rename from 
iotdb-core/datanode/src/test/resources/datanode1conf/iotdb-datanode.properties
rename to 
iotdb-core/datanode/src/test/resources/datanode1conf/iotdb-system.properties
index a7ed41f2615..5bccd18242b 100644
--- 
a/iotdb-core/datanode/src/test/resources/datanode1conf/iotdb-datanode.properties
+++ 
b/iotdb-core/datanode/src/test/resources/datanode1conf/iotdb-system.properties
@@ -39,4 +39,9 @@ sort_tmp_dir=target/datanode1/tmp
 dn_metric_reporter_list=PROMETHEUS
 dn_metric_level=IMPORTANT
 dn_metric_async_collect_period=5
-dn_metric_prometheus_reporter_port=9097
\ No newline at end of file
+dn_metric_prometheus_reporter_port=9097
+
+timestamp_precision=ms
+udf_lib_dir=target/datanode1/ext/udf
+trigger_lib_dir=target/datanode1/ext/trigger
+pipe_lib_dir=target/datanode1/ext/pipe
\ No newline at end of file
diff --git 
a/iotdb-core/datanode/src/test/resources/datanode2conf/iotdb-common.properties 
b/iotdb-core/datanode/src/test/resources/datanode2conf/iotdb-common.properties
deleted file mode 100644
index 9cf060d61fd..00000000000
--- 
a/iotdb-core/datanode/src/test/resources/datanode2conf/iotdb-common.properties
+++ /dev/null
@@ -1,22 +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.
-#
-timestamp_precision=ms
-udf_lib_dir=target/datanode2/ext/udf
-trigger_lib_dir=target/datanode2/ext/trigger
-pipe_lib_dir=target/datanode2/ext/pipe
\ No newline at end of file
diff --git 
a/iotdb-core/datanode/src/test/resources/datanode2conf/iotdb-datanode.properties
 b/iotdb-core/datanode/src/test/resources/datanode2conf/iotdb-system.properties
similarity index 90%
rename from 
iotdb-core/datanode/src/test/resources/datanode2conf/iotdb-datanode.properties
rename to 
iotdb-core/datanode/src/test/resources/datanode2conf/iotdb-system.properties
index a8508a79678..26f56c3c03c 100644
--- 
a/iotdb-core/datanode/src/test/resources/datanode2conf/iotdb-datanode.properties
+++ 
b/iotdb-core/datanode/src/test/resources/datanode2conf/iotdb-system.properties
@@ -40,3 +40,8 @@ dn_metric_reporter_list=PROMETHEUS
 dn_metric_level=IMPORTANT
 dn_metric_async_collect_period=5
 dn_metric_prometheus_reporter_port=9099
+
+timestamp_precision=ms
+udf_lib_dir=target/datanode2/ext/udf
+trigger_lib_dir=target/datanode2/ext/trigger
+pipe_lib_dir=target/datanode2/ext/pipe
\ No newline at end of file
diff --git 
a/iotdb-core/datanode/src/test/resources/datanode3conf/iotdb-common.properties 
b/iotdb-core/datanode/src/test/resources/datanode3conf/iotdb-common.properties
deleted file mode 100644
index 1b48e21f303..00000000000
--- 
a/iotdb-core/datanode/src/test/resources/datanode3conf/iotdb-common.properties
+++ /dev/null
@@ -1,22 +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.
-#
-timestamp_precision=ms
-udf_lib_dir=target/datanode3/ext/udf
-trigger_lib_dir=target/datanode3/ext/trigger
-pipe_lib_dir=target/datanode3/ext/pipe
\ No newline at end of file
diff --git 
a/iotdb-core/datanode/src/test/resources/datanode3conf/iotdb-datanode.properties
 b/iotdb-core/datanode/src/test/resources/datanode3conf/iotdb-system.properties
similarity index 88%
rename from 
iotdb-core/datanode/src/test/resources/datanode3conf/iotdb-datanode.properties
rename to 
iotdb-core/datanode/src/test/resources/datanode3conf/iotdb-system.properties
index d4faf82e09b..9bde5910377 100644
--- 
a/iotdb-core/datanode/src/test/resources/datanode3conf/iotdb-datanode.properties
+++ 
b/iotdb-core/datanode/src/test/resources/datanode3conf/iotdb-system.properties
@@ -39,4 +39,9 @@ sort_tmp_dir=target/datanode3/tmp
 dn_metric_reporter_list=PROMETHEUS
 dn_metric_level=IMPORTANT
 dn_metric_async_collect_period=5
-dn_metric_prometheus_reporter_port=9101
\ No newline at end of file
+dn_metric_prometheus_reporter_port=9101
+
+timestamp_precision=ms
+udf_lib_dir=target/datanode3/ext/udf
+trigger_lib_dir=target/datanode3/ext/trigger
+pipe_lib_dir=target/datanode3/ext/pipe
\ No newline at end of file
diff --git a/iotdb-core/datanode/src/test/resources/iotdb-system.properties 
b/iotdb-core/datanode/src/test/resources/iotdb-system.properties
new file mode 100644
index 00000000000..86943f5ed34
--- /dev/null
+++ b/iotdb-core/datanode/src/test/resources/iotdb-system.properties
@@ -0,0 +1,76 @@
+#
+# 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.
+#
+
+base_dir=target/tmp
+dn_data_dirs=target/data
+dn_wal_dirs=target/wal
+index_root_dir=target/index
+dn_tracing_dir=target/data/tracing
+minimum_pbtree_segment_in_bytes=0
+page_cache_in_pbtree=10
+dn_internal_address=0.0.0.0
+dn_sync_dir=target/sync
+dn_seed_config_node=127.0.0.1:10710
+
+
+####################
+### REST Service Configuration
+####################
+
+# Is the REST service enabled
+enable_rest_service=true
+
+# the binding port of the REST service
+# rest_service_port=18080
+
+# Whether to display rest service interface information through swagger. eg: 
http://ip:port/swagger.json
+# enable_swagger=false
+
+# the default row limit to a REST query response when the rowSize parameter is 
not given in request
+# rest_query_default_row_size_limit=10000
+
+# the expiration time of the user login information cache (in seconds)
+# cache_expire_in_seconds=28800
+
+# maximum number of users can be stored in the user login cache.
+# cache_max_num=100
+
+# init capacity of users can be stored in the user login cache.
+# cache_init_num=10
+
+# is SSL enabled
+# enable_https=false
+
+# SSL key store path
+# key_store_path=
+
+# SSL key store password
+# key_store_pwd=
+
+# Is client authentication required
+# client_auth=false
+
+# SSL trust store path
+# trust_store_path=
+
+# SSL trust store password.
+# trust_store_pwd=
+
+# SSL timeout (in seconds)
+# idle_timeout_in_seconds=50000
diff --git 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConfigDescriptor.java
 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConfigDescriptor.java
index e053587713d..f1ec288d47a 100644
--- 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConfigDescriptor.java
+++ 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/config/MetricConfigDescriptor.java
@@ -37,8 +37,8 @@ public class MetricConfigDescriptor {
   }
 
   /** Load properties into metric config. */
-  public void loadProps(Properties properties) {
-    MetricConfig loadConfig = generateFromProperties(properties);
+  public void loadProps(Properties properties, boolean isConfigNode) {
+    MetricConfig loadConfig = generateFromProperties(properties, isConfigNode);
     metricConfig.copy(loadConfig);
   }
 
@@ -47,8 +47,8 @@ public class MetricConfigDescriptor {
    *
    * @return reload level of metric service
    */
-  public ReloadLevel loadHotProps(Properties properties) {
-    MetricConfig newMetricConfig = generateFromProperties(properties);
+  public ReloadLevel loadHotProps(Properties properties, boolean isConfigNode) 
{
+    MetricConfig newMetricConfig = generateFromProperties(properties, 
isConfigNode);
     ReloadLevel reloadLevel = ReloadLevel.NOTHING;
     if (!metricConfig.equals(newMetricConfig)) {
       if 
(!metricConfig.getMetricLevel().equals(newMetricConfig.getMetricLevel())
@@ -72,7 +72,7 @@ public class MetricConfigDescriptor {
   }
 
   /** Load properties into metric config. */
-  private MetricConfig generateFromProperties(Properties properties) {
+  private MetricConfig generateFromProperties(Properties properties, boolean 
isConfigNode) {
     MetricConfig loadConfig = new MetricConfig();
 
     String reporterList =
@@ -83,73 +83,98 @@ public class MetricConfigDescriptor {
                 loadConfig.getMetricReporterList().stream()
                     .map(ReporterType::toString)
                     .collect(Collectors.toSet())),
-            properties);
+            properties,
+            isConfigNode);
     loadConfig.setMetricReporterList(reporterList);
 
     loadConfig.setMetricLevel(
         MetricLevel.valueOf(
-            getProperty("metric_level", 
String.valueOf(loadConfig.getMetricLevel()), properties)));
+            getProperty(
+                "metric_level",
+                String.valueOf(loadConfig.getMetricLevel()),
+                properties,
+                isConfigNode)));
 
     loadConfig.setAsyncCollectPeriodInSecond(
         Integer.parseInt(
             getProperty(
                 "metric_async_collect_period",
                 String.valueOf(loadConfig.getAsyncCollectPeriodInSecond()),
-                properties)));
+                properties,
+                isConfigNode)));
 
     loadConfig.setPrometheusReporterPort(
         Integer.parseInt(
             getProperty(
                 "metric_prometheus_reporter_port",
                 String.valueOf(loadConfig.getPrometheusReporterPort()),
-                properties)));
+                properties,
+                isConfigNode)));
 
     IoTDBReporterConfig reporterConfig = loadConfig.getIoTDBReporterConfig();
     reporterConfig.setHost(
-        getProperty("metric_iotdb_reporter_host", reporterConfig.getHost(), 
properties));
+        getProperty(
+            "metric_iotdb_reporter_host", reporterConfig.getHost(), 
properties, isConfigNode));
 
     reporterConfig.setPort(
         Integer.valueOf(
             getProperty(
                 "metric_iotdb_reporter_port",
                 String.valueOf(reporterConfig.getPort()),
-                properties)));
+                properties,
+                isConfigNode)));
 
     reporterConfig.setUsername(
-        getProperty("metric_iotdb_reporter_username", 
reporterConfig.getUsername(), properties));
+        getProperty(
+            "metric_iotdb_reporter_username",
+            reporterConfig.getUsername(),
+            properties,
+            isConfigNode));
 
     reporterConfig.setPassword(
-        getProperty("metric_iotdb_reporter_password", 
reporterConfig.getPassword(), properties));
+        getProperty(
+            "metric_iotdb_reporter_password",
+            reporterConfig.getPassword(),
+            properties,
+            isConfigNode));
 
     reporterConfig.setMaxConnectionNumber(
         Integer.valueOf(
             getProperty(
                 "metric_iotdb_reporter_max_connection_number",
                 String.valueOf(reporterConfig.getMaxConnectionNumber()),
-                properties)));
+                properties,
+                isConfigNode)));
 
     reporterConfig.setLocation(
-        getProperty("metric_iotdb_reporter_location", 
reporterConfig.getLocation(), properties));
+        getProperty(
+            "metric_iotdb_reporter_location",
+            reporterConfig.getLocation(),
+            properties,
+            isConfigNode));
 
     reporterConfig.setPushPeriodInSecond(
         Integer.valueOf(
             getProperty(
                 "metric_iotdb_reporter_push_period",
                 String.valueOf(reporterConfig.getPushPeriodInSecond()),
-                properties)));
-    loadConfig.setInternalReportType(
-        InternalReporterType.valueOf(
-            properties.getProperty(
-                "dn_metric_internal_reporter_type",
-                loadConfig.getInternalReportType().toString())));
+                properties,
+                isConfigNode)));
+    if (!isConfigNode) {
+      loadConfig.setInternalReportType(
+          InternalReporterType.valueOf(
+              properties.getProperty(
+                  "dn_metric_internal_reporter_type",
+                  loadConfig.getInternalReportType().toString())));
+    }
 
     return loadConfig;
   }
 
   /** Get property from confignode or datanode. */
-  private String getProperty(String target, String defaultValue, Properties 
properties) {
-    return properties.getProperty(
-        "dn_" + target, properties.getProperty("cn_" + target, defaultValue));
+  private String getProperty(
+      String target, String defaultValue, Properties properties, boolean 
isConfigNode) {
+    return properties.getProperty((isConfigNode ? "cn_" : "dn_") + target, 
defaultValue);
   }
 
   private static class MetricConfigDescriptorHolder {
diff --git 
a/iotdb-core/metrics/interface/src/test/java/org/apache/iotdb/metrics/config/MetricConfigTest.java
 
b/iotdb-core/metrics/interface/src/test/java/org/apache/iotdb/metrics/config/MetricConfigTest.java
index 3ce4b79c6b7..43382d00aed 100644
--- 
a/iotdb-core/metrics/interface/src/test/java/org/apache/iotdb/metrics/config/MetricConfigTest.java
+++ 
b/iotdb-core/metrics/interface/src/test/java/org/apache/iotdb/metrics/config/MetricConfigTest.java
@@ -47,7 +47,7 @@ public class MetricConfigTest {
     properties.setProperty("cn_metric_iotdb_reporter_location", "metric");
     properties.setProperty("cn_metric_iotdb_reporter_push_period", "5");
 
-    MetricConfigDescriptor.getInstance().loadProps(properties);
+    MetricConfigDescriptor.getInstance().loadProps(properties, true);
 
     MetricConfig metricConfig = 
MetricConfigDescriptor.getInstance().getMetricConfig();
 
@@ -84,7 +84,7 @@ public class MetricConfigTest {
     properties.setProperty("dn_metric_iotdb_reporter_push_period", "5");
     properties.setProperty("dn_metric_internal_reporter_type", "IOTDB");
 
-    MetricConfigDescriptor.getInstance().loadProps(properties);
+    MetricConfigDescriptor.getInstance().loadProps(properties, false);
 
     MetricConfig metricConfig = 
MetricConfigDescriptor.getInstance().getMetricConfig();
 
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-common.properties 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties
similarity index 71%
rename from 
iotdb-core/node-commons/src/assembly/resources/conf/iotdb-common.properties
rename to 
iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties
index 27443e02918..840e787c5b7 100644
--- 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-common.properties
+++ 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties
@@ -15,6 +15,439 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+#
+
+####################
+### Config Node RPC Configuration
+####################
+
+# Used for RPC communication inside cluster.
+# Could set 127.0.0.1(for local test) or ipv4 address.
+# Datatype: String
+cn_internal_address=127.0.0.1
+
+# Used for RPC communication inside cluster.
+# Datatype: int
+cn_internal_port=10710
+
+# Used for consensus communication among ConfigNodes inside cluster.
+# Datatype: int
+cn_consensus_port=10720
+
+####################
+### Seed ConfigNode
+####################
+
+# For the first ConfigNode to start, cn_seed_config_node points to its own 
cn_internal_address:cn_internal_port.
+# For other ConfigNodes that to join the cluster, cn_seed_config_node points 
to any running ConfigNode's cn_internal_address:cn_internal_port.
+# Note: After this ConfigNode successfully joins the cluster for the first 
time, this parameter is no longer used.
+# Each node automatically maintains the list of ConfigNodes and traverses 
connections when restarting.
+# Format: address:port   e.g. 127.0.0.1:10710
+# Datatype: String
+cn_seed_config_node=127.0.0.1:10710
+
+####################
+### Directory configuration
+####################
+
+# system dir
+# If this property is unset, system will save the data in the default relative 
path directory under the confignode folder(i.e., 
%CONFIGNODE_HOME%/data/confignode/system).
+# If it is absolute, system will save the data in exact location it points to.
+# If it is relative, system will save the data in the relative path directory 
it indicates under the confignode folder.
+# For windows platform
+# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
+# cn_system_dir=data\\confignode\\system
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# cn_system_dir=data/confignode/system
+
+# consensus dir
+# If this property is unset, system will save the data in the default relative 
path directory under the confignode folder(i.e., 
%CONFIGNODE_HOME%/data/confignode/consensus).
+# If it is absolute, system will save the data in exact location it points to.
+# If it is relative, system will save the data in the relative path directory 
it indicates under the confignode folder.
+# Note: If data_dir is assigned an empty string(i.e.,zero-size), it will be 
handled as a relative path.
+# For windows platform
+# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
+# cn_consensus_dir=data\\confignode\\consensus
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# cn_consensus_dir=data/confignode/consensus
+
+# pipe_receiver_file_dir
+# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., 
%IOTDB_HOME%/${cn_system_dir}/pipe/receiver).
+# If it is absolute, system will save the data in the exact location it points 
to.
+# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
+# Note: If pipe_receiver_file_dir is assigned an empty string(i.e.,zero-size), 
it will be handled as a relative path.
+# For windows platform
+# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
+# pipe_receiver_file_dir=data\\confignode\\system\\pipe\\receiver
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# pipe_receiver_file_dir=data/confignode/system/pipe/receiver
+
+####################
+### thrift rpc configuration
+####################
+
+# this feature is under development, set this as false before it is done.
+# Datatype: boolean
+# cn_rpc_thrift_compression_enable=false
+
+# if true, a snappy based compression method will be called before sending 
data by the network
+# Datatype: boolean
+# this feature is under development, set this as false before it is done.
+# cn_rpc_advanced_compression_enable=false
+
+# Datatype: int
+# cn_rpc_max_concurrent_client_num=65535
+
+# thrift max frame size, 512MB by default
+# Datatype: int
+# cn_thrift_max_frame_size=536870912
+
+# thrift init buffer size
+# Datatype: int
+# cn_thrift_init_buffer_size=1024
+
+# Thrift socket and connection timeout between raft nodes, in milliseconds.
+# Datatype: int
+# cn_connection_timeout_ms=60000
+
+# selector thread (TAsyncClientManager) nums for async thread in a 
clientManager
+# Datatype: int
+# cn_selector_thread_nums_of_client_manager=1
+
+# The maximum number of clients that can be allocated for a node in a 
clientManager.
+# when the number of the client to a single node exceeds this number, the 
thread for applying for a client will be blocked
+# for a while, then ClientManager will throw ClientManagerException if there 
are no clients after the block time.
+# Datatype: int
+# cn_max_client_count_for_each_node_in_client_manager=300
+
+####################
+### Metric Configuration
+####################
+
+# The reporters of metric module to report metrics
+# If there are more than one reporter, please separate them by commas ",".
+# Options: [JMX, PROMETHEUS]
+# Datatype: String
+# cn_metric_reporter_list=
+
+# The level of metric module
+# Options: [OFF, CORE, IMPORTANT, NORMAL, ALL]
+# Datatype: String
+# cn_metric_level=CORE
+
+# The period of async collection of some metrics in second
+# Datatype: int
+# cn_metric_async_collect_period=5
+
+# The port of prometheus reporter of metric module
+# Datatype: int
+# cn_metric_prometheus_reporter_port=9091
+
+
+
+####################
+### Data Node RPC Configuration
+####################
+
+# Used for connection of IoTDB native clients(Session)
+# Could set 127.0.0.1(for local test) or ipv4 address
+# Datatype: String
+dn_rpc_address=0.0.0.0
+
+# Used for connection of IoTDB native clients(Session)
+# Bind with dn_rpc_address
+# Datatype: int
+dn_rpc_port=6667
+
+# Used for communication inside cluster.
+# could set 127.0.0.1(for local test) or ipv4 address.
+# Datatype: String
+dn_internal_address=127.0.0.1
+
+# Used for communication inside cluster.
+# Bind with dn_internal_address
+# Datatype: int
+dn_internal_port=10730
+
+# Port for data exchange among DataNodes inside cluster
+# Bind with dn_internal_address
+# Datatype: int
+dn_mpp_data_exchange_port=10740
+
+# port for consensus's communication for schema region inside cluster.
+# Bind with dn_internal_address
+# Datatype: int
+dn_schema_region_consensus_port=10750
+
+# port for consensus's communication for data region inside cluster.
+# Bind with dn_internal_address
+# Datatype: int
+dn_data_region_consensus_port=10760
+
+# Datatype: long
+# The time of data node waiting for the next retry to join into the cluster.
+# dn_join_cluster_retry_interval_ms=5000
+
+####################
+### SSL Configuration
+####################
+
+# Does dn_rpc_port enable SSL
+# enable_thrift_ssl=false
+
+# Rest Service enabled SSL
+# enable_https=false
+
+# SSL key store path
+# linux e.g. /home/iotdb/server.keystore (absolute path) or server.keystore 
(relative path)
+# windows e.g. C:\\iotdb\\server.keystore (absolute path) or server.keystore 
(relative path)
+# key_store_path=
+
+# SSL key store password
+# key_store_pwd=
+
+####################
+### Seed ConfigNode
+####################
+
+# dn_seed_config_node points to any running ConfigNode's 
cn_internal_address:cn_internal_port.
+# Note: After this DataNode successfully joins the cluster for the first time, 
this parameter is no longer used.
+# Each node automatically maintains the list of ConfigNodes and traverses 
connections when restarting.
+# Format: address:port   e.g. 127.0.0.1:10710
+# Datatype: String
+dn_seed_config_node=127.0.0.1:10710
+
+####################
+### Connection Configuration
+####################
+
+# The maximum session idle time. unit: ms
+# Idle sessions are the ones that performs neither query or non-query 
operations for a period of time
+# Set to 0 to disable session timeout
+# Datatype: int
+# dn_session_timeout_threshold=0
+
+# Datatype: boolean
+# dn_rpc_thrift_compression_enable=false
+
+# if true, a snappy based compression method will be called before sending 
data by the network
+# Datatype: boolean
+# this feature is under development, set this as false before it is done.
+# dn_rpc_advanced_compression_enable=false
+
+# Datatype: int
+# dn_rpc_selector_thread_count=1
+
+# Datatype: int
+# dn_rpc_min_concurrent_client_num=1
+
+# Datatype: int
+# dn_rpc_max_concurrent_client_num=65535
+
+# thrift max frame size, 512MB by default
+# Datatype: int
+# dn_thrift_max_frame_size=536870912
+
+# thrift init buffer size
+# Datatype: int
+# dn_thrift_init_buffer_size=1024
+
+# Thrift socket and connection timeout between raft nodes, in milliseconds.
+# Datatype: int
+# dn_connection_timeout_ms=60000
+
+# selector thread (TAsyncClientManager) nums for async thread in a 
clientManager
+# Datatype: int
+# dn_selector_thread_count_of_client_manager=1
+
+# The maximum number of clients that can be allocated for a node in a 
clientManager.
+# When the number of the client to a single node exceeds this number, the 
thread for applying for a client will be blocked
+# for a while, then ClientManager will throw ClientManagerException if there 
are no clients after the block time.
+# Datatype: int
+# dn_max_client_count_for_each_node_in_client_manager=300
+
+####################
+### Directory Configuration
+####################
+
+# system dir
+# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., %IOTDB_HOME%/data/datanode/system).
+# If it is absolute, system will save the data in exact location it points to.
+# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
+# For windows platform
+# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
+# dn_system_dir=data\\datanode\\system
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# dn_system_dir=data/datanode/system
+
+
+# data dirs
+# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., %IOTDB_HOME%/data/datanode/data).
+# If it is absolute, system will save the data in exact location it points to.
+# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
+# If there are more than one directory, please separate them by commas ",".
+# Note: If data_dirs is assigned an empty string(i.e.,zero-size), it will be 
handled as a relative path.
+# For windows platform
+# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
+# dn_data_dirs=data\\datanode\\data
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# dn_data_dirs=data/datanode/data
+
+
+# multi_dir_strategy
+# The strategy is used to choose a directory from data_dirs for the system to 
store a new tsfile.
+# System provides two strategies to choose from, or user can create his own 
strategy by extending 
org.apache.iotdb.db.conf.directories.strategy.DirectoryStrategy.
+# The info of the two strategies are as follows:
+# 1. SequenceStrategy: the system will choose the directory in sequence.
+# 2. MaxDiskUsableSpaceFirstStrategy: the system will choose the directory 
whose disk has the maximum space.
+# Set SequenceStrategy or MaxDiskUsableSpaceFirstStrategy to apply the 
corresponding strategy.
+# If this property is unset, system will use SequenceStrategy as default 
strategy.
+# For this property, fully-qualified class name (include package name) and 
simple class name are both acceptable.
+# dn_multi_dir_strategy=SequenceStrategy
+
+# consensus dir
+# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., %IOTDB_HOME%/data/datanode).
+# If it is absolute, system will save the data in the exact location it points 
to.
+# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
+# Note: If consensus_dir is assigned an empty string(i.e.,zero-size), it will 
be handled as a relative path.
+# For windows platform
+# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
+# dn_consensus_dir=data\\datanode\\consensus
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# dn_consensus_dir=data/datanode/consensus
+
+# wal dirs
+# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., %IOTDB_HOME%/data/datanode).
+# If it is absolute, system will save the data in the exact location it points 
to.
+# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
+# If there are more than one directory, please separate them by commas ",".
+# Note: If wal_dirs is assigned an empty string(i.e.,zero-size), it will be 
handled as a relative path.
+# For windows platform
+# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
+# dn_wal_dirs=data\\datanode\\wal
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# dn_wal_dirs=data/datanode/wal
+
+# tracing dir
+# Uncomment following fields to configure the tracing root directory.
+# For Windows platform, the index is as follows:
+# dn_tracing_dir=datanode\\tracing
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# dn_tracing_dir=datanode/tracing
+
+# sync dir
+# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., %IOTDB_HOME%/data/datanode).
+# If it is absolute, system will save the data in the exact location it points 
to.
+# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
+# Note: If sync_dir is assigned an empty string(i.e.,zero-size), it will be 
handled as a relative path.
+# For windows platform
+# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
+# dn_sync_dir=data\\datanode\\sync
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# dn_sync_dir=data/datanode/sync
+
+# sort_tmp_dir
+# This property is used to configure the temporary directory for sorting 
operation.
+# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., %IOTDB_HOME%/data/datanode).
+# If it is absolute, system will save the data in the exact location it points 
to.
+# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
+# Note: If sort_tmp_dir is assigned an empty string(i.e.,zero-size), it will 
be handled as a relative path.
+# For windows platform
+# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
+# sort_tmp_dir=data\\datanode\\tmp
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# sort_tmp_dir=data/datanode/tmp
+
+# pipe_receiver_file_dirs
+# If this property is unset, system will save the data in the default relative 
path directory under the IoTDB folder(i.e., 
%IOTDB_HOME%/${dn_system_dir}/pipe/receiver).
+# If it is absolute, system will save the data in the exact location it points 
to.
+# If it is relative, system will save the data in the relative path directory 
it indicates under the IoTDB folder.
+# If there are more than one directory, please separate them by commas ",".
+# Note: If pipe_receiver_file_dirs is assigned an empty 
string(i.e.,zero-size), it will be handled as a relative path.
+# For windows platform
+# If its prefix is a drive specifier followed by "\\", or if its prefix is 
"\\\\", then the path is absolute. Otherwise, it is relative.
+# pipe_receiver_file_dirs=data\\datanode\\system\\pipe\\receiver
+# For Linux platform
+# If its prefix is "/", then the path is absolute. Otherwise, it is relative.
+# pipe_receiver_file_dirs=data/datanode/system/pipe/receiver
+
+####################
+### Metric Configuration
+####################
+
+# The reporters of metric module to report metrics
+# If there are more than one reporter, please separate them by commas ",".
+# Options: [JMX, PROMETHEUS]
+# Datatype: String
+# dn_metric_reporter_list=
+
+# The level of metric module
+# Options: [OFF, CORE, IMPORTANT, NORMAL, ALL]
+# Datatype: String
+# dn_metric_level=CORE
+
+# The period of async collection of some metrics in second
+# Datatype: int
+# dn_metric_async_collect_period=5
+
+# The port of prometheus reporter of metric module
+# Datatype: int
+dn_metric_prometheus_reporter_port=9092
+
+# The type of internal reporter in metric module, used for checking flushed 
point number
+# Options: [MEMORY, IOTDB]
+# Datatype: String
+# dn_metric_internal_reporter_type=MEMORY
+
+####################
+### REST Service Configuration
+####################
+
+# Is the REST service enabled
+# enable_rest_service=false
+
+# the binding port of the REST service
+# rest_service_port=18080
+
+# Whether to display rest service interface information through swagger. eg: 
http://ip:port/swagger.json
+# enable_swagger=false
+
+# the default row limit to a REST query response when the rowSize parameter is 
not given in request
+# rest_query_default_row_size_limit=10000
+
+# the expiration time of the user login information cache (in seconds)
+# cache_expire_in_seconds=28800
+
+# maximum number of users can be stored in the user login cache.
+# cache_max_num=100
+
+# init capacity of users can be stored in the user login cache.
+# cache_init_num=10
+
+# Is client authentication required
+# client_auth=false
+
+# SSL trust store path
+# trust_store_path=""
+
+# SSL trust store password.
+# trust_store_pwd=""
+
+# SSL timeout (in seconds)
+# idle_timeout_in_seconds=50000
+
+
+
 
 ####################
 ### Cluster Configuration
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-confignode.bat 
b/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-confignode.bat
index 36691cff409..0fd3bd5d994 100644
--- a/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-confignode.bat
+++ b/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-confignode.bat
@@ -35,7 +35,11 @@ if not "%CLEAN_SERVICE%"=="y" if not "%CLEAN_SERVICE%"=="Y" (
 start cmd /c "%IOTDB_HOME%\\sbin\\stop-confignode.bat -f"
 timeout /t 3 > nul
 rmdir /s /q "%IOTDB_HOME%\data\confignode\" 2>nul
-set IOTDB_CONFIGNODE_CONFIG="%IOTDB_HOME%\conf\iotdb-confignode.properties"
+if exist "%IOTDB_HOME%\conf\iotdb-system.properties" (
+  set IOTDB_CONFIGNODE_CONFIG="%IOTDB_HOME%\conf\iotdb-system.properties"
+) ELSE (
+  set IOTDB_CONFIGNODE_CONFIG="%IOTDB_HOME%\conf\iotdb-confignode.properties"
+)
 set "delimiter=,;"
 for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^cn_system_dir"
   %IOTDB_CONFIGNODE_CONFIG%') do (
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-confignode.sh 
b/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-confignode.sh
index 88a5e348830..fee89699362 100644
--- a/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-confignode.sh
+++ b/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-confignode.sh
@@ -33,7 +33,12 @@ fi
 nohup bash ${IOTDB_HOME}/sbin/stop-confignode.sh -f >/dev/null 2>&1 &
 rm -rf ${IOTDB_HOME}/data/confignode/ >/dev/null 2>&1 &
 
-IOTDB_CONFIGNODE_CONFIG=${IOTDB_HOME}/conf/iotdb-confignode.properties
+if [ -f "${IOTDB_HOME}/conf/iotdb-system.properties" ]; then
+  IOTDB_CONFIGNODE_CONFIG="${IOTDB_HOME}/conf/iotdb-system.properties"
+else
+  IOTDB_CONFIGNODE_CONFIG="${IOTDB_HOME}/conf/iotdb-confignode.properties"
+fi
+
 cn_system_dir=$(echo $(grep '^cn_system_dir=' ${IOTDB_CONFIGNODE_CONFIG} || 
echo "data/confignode/system") | sed 's/.*=//')
 cn_consensus_dir=$(echo $(grep '^cn_consensus_dir=' ${IOTDB_CONFIGNODE_CONFIG} 
|| echo "data/confignode/consensus") | sed 's/.*=//')
 
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-datanode.bat 
b/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-datanode.bat
index 1ccf0346f50..26aab580e85 100644
--- a/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-datanode.bat
+++ b/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-datanode.bat
@@ -34,7 +34,11 @@ if not "%CLEAN_SERVICE%"=="y" if not "%CLEAN_SERVICE%"=="Y" (
 start cmd /c "%IOTDB_HOME%\\sbin\\stop-datanode.bat -f"
 timeout /t 3 > nul
 rmdir /s /q "%IOTDB_HOME%\data\datanode\" 2>nul
-set IOTDB_DATANODE_CONFIG="%IOTDB_HOME%\conf\iotdb-datanode.properties"
+if exist "%IOTDB_HOME%\conf\iotdb-system.properties" (
+  set IOTDB_DATANODE_CONFIG="%IOTDB_HOME%\conf\iotdb-system.properties"
+) ELSE (
+  set IOTDB_DATANODE_CONFIG="%IOTDB_HOME%\conf\iotdb-datanode.properties"
+)
 set "delimiter=,;"
 for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^dn_system_dir"
   %IOTDB_DATANODE_CONFIG%') do (
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-datanode.sh 
b/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-datanode.sh
index 98e287ef4e6..9a1580a2a9e 100644
--- a/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-datanode.sh
+++ b/iotdb-core/node-commons/src/assembly/resources/sbin/destroy-datanode.sh
@@ -32,7 +32,13 @@ fi
 nohup bash ${IOTDB_HOME}/sbin/stop-datanode.sh -f >/dev/null 2>&1 &
 
 rm -rf ${IOTDB_HOME}/data/datanode/ >/dev/null 2>&1 &
-IOTDB_DATANODE_CONFIG=${IOTDB_HOME}/conf/iotdb-datanode.properties
+
+if [ -f "${IOTDB_HOME}/conf/iotdb-system.properties" ]; then
+  IOTDB_DATANODE_CONFIG="${IOTDB_HOME}/conf/iotdb-system.properties"
+else
+  IOTDB_DATANODE_CONFIG="${IOTDB_HOME}/conf/iotdb-datanode.properties"
+fi
+
 dn_system_dir=$(echo $(grep '^dn_system_dir=' ${IOTDB_DATANODE_CONFIG} || echo 
"data/datanode/system") | sed 's/.*=//')
 dn_data_dirs=$(echo $(grep '^dn_data_dirs=' ${IOTDB_DATANODE_CONFIG} || echo 
"data/datanode/data") | sed 's/.*=//')
 dn_consensus_dir=$(echo $(grep '^dn_consensus_dir=' ${IOTDB_DATANODE_CONFIG} 
|| echo "data/datanode/consensus") | sed 's/.*=//')
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/sbin/health_check.bat 
b/iotdb-core/node-commons/src/assembly/resources/sbin/health_check.bat
index bb07c530bef..14a0e4700cb 100644
--- a/iotdb-core/node-commons/src/assembly/resources/sbin/health_check.bat
+++ b/iotdb-core/node-commons/src/assembly/resources/sbin/health_check.bat
@@ -232,7 +232,11 @@ exit /b
 :local_dirs_check
 
 setlocal enabledelayedexpansion
-set "properties_file=%IOTDB_HOME%\conf\iotdb-datanode.properties"
+if exist "%IOTDB_HOME%\conf\iotdb-system.properties" (
+  set "properties_file=%IOTDB_HOME%\conf\iotdb-system.properties"
+) ELSE (
+  set "properties_file=%IOTDB_HOME%\conf\iotdb-datanode.properties"
+)
 for /f "usebackq tokens=1,* delims==" %%a in ("%properties_file%") do (
     if "%%a"=="dn_data_dirs" (
         set "dn_data_dirs=%%b"
@@ -350,46 +354,36 @@ if defined operation_dirs (
 exit /b
 
 :local_ports_check
-IF EXIST "%IOTDB_CONF%\iotdb-datanode.properties" (
+IF EXIST "%IOTDB_CONF%\iotdb-system.properties" (
+  set DATANODE_CONFIG_FILE_PATH="%IOTDB_CONF%\iotdb-system.properties"
+) ELSE IF EXIST "%IOTDB_HOME%\conf\iotdb-system.properties" (
+  set DATANODE_CONFIG_FILE_PATH="%IOTDB_HOME%\conf\iotdb-system.properties"
+) ELSE IF EXIST "%IOTDB_CONF%\iotdb-system.properties" (
+  set DATANODE_CONFIG_FILE_PATH="%IOTDB_CONF%\iotdb-datanode.properties"
+) ELSE IF EXIST "%IOTDB_HOME%\conf\iotdb-datanode.properties" (
+  set DATANODE_CONFIG_FILE_PATH="%IOTDB_HOME%\conf\iotdb-datanode.properties"
+) ELSE (
+  set DATANODE_CONFIG_FILE_PATH=
+)
+IF DEFINED DATANODE_CONFIG_FILE_PATH (
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^dn_rpc_port"
-    %IOTDB_CONF%\iotdb-datanode.properties') do (
+    %DATANODE_CONFIG_FILE_PATH%') do (
       set dn_rpc_port=%%i
   )
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^dn_internal_port"
-    %IOTDB_CONF%\iotdb-datanode.properties') do (
+    %DATANODE_CONFIG_FILE_PATH%') do (
       set dn_internal_port=%%i
   )
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i 
"^dn_mpp_data_exchange_port"
-    %IOTDB_CONF%\iotdb-datanode.properties') do (
+    %DATANODE_CONFIG_FILE_PATH%') do (
       set dn_mpp_data_exchange_port=%%i
   )
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i 
"^dn_schema_region_consensus_port"
-    %IOTDB_CONF%\iotdb-datanode.properties') do (
+    %DATANODE_CONFIG_FILE_PATH%') do (
       set dn_schema_region_consensus_port=%%i
   )
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i 
"^dn_data_region_consensus_port"
-    %IOTDB_CONF%\iotdb-datanode.properties') do (
-      set dn_data_region_consensus_port=%%i
-  )
-) ELSE IF EXIST "%IOTDB_HOME%\conf\iotdb-datanode.properties" (
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^dn_rpc_port"
-      %IOTDB_HOME%\conf\iotdb-datanode.properties') do (
-        set dn_rpc_port=%%i
-  )
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^dn_internal_port"
-      %IOTDB_HOME%\conf\iotdb-datanode.properties') do (
-        set dn_internal_port=%%i
-  )
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i 
"^dn_mpp_data_exchange_port"
-    %IOTDB_HOME%\conf\iotdb-datanode.properties') do (
-      set dn_mpp_data_exchange_port=%%i
-  )
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i 
"^dn_schema_region_consensus_port"
-    %IOTDB_HOME%\conf\iotdb-datanode.properties') do (
-      set dn_schema_region_consensus_port=%%i
-  )
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i 
"^dn_data_region_consensus_port"
-    %IOTDB_HOME%\conf\iotdb-datanode.properties') do (
+    %DATANODE_CONFIG_FILE_PATH%') do (
       set dn_data_region_consensus_port=%%i
   )
 ) ELSE (
@@ -400,24 +394,26 @@ IF EXIST "%IOTDB_CONF%\iotdb-datanode.properties" (
   set dn_data_region_consensus_port=10760
 )
 
-IF EXIST "%IOTDB_CONF%\iotdb-confignode.properties" (
+IF EXIST "%IOTDB_CONF%\iotdb-system.properties" (
+  set CONFIGNODE_CONFIG_FILE_PATH="%IOTDB_CONF%\iotdb-system.properties"
+) ELSE IF EXIST "%IOTDB_HOME%\conf\iotdb-system.properties" (
+  set CONFIGNODE_CONFIG_FILE_PATH="%IOTDB_HOME%\conf\iotdb-system.properties"
+) ELSE IF EXIST "%IOTDB_CONF%\iotdb-system.properties" (
+  set CONFIGNODE_CONFIG_FILE_PATH="%IOTDB_CONF%\iotdb-confignode.properties"
+) ELSE IF EXIST "%IOTDB_HOME%\conf\iotdb-confignode.properties" (
+  set 
CONFIGNODE_CONFIG_FILE_PATH="%IOTDB_HOME%\conf\iotdb-confignode.properties"
+) ELSE (
+  set CONFIGNODE_CONFIG_FILE_PATH=
+)
+IF DEFINED CONFIGNODE_CONFIG_FILE_PATH (
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^cn_internal_port"
-    %IOTDB_CONF%\iotdb-confignode.properties') do (
+    %CONFIGNODE_CONFIG_FILE_PATH%') do (
       set cn_internal_port=%%i
   )
   for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^cn_consensus_port"
-    %IOTDB_CONF%\iotdb-confignode.properties') do (
+    %CONFIGNODE_CONFIG_FILE_PATH%') do (
       set cn_consensus_port=%%i
   )
-) ELSE IF EXIST "%IOTDB_HOME%\conf\iotdb-confignode.properties" (
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^cn_internal_port"
-      %IOTDB_HOME%\conf\iotdb-confignode.properties') do (
-        set cn_internal_port=%%i
-  )
-  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^cn_consensus_port"
-      %IOTDB_HOME%\conf\iotdb-confignode.properties') do (
-        set cn_consensus_port=%%i
-  )
 ) ELSE (
   set cn_internal_port=10710
   set cn_consensus_port=10720
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/sbin/health_check.sh 
b/iotdb-core/node-commons/src/assembly/resources/sbin/health_check.sh
index 997f7586da4..9cb08bb5e33 100644
--- a/iotdb-core/node-commons/src/assembly/resources/sbin/health_check.sh
+++ b/iotdb-core/node-commons/src/assembly/resources/sbin/health_check.sh
@@ -170,7 +170,12 @@ get_properties_value() {
     local file_name=$1
     local property_name=$2
     local default_value=$3
-    local property_value=$(sed "/^${property_name}=/!d;s/.*=//" 
"${IOTDB_HOME}/conf/${file_name}.properties")
+    if [ -f "${IOTDB_HOME}/conf/iotdb-system.properties" ]; then
+        local file_path="${IOTDB_HOME}/conf/iotdb-system.properties"
+    else
+        local file_path="${IOTDB_HOME}/conf/${file_name}.properties"
+    fi
+    local property_value=$(sed "/^${property_name}=/!d;s/.*=//" "${file_path}")
     if [ -z "$property_value" ]; then
             property_value="$default_value"
     fi
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/sbin/iotdb-common.sh 
b/iotdb-core/node-commons/src/assembly/resources/sbin/iotdb-common.sh
index 7539ec88348..753d1bccb05 100755
--- a/iotdb-core/node-commons/src/assembly/resources/sbin/iotdb-common.sh
+++ b/iotdb-core/node-commons/src/assembly/resources/sbin/iotdb-common.sh
@@ -156,7 +156,19 @@ checkDataNodePortUsages () {
     echo "Warning: If you do not use sudo, the checking may not detect all the 
occupied ports."
   fi
   occupied=false
-  if [ -f "$IOTDB_CONF/iotdb-datanode.properties" ]; then
+  if [ -f "$IOTDB_CONF/iotdb-system.properties" ]; then
+      dn_rpc_port=$(sed '/^dn_rpc_port=/!d;s/.*=//' 
"${IOTDB_CONF}"/iotdb-system.properties)
+      dn_internal_port=$(sed '/^dn_internal_port=/!d;s/.*=//' 
"${IOTDB_CONF}"/iotdb-system.properties)
+      dn_mpp_data_exchange_port=$(sed 
'/^dn_mpp_data_exchange_port=/!d;s/.*=//' 
"${IOTDB_CONF}"/iotdb-system.properties)
+      dn_schema_region_consensus_port=$(sed 
'/^dn_schema_region_consensus_port=/!d;s/.*=//' 
"${IOTDB_CONF}"/iotdb-system.properties)
+      dn_data_region_consensus_port=$(sed 
'/^dn_data_region_consensus_port=/!d;s/.*=//' 
"${IOTDB_CONF}"/iotdb-system.properties)
+  elif [ -f "$IOTDB_HOME/conf/iotdb-system.properties" ]; then
+      dn_rpc_port=$(sed '/^dn_rpc_port=/!d;s/.*=//' 
"${IOTDB_HOME}"/conf/iotdb-system.properties)
+      dn_internal_port=$(sed '/^dn_internal_port=/!d;s/.*=//' 
"${IOTDB_HOME}"/conf/iotdb-system.properties)
+      dn_mpp_data_exchange_port=$(sed 
'/^dn_mpp_data_exchange_port=/!d;s/.*=//' 
"${IOTDB_HOME}"/conf/iotdb-system.properties)
+      dn_schema_region_consensus_port=$(sed 
'/^dn_schema_region_consensus_port=/!d;s/.*=//' 
"${IOTDB_HOME}"/conf/iotdb-system.properties)
+      dn_data_region_consensus_port=$(sed 
'/^dn_data_region_consensus_port=/!d;s/.*=//' 
"${IOTDB_HOME}"/conf/iotdb-system.properties)
+  elif [ -f "$IOTDB_CONF/iotdb-datanode.properties" ]; then
     dn_rpc_port=$(sed '/^dn_rpc_port=/!d;s/.*=//' 
"${IOTDB_CONF}"/iotdb-datanode.properties)
     dn_internal_port=$(sed '/^dn_internal_port=/!d;s/.*=//' 
"${IOTDB_CONF}"/iotdb-datanode.properties)
     dn_mpp_data_exchange_port=$(sed '/^dn_mpp_data_exchange_port=/!d;s/.*=//' 
"${IOTDB_CONF}"/iotdb-datanode.properties)
@@ -169,7 +181,7 @@ checkDataNodePortUsages () {
     dn_schema_region_consensus_port=$(sed 
'/^dn_schema_region_consensus_port=/!d;s/.*=//' 
"${IOTDB_CONF}"/iotdb-datanode.properties)
     dn_data_region_consensus_port=$(sed 
'/^dn_data_region_consensus_port=/!d;s/.*=//' 
"${IOTDB_CONF}"/iotdb-datanode.properties)
   else
-    echo "Warning: cannot find iotdb-datanode.properties, check the default 
configuration"
+    echo "Warning: cannot find iotdb-system.properties or 
iotdb-datanode.properties, check the default configuration"
   fi
   dn_rpc_port=${dn_rpc_port:-6667}
   dn_internal_port=${dn_internal_port:-10730}
@@ -244,14 +256,20 @@ checkConfigNodePortUsages () {
     echo "Warning: If you do not use sudo, the checking may not detect all the 
occupied ports."
   fi
   occupied=false
-  if [ -f "$CONFIGNODE_CONF/iotdb-confignode.properties" ]; then
+  if [ -f "$CONFIGNODE_CONF/iotdb-system.properties" ]; then
+    cn_internal_port=$(sed '/^cn_internal_port=/!d;s/.*=//' 
"${CONFIGNODE_CONF}"/iotdb-system.properties)
+    cn_consensus_port=$(sed '/^cn_consensus_port=/!d;s/.*=//' 
"${CONFIGNODE_CONF}"/iotdb-system.properties)
+  elif [ -f "$CONFIGNODE_HOME/conf/iotdb-system.properties" ]; then
+    cn_internal_port=$(sed '/^cn_internal_port=/!d;s/.*=//' 
"${CONFIGNODE_HOME}"/conf/iotdb-system.properties)
+    cn_consensus_port=$(sed '/^cn_consensus_port=/!d;s/.*=//' 
"${CONFIGNODE_HOME}"/conf/iotdb-system.properties)
+  elif [ -f "$CONFIGNODE_CONF/iotdb-confignode.properties" ]; then
     cn_internal_port=$(sed '/^cn_internal_port=/!d;s/.*=//' 
"${CONFIGNODE_CONF}"/iotdb-confignode.properties)
     cn_consensus_port=$(sed '/^cn_consensus_port=/!d;s/.*=//' 
"${CONFIGNODE_CONF}"/iotdb-confignode.properties)
   elif [ -f "$CONFIGNODE_HOME/conf/iotdb-confignode.properties" ]; then
     cn_internal_port=$(sed '/^cn_internal_port=/!d;s/.*=//' 
"${CONFIGNODE_HOME}"/conf/iotdb-confignode.properties)
     cn_consensus_port=$(sed '/^cn_consensus_port=/!d;s/.*=//' 
"${CONFIGNODE_HOME}"/conf/iotdb-confignode.properties)
   else
-    echo "Cannot find iotdb-confignode.properties, check the default 
configuration"
+    echo "Cannot find iotdb-system.properties or iotdb-confignode.properties, 
check the default configuration"
   fi
   cn_internal_port=${cn_internal_port:-10710}
   cn_consensus_port=${cn_consensus_port:-10720}
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
index 6e8c9434006..59de17e371e 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
@@ -36,7 +36,10 @@ import java.util.concurrent.TimeUnit;
 
 public class CommonConfig {
 
-  public static final String CONFIG_NAME = "iotdb-common.properties";
+  public static final String OLD_CONFIG_NODE_CONFIG_NAME = 
"iotdb-confignode.properties";
+  public static final String OLD_DATA_NODE_CONFIG_NAME = 
"iotdb-datanode.properties";
+  public static final String OLD_COMMON_CONFIG_NAME = 
"iotdb-common.properties";
+  public static final String SYSTEM_CONFIG_NAME = "iotdb-system.properties";
   private static final Logger logger = 
LoggerFactory.getLogger(CommonConfig.class);
 
   // Open ID Secret
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigFileAutoUpdateTool.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigFileAutoUpdateTool.java
new file mode 100644
index 00000000000..49b44f0bc02
--- /dev/null
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/ConfigFileAutoUpdateTool.java
@@ -0,0 +1,126 @@
+/*
+ * 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.iotdb.commons.conf;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.net.URL;
+import java.nio.file.Files;
+import java.util.concurrent.TimeUnit;
+
+public class ConfigFileAutoUpdateTool {
+
+  private final String lockFileSuffix = ".lock";
+  private final long maxTimeMillsToAcquireLock = TimeUnit.SECONDS.toMillis(20);
+  private final long waitTimeMillsPerCheck = 
TimeUnit.MILLISECONDS.toMillis(100);
+  private Logger logger = 
LoggerFactory.getLogger(ConfigFileAutoUpdateTool.class);
+  private String license =
+      "#\n"
+          + "# Licensed to the Apache Software Foundation (ASF) under one\n"
+          + "# or more contributor license agreements.  See the NOTICE file\n"
+          + "# distributed with this work for additional information\n"
+          + "# regarding copyright ownership.  The ASF licenses this file\n"
+          + "# to you under the Apache License, Version 2.0 (the\n"
+          + "# \"License\"); you may not use this file except in compliance\n"
+          + "# with the License.  You may obtain a copy of the License at\n"
+          + "#\n"
+          + "#     http://www.apache.org/licenses/LICENSE-2.0\n";
+          + "#\n"
+          + "# Unless required by applicable law or agreed to in writing,\n"
+          + "# software distributed under the License is distributed on an\n"
+          + "# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n"
+          + "# KIND, either express or implied.  See the License for the\n"
+          + "# specific language governing permissions and limitations\n"
+          + "# under the License.";
+
+  public void checkAndMayUpdate(URL systemUrl, URL configNodeUrl, URL 
dataNodeUrl, URL commonUrl)
+      throws IOException, InterruptedException {
+    if (systemUrl == null || configNodeUrl == null || dataNodeUrl == null || 
commonUrl == null) {
+      return;
+    }
+    File systemFile = new File(systemUrl.getFile());
+    File configNodeFile = new File(configNodeUrl.getFile());
+    File dataNodeFile = new File(dataNodeUrl.getFile());
+    File commonFile = new File(commonUrl.getFile());
+
+    if (systemFile.exists()) {
+      return;
+    }
+    boolean canUpdate = (configNodeFile.exists() || dataNodeFile.exists()) && 
commonFile.exists();
+    if (!canUpdate) {
+      return;
+    }
+
+    File lockFile = new File(systemFile.getPath() + lockFileSuffix);
+    acquireTargetFileLock(lockFile);
+    try {
+      // other progress updated this file
+      if (systemFile.exists()) {
+        return;
+      }
+      try (RandomAccessFile raf = new RandomAccessFile(lockFile, "rw")) {
+        raf.write(license.getBytes());
+        String configNodeContent = readConfigLines(configNodeFile);
+        raf.write(configNodeContent.getBytes());
+        String dataNodeContent = readConfigLines(dataNodeFile);
+        raf.write(dataNodeContent.getBytes());
+        String commonContent = readConfigLines(commonFile);
+        raf.write(commonContent.getBytes());
+      }
+      Files.move(lockFile.toPath(), systemFile.toPath());
+    } finally {
+      releaseFileLock(lockFile);
+    }
+  }
+
+  private String readConfigLines(File file) throws IOException {
+    if (!file.exists()) {
+      return "";
+    }
+    byte[] bytes = Files.readAllBytes(file.toPath());
+    String content = new String(bytes);
+    return content.replace(license, "");
+  }
+
+  private void acquireTargetFileLock(File file) throws IOException, 
InterruptedException {
+    long totalWaitTime = 0;
+    while (totalWaitTime < maxTimeMillsToAcquireLock) {
+      if (file.createNewFile()) {
+        return;
+      }
+      totalWaitTime += waitTimeMillsPerCheck;
+      Thread.sleep(waitTimeMillsPerCheck);
+    }
+    logger.warn(
+        "Waiting for {} seconds to acquire configuration file update lock."
+            + " There may have been an unexpected interruption in the last"
+            + " configuration file update. Ignore temporary file {}",
+        totalWaitTime / 1000,
+        file.getName());
+  }
+
+  private void releaseFileLock(File file) throws IOException {
+    Files.deleteIfExists(file.toPath());
+  }
+}


Reply via email to