You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ca...@apache.org on 2022/12/29 10:52:03 UTC

[iotdb] branch rel/1.0 updated: [To rel/1.0][IOTDB-5282] Add SQL: show cluster parameter (#8657)

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

caogaofei pushed a commit to branch rel/1.0
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/1.0 by this push:
     new ce8de09999 [To rel/1.0][IOTDB-5282] Add SQL: show cluster parameter (#8657)
ce8de09999 is described below

commit ce8de0999932abfc76314d80543d784c4225766c
Author: YongzaoDan <33...@users.noreply.github.com>
AuthorDate: Thu Dec 29 18:51:57 2022 +0800

    [To rel/1.0][IOTDB-5282] Add SQL: show cluster parameter (#8657)
---
 .../org/apache/iotdb/db/qp/sql/IdentifierParser.g4 |   1 +
 .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4   |   9 +-
 .../antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4  |   4 +
 .../iotdb/confignode/manager/ConfigManager.java    | 112 ++++++++++++-----
 .../apache/iotdb/confignode/manager/IManager.java  |  13 ++
 .../iotdb/confignode/service/ConfigNode.java       |  17 +--
 .../thrift/ConfigNodeRPCServiceProcessor.java      |   6 +
 docs/UserGuide/Cluster/Cluster-Maintenance.md      |  35 ++++++
 docs/zh/UserGuide/Cluster/Cluster-Concept.md       |  24 ++--
 docs/zh/UserGuide/Cluster/Cluster-Maintenance.md   |  35 ++++++
 .../org/apache/iotdb/itbase/env/BaseConfig.java    |  30 ++++-
 .../confignode/it/IoTDBConfigNodeSnapshotIT.java   |   2 +-
 .../it/cluster/IoTDBClusterNodeErrorStartUpIT.java |   3 +-
 .../it/cluster/IoTDBClusterNodeGetterIT.java       |  73 +++++++----
 .../it/cluster/IoTDBClusterRestartIT.java          |   2 +-
 .../it/load/IoTDBConfigNodeSwitchLeaderIT.java     |   2 +-
 .../it/partition/IoTDBPartitionDurableIT.java      |   2 +-
 .../it/partition/IoTDBPartitionGetterIT.java       |   2 +-
 .../confignode/it/utils/ConfigNodeTestUtils.java   |  46 ++++---
 .../apache/iotdb/commons/conf/IoTDBConstant.java   |  20 ++-
 .../apache/iotdb/db/client/ConfigNodeClient.java   |  22 ++++
 .../db/mpp/common/header/ColumnHeaderConstant.java |   6 +
 .../db/mpp/common/header/DatasetHeaderFactory.java |   4 +
 .../plan/execution/config/ConfigTaskVisitor.java   |  11 +-
 .../config/executor/ClusterConfigTaskExecutor.java |  19 +++
 .../config/executor/IConfigTaskExecutor.java       |   2 +
 .../executor/StandaloneConfigTaskExecutor.java     |  10 ++
 .../config/metadata/ShowClusterParametersTask.java | 136 +++++++++++++++++++++
 .../iotdb/db/mpp/plan/parser/ASTVisitor.java       |  11 +-
 .../statement/metadata/ShowClusterStatement.java   |   9 ++
 .../src/main/thrift/confignode.thrift              |  42 +++++--
 31 files changed, 581 insertions(+), 129 deletions(-)

diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
index 3aea385462..db906047c5 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
@@ -194,4 +194,5 @@ keyWords
     | WITHOUT
     | WRITABLE
     | PRIVILEGE_VALUE
+    | PARAMETERS
     ;
\ No newline at end of file
diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
index c33bd9c3f9..6c0f6959b8 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
@@ -42,7 +42,7 @@ ddlStatement
     | dropFunction | dropTrigger | dropContinuousQuery | dropSchemaTemplate
     | setTTL | unsetTTL | startTrigger | stopTrigger | setSchemaTemplate | unsetSchemaTemplate
     | showStorageGroup | showDevices | showTimeseries | showChildPaths | showChildNodes
-    | showFunctions | showTriggers | showContinuousQueries | showTTL | showAllTTL | showCluster | showClusterDetails | showRegion | showDataNodes | showConfigNodes
+    | showFunctions | showTriggers | showContinuousQueries | showTTL | showAllTTL | showCluster | showRegion | showDataNodes | showConfigNodes
     | showSchemaTemplates | showNodesInSchemaTemplate
     | showPathsUsingSchemaTemplate | showPathsSetSchemaTemplate
     | countStorageGroup | countDevices | countTimeseries | countNodes
@@ -336,12 +336,7 @@ showAllTTL
 
 // Show Cluster
 showCluster
-    : SHOW CLUSTER
-    ;
-
-// Show Cluster Details
-showClusterDetails
-    : SHOW CLUSTER DETAILS
+    : SHOW CLUSTER (DETAILS | PARAMETERS)?
     ;
 
 // Show Region
diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
index f531c27425..629f7e0c39 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
@@ -121,6 +121,10 @@ CLUSTER
     : C L U S T E R
     ;
 
+PARAMETERS
+    : P A R A M E T E R S
+    ;
+
 CONCAT
     : C O N C A T
     ;
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index 4d8d0990c0..b765b81675 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -30,6 +30,7 @@ import org.apache.iotdb.common.rpc.thrift.TSeriesPartitionSlot;
 import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
 import org.apache.iotdb.commons.cluster.NodeStatus;
 import org.apache.iotdb.commons.cluster.NodeType;
+import org.apache.iotdb.commons.conf.CommonConfig;
 import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.IllegalPathException;
@@ -95,6 +96,7 @@ import org.apache.iotdb.confignode.persistence.node.NodeInfo;
 import org.apache.iotdb.confignode.persistence.partition.PartitionInfo;
 import org.apache.iotdb.confignode.persistence.schema.ClusterSchemaInfo;
 import org.apache.iotdb.confignode.persistence.sync.ClusterSyncInfo;
+import org.apache.iotdb.confignode.rpc.thrift.TClusterParameters;
 import org.apache.iotdb.confignode.rpc.thrift.TConfigNodeRegisterReq;
 import org.apache.iotdb.confignode.rpc.thrift.TConfigNodeRegisterResp;
 import org.apache.iotdb.confignode.rpc.thrift.TConfigNodeRestartReq;
@@ -133,6 +135,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TSchemaPartitionTableResp;
 import org.apache.iotdb.confignode.rpc.thrift.TSetDataNodeStatusReq;
 import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaTemplateReq;
 import org.apache.iotdb.confignode.rpc.thrift.TShowCQResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowClusterParametersResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
@@ -173,6 +176,9 @@ public class ConfigManager implements IManager {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(ConfigManager.class);
 
+  private static final ConfigNodeConfig CONF = ConfigNodeDescriptor.getInstance().getConf();
+  private static final CommonConfig COMMON_CONF = CommonDescriptor.getInstance().getConfig();
+
   /** Manage PartitionTable read/write requests through the ConsensusLayer */
   private volatile ConsensusManager consensusManager;
 
@@ -394,6 +400,40 @@ public class ConfigManager implements IManager {
     }
   }
 
+  @Override
+  public TShowClusterParametersResp showClusterParameters() {
+    TSStatus status = confirmLeader();
+    TShowClusterParametersResp resp = new TShowClusterParametersResp();
+    resp.setStatus(status);
+    if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+      resp.setClusterParameters(getClusterParameters());
+    }
+    return resp;
+  }
+
+  public TClusterParameters getClusterParameters() {
+    TClusterParameters clusterParameters = new TClusterParameters();
+    clusterParameters.setClusterName(CONF.getClusterName());
+    clusterParameters.setConfigNodeConsensusProtocolClass(
+        CONF.getConfigNodeConsensusProtocolClass());
+    clusterParameters.setDataRegionConsensusProtocolClass(
+        CONF.getDataRegionConsensusProtocolClass());
+    clusterParameters.setSchemaRegionConsensusProtocolClass(
+        CONF.getSchemaRegionConsensusProtocolClass());
+    clusterParameters.setSeriesPartitionSlotNum(CONF.getSeriesSlotNum());
+    clusterParameters.setSeriesPartitionExecutorClass(CONF.getSeriesPartitionExecutorClass());
+    clusterParameters.setDefaultTTL(COMMON_CONF.getDefaultTTLInMs());
+    clusterParameters.setTimePartitionInterval(CONF.getTimePartitionInterval());
+    clusterParameters.setDataReplicationFactor(CONF.getDataReplicationFactor());
+    clusterParameters.setSchemaReplicationFactor(CONF.getSchemaReplicationFactor());
+    clusterParameters.setDataRegionPerProcessor(CONF.getDataRegionPerProcessor());
+    clusterParameters.setSchemaRegionPerDataNode(CONF.getSchemaRegionPerDataNode());
+    clusterParameters.setDiskSpaceWarningThreshold(COMMON_CONF.getDiskSpaceWarningThreshold());
+    clusterParameters.setReadConsistencyLevel(CONF.getReadConsistencyLevel());
+    clusterParameters.setLeastDataRegionGroupNum(CONF.getLeastDataRegionGroupNum());
+    return clusterParameters;
+  }
+
   @Override
   public TSStatus setTTL(SetTTLPlan setTTLPlan) {
     TSStatus status = confirmLeader();
@@ -822,50 +862,76 @@ public class ConfigManager implements IManager {
   public TSStatus checkConfigNodeGlobalConfig(TConfigNodeRegisterReq req) {
     final String errorPrefix = "Reject register, please ensure that the parameter ";
     final String errorSuffix = " is consistent with the Seed-ConfigNode.";
-
-    ConfigNodeConfig conf = ConfigNodeDescriptor.getInstance().getConf();
     TSStatus errorStatus = new TSStatus(TSStatusCode.CONFIGURATION_ERROR.getStatusCode());
-    if (!req.getDataRegionConsensusProtocolClass()
-        .equals(conf.getDataRegionConsensusProtocolClass())) {
+    TClusterParameters clusterParameters = req.getClusterParameters();
+
+    if (!clusterParameters.getClusterName().equals(CONF.getClusterName())) {
+      return errorStatus.setMessage(errorPrefix + "cluster_name" + errorSuffix);
+    }
+
+    if (!clusterParameters
+        .getConfigNodeConsensusProtocolClass()
+        .equals(CONF.getConfigNodeConsensusProtocolClass())) {
+      return errorStatus.setMessage(
+          errorPrefix + "config_node_consensus_protocol_class" + errorSuffix);
+    }
+    if (!clusterParameters
+        .getDataRegionConsensusProtocolClass()
+        .equals(CONF.getDataRegionConsensusProtocolClass())) {
       return errorStatus.setMessage(
           errorPrefix + "data_region_consensus_protocol_class" + errorSuffix);
     }
-    if (!req.getSchemaRegionConsensusProtocolClass()
-        .equals(conf.getSchemaRegionConsensusProtocolClass())) {
+    if (!clusterParameters
+        .getSchemaRegionConsensusProtocolClass()
+        .equals(CONF.getSchemaRegionConsensusProtocolClass())) {
       return errorStatus.setMessage(
           errorPrefix + "schema_region_consensus_protocol_class" + errorSuffix);
     }
-    if (req.getSeriesPartitionSlotNum() != conf.getSeriesSlotNum()) {
+
+    if (clusterParameters.getSeriesPartitionSlotNum() != CONF.getSeriesSlotNum()) {
       return errorStatus.setMessage(errorPrefix + "series_partition_slot_num" + errorSuffix);
     }
-    if (!req.getSeriesPartitionExecutorClass().equals(conf.getSeriesPartitionExecutorClass())) {
+    if (!clusterParameters
+        .getSeriesPartitionExecutorClass()
+        .equals(CONF.getSeriesPartitionExecutorClass())) {
       return errorStatus.setMessage(errorPrefix + "series_partition_executor_class" + errorSuffix);
     }
-    if (req.getDefaultTTL() != CommonDescriptor.getInstance().getConfig().getDefaultTTLInMs()) {
+
+    if (clusterParameters.getDefaultTTL()
+        != CommonDescriptor.getInstance().getConfig().getDefaultTTLInMs()) {
       return errorStatus.setMessage(errorPrefix + "default_ttl" + errorSuffix);
     }
-    if (req.getTimePartitionInterval() != conf.getTimePartitionInterval()) {
+    if (clusterParameters.getTimePartitionInterval() != CONF.getTimePartitionInterval()) {
       return errorStatus.setMessage(errorPrefix + "time_partition_interval" + errorSuffix);
     }
-    if (req.getSchemaReplicationFactor() != conf.getSchemaReplicationFactor()) {
+
+    if (clusterParameters.getSchemaReplicationFactor() != CONF.getSchemaReplicationFactor()) {
       return errorStatus.setMessage(errorPrefix + "schema_replication_factor" + errorSuffix);
     }
-    if (req.getSchemaRegionPerDataNode() != conf.getSchemaRegionPerDataNode()) {
-      return errorStatus.setMessage(errorPrefix + "schema_region_per_data_node" + errorSuffix);
-    }
-    if (req.getDataReplicationFactor() != conf.getDataReplicationFactor()) {
+    if (clusterParameters.getDataReplicationFactor() != CONF.getDataReplicationFactor()) {
       return errorStatus.setMessage(errorPrefix + "data_replication_factor" + errorSuffix);
     }
-    if (req.getDataRegionPerProcessor() != conf.getDataRegionPerProcessor()) {
+
+    if (clusterParameters.getSchemaRegionPerDataNode() != CONF.getSchemaRegionPerDataNode()) {
+      return errorStatus.setMessage(errorPrefix + "schema_region_per_data_node" + errorSuffix);
+    }
+    if (clusterParameters.getDataRegionPerProcessor() != CONF.getDataRegionPerProcessor()) {
       return errorStatus.setMessage(errorPrefix + "data_region_per_processor" + errorSuffix);
     }
-    if (!req.getReadConsistencyLevel().equals(conf.getReadConsistencyLevel())) {
+
+    if (!clusterParameters.getReadConsistencyLevel().equals(CONF.getReadConsistencyLevel())) {
       return errorStatus.setMessage(errorPrefix + "read_consistency_level" + errorSuffix);
     }
-    if (req.getDiskSpaceWarningThreshold()
+
+    if (clusterParameters.getDiskSpaceWarningThreshold()
         != CommonDescriptor.getInstance().getConfig().getDiskSpaceWarningThreshold()) {
       return errorStatus.setMessage(errorPrefix + "disk_space_warning_threshold" + errorSuffix);
     }
+
+    if (clusterParameters.getLeastDataRegionGroupNum() != CONF.getLeastDataRegionGroupNum()) {
+      return errorStatus.setMessage(errorPrefix + "least_data_region_group_num" + errorSuffix);
+    }
+
     return null;
   }
 
@@ -1492,16 +1558,6 @@ public class ConfigManager implements IManager {
     return filteredRegionReplicaSets;
   }
 
-  public TConfigNodeLocation getConfigNodeLocation(int nodeId) {
-    List<TConfigNodeLocation> configNodeLocations = this.nodeManager.getRegisteredConfigNodes();
-    for (TConfigNodeLocation configNodeLocation : configNodeLocations) {
-      if (configNodeLocation.getConfigNodeId() == nodeId) {
-        return configNodeLocation;
-      }
-    }
-    return null;
-  }
-
   public TSStatus transfer(List<TDataNodeLocation> newUnknownDataList) {
     Map<Integer, TDataNodeLocation> runningDataNodeLocationMap = new HashMap<>();
     nodeManager
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
index 4a1534b88b..490b512091 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
@@ -87,6 +87,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TSchemaPartitionTableResp;
 import org.apache.iotdb.confignode.rpc.thrift.TSetDataNodeStatusReq;
 import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaTemplateReq;
 import org.apache.iotdb.confignode.rpc.thrift.TShowCQResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowClusterParametersResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
@@ -227,8 +228,20 @@ public interface IManager {
    */
   DataSet getDataNodeConfiguration(GetDataNodeConfigurationPlan getDataNodeConfigurationPlan);
 
+  /**
+   * Get Cluster Nodes' information
+   *
+   * @return TShowClusterResp
+   */
   TShowClusterResp showCluster();
 
+  /**
+   * Get Cluster parameters
+   *
+   * @return TShowClusterParametersResp
+   */
+  TShowClusterParametersResp showClusterParameters();
+
   TSStatus setTTL(SetTTLPlan configRequest);
 
   TSStatus setSchemaReplicationFactor(SetSchemaReplicationFactorPlan configPhysicalPlan);
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java b/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
index 156ae2fb5c..397ede2a01 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/service/ConfigNode.java
@@ -21,8 +21,6 @@ package org.apache.iotdb.confignode.service;
 import org.apache.iotdb.common.rpc.thrift.TConfigNodeLocation;
 import org.apache.iotdb.common.rpc.thrift.TEndPoint;
 import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import org.apache.iotdb.commons.conf.CommonConfig;
-import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.exception.StartupException;
 import org.apache.iotdb.commons.service.JMXService;
 import org.apache.iotdb.commons.service.RegisterManager;
@@ -58,7 +56,6 @@ public class ConfigNode implements ConfigNodeMBean {
   private static final Logger LOGGER = LoggerFactory.getLogger(ConfigNode.class);
 
   private static final ConfigNodeConfig CONF = ConfigNodeDescriptor.getInstance().getConf();
-  private static final CommonConfig COMMON_CONF = CommonDescriptor.getInstance().getConfig();
 
   private static final int STARTUP_RETRY_NUM = 10;
   private static final int SCHEDULE_WAITING_RETRY_NUM = 20;
@@ -238,19 +235,7 @@ public class ConfigNode implements ConfigNodeMBean {
                 INIT_NON_SEED_CONFIG_NODE_ID,
                 new TEndPoint(CONF.getInternalAddress(), CONF.getInternalPort()),
                 new TEndPoint(CONF.getInternalAddress(), CONF.getConsensusPort())),
-            CONF.getDataRegionConsensusProtocolClass(),
-            CONF.getSchemaRegionConsensusProtocolClass(),
-            CONF.getSeriesSlotNum(),
-            CONF.getSeriesPartitionExecutorClass(),
-            COMMON_CONF.getDefaultTTLInMs(),
-            CONF.getTimePartitionInterval(),
-            CONF.getSchemaReplicationFactor(),
-            CONF.getSchemaRegionPerDataNode(),
-            CONF.getDataReplicationFactor(),
-            CONF.getDataRegionPerProcessor(),
-            CONF.getReadConsistencyLevel(),
-            COMMON_CONF.getDiskSpaceWarningThreshold(),
-            CONF.getLeastDataRegionGroupNum());
+            configManager.getClusterParameters());
 
     TEndPoint targetConfigNode = CONF.getTargetConfigNode();
     if (targetConfigNode == null) {
diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
index c31911089b..7daf3d6eda 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
@@ -132,6 +132,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaTemplateReq;
 import org.apache.iotdb.confignode.rpc.thrift.TSetStorageGroupReq;
 import org.apache.iotdb.confignode.rpc.thrift.TSetTimePartitionIntervalReq;
 import org.apache.iotdb.confignode.rpc.thrift.TShowCQResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowClusterParametersResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
@@ -260,6 +261,11 @@ public class ConfigNodeRPCServiceProcessor implements IConfigNodeRPCService.Ifac
     return configManager.showCluster();
   }
 
+  @Override
+  public TShowClusterParametersResp showClusterParameters() throws TException {
+    return configManager.showClusterParameters();
+  }
+
   @Override
   public TSStatus setStorageGroup(TSetStorageGroupReq req) throws TException {
     TStorageGroupSchema storageGroupSchema = req.getStorageGroup();
diff --git a/docs/UserGuide/Cluster/Cluster-Maintenance.md b/docs/UserGuide/Cluster/Cluster-Maintenance.md
index a0b77068f6..8573db4119 100644
--- a/docs/UserGuide/Cluster/Cluster-Maintenance.md
+++ b/docs/UserGuide/Cluster/Cluster-Maintenance.md
@@ -21,6 +21,41 @@
 
 # Cluster Information Query Command
 
+## Show Cluster Parameters
+
+Currently, IoTDB supports showing key parameters of the cluster:
+```
+SHOW CLUSTER PARAMETERS
+```
+
+Eg:
+```
+IoTDB> show cluster parameters
++----------------------------------+-----------------------------------------------------------------+
+|                 ClusterParameters|                                                            Value|
++----------------------------------+-----------------------------------------------------------------+
+|                       ClusterName|                                                   defaultCluster|
+|             DataReplicationFactor|                                                                1|
+|           SchemaReplicationFactor|                                                                1|
+|  DataRegionConsensusProtocolClass|                      org.apache.iotdb.consensus.iot.IoTConsensus|
+|SchemaRegionConsensusProtocolClass|                  org.apache.iotdb.consensus.ratis.RatisConsensus|
+|  ConfigNodeConsensusProtocolClass|                  org.apache.iotdb.consensus.ratis.RatisConsensus|
+|             TimePartitionInterval|                                                        604800000|
+|                    DefaultTTL(ms)|                                              9223372036854775807|
+|              ReadConsistencyLevel|                                                           strong|
+|           SchemaRegionPerDataNode|                                                              1.0|
+|            DataRegionPerProcessor|                                                              1.0|
+|           LeastDataRegionGroupNum|                                                                5|
+|                     SeriesSlotNum|                                                            10000|
+|           SeriesSlotExecutorClass|org.apache.iotdb.commons.partition.executor.hash.BKDRHashExecutor|
+|         DiskSpaceWarningThreshold|                                                             0.05|
++----------------------------------+-----------------------------------------------------------------+
+Total line number = 15
+It costs 0.242s
+```
+
+**Notice:** Ensure that all key parameters displayed in this SQL are consist on each node in the same cluster
+
 ## Show ConfigNode information
 
 Currently, IoTDB supports showing ConfigNode information by the following SQL:
diff --git a/docs/zh/UserGuide/Cluster/Cluster-Concept.md b/docs/zh/UserGuide/Cluster/Cluster-Concept.md
index 06bb272ee7..5e16fc2ea6 100644
--- a/docs/zh/UserGuide/Cluster/Cluster-Concept.md
+++ b/docs/zh/UserGuide/Cluster/Cluster-Concept.md
@@ -39,18 +39,18 @@ Client 只能通过 DataNode 进行数据读写。
 
 ### 名词解释
 
-| 名词                | 类型            | 解释                                   |
-|:------------------|:--------------|:-------------------------------------|
-| ConfigNode        | 节点角色         | 配置节点,管理集群节点信息、分区信息,监控集群状态、控制负载均衡     |
-| DataNode          | 节点角色         | 数据节点,管理数据、元数据                        |
-| Database          | 元数据           | 数据库,不同数据库的数据物理隔离                     |
-| DeviceId          | 设备名           | 元数据树中从 root 到倒数第二级的全路径表示一个设备名        |
-| SeriesSlot        | 元数据分区        | 每个 Database 包含多个元数据分区,根据设备名进行分区      |
-| SchemaRegion      | 一组元数据分区     | 多个 SeriesSlot 的集合                    |
-| SchemaRegionGroup | 逻辑概念          | 包含元数据副本数个 SchemaRegion,管理相同的元数据,互为备份 |
-| SeriesTimeSlot    | 数据分区          | 一个元数据分区的一段时间的数据对应一个数据分区,每个元数据分区对应多个数据分区,根据时间范围进行分区    |
-| DataRegion        | 一组数据分区       | 多个 SeriesTimeSlot 的集合                |
-| DataRegionGroup   | 逻辑概念          | 包含数据副本数个 DataRegion,管理相同的数据,互为备份     |
+| 名词                | 类型      | 解释                                                 |
+|:------------------|:--------|:---------------------------------------------------|
+| ConfigNode        | 节点角色    | 配置节点,管理集群节点信息、分区信息,监控集群状态、控制负载均衡                   |
+| DataNode          | 节点角色    | 数据节点,管理数据、元数据                                      |
+| Database          | 元数据     | 数据库,不同数据库的数据物理隔离                                   |
+| DeviceId          | 设备名     | 元数据树中从 root 到倒数第二级的全路径表示一个设备名                      |
+| SeriesSlot        | 元数据分区   | 每个 Database 包含多个元数据分区,根据设备名进行分区                    |
+| SchemaRegion      | 一组元数据分区 | 多个 SeriesSlot 的集合                                  |
+| SchemaRegionGroup | 逻辑概念    | 包含元数据副本数个 SchemaRegion,管理相同的元数据,互为备份               |
+| SeriesTimeSlot    | 数据分区    | 一个元数据分区的一段时间的数据对应一个数据分区,每个元数据分区对应多个数据分区,根据时间范围进行分区 |
+| DataRegion        | 一组数据分区  | 多个 SeriesTimeSlot 的集合                              |
+| DataRegionGroup   | 逻辑概念    | 包含数据副本数个 DataRegion,管理相同的数据,互为备份                   |
 
 ## 集群特点
 
diff --git a/docs/zh/UserGuide/Cluster/Cluster-Maintenance.md b/docs/zh/UserGuide/Cluster/Cluster-Maintenance.md
index 62a6cce35c..9f38f681fc 100644
--- a/docs/zh/UserGuide/Cluster/Cluster-Maintenance.md
+++ b/docs/zh/UserGuide/Cluster/Cluster-Maintenance.md
@@ -21,6 +21,41 @@
 
 # 集群运维命令
 
+## 展示集群配置
+
+当前 IoTDB 支持使用如下 SQL 展示集群的关键参数:
+```
+SHOW CLUSTER PARAMETERS
+```
+
+示例:
+```
+IoTDB> show cluster parameters
++----------------------------------+-----------------------------------------------------------------+
+|                 ClusterParameters|                                                            Value|
++----------------------------------+-----------------------------------------------------------------+
+|                       ClusterName|                                                   defaultCluster|
+|             DataReplicationFactor|                                                                1|
+|           SchemaReplicationFactor|                                                                1|
+|  DataRegionConsensusProtocolClass|                      org.apache.iotdb.consensus.iot.IoTConsensus|
+|SchemaRegionConsensusProtocolClass|                  org.apache.iotdb.consensus.ratis.RatisConsensus|
+|  ConfigNodeConsensusProtocolClass|                  org.apache.iotdb.consensus.ratis.RatisConsensus|
+|             TimePartitionInterval|                                                        604800000|
+|                    DefaultTTL(ms)|                                              9223372036854775807|
+|              ReadConsistencyLevel|                                                           strong|
+|           SchemaRegionPerDataNode|                                                              1.0|
+|            DataRegionPerProcessor|                                                              1.0|
+|           LeastDataRegionGroupNum|                                                                5|
+|                     SeriesSlotNum|                                                            10000|
+|           SeriesSlotExecutorClass|org.apache.iotdb.commons.partition.executor.hash.BKDRHashExecutor|
+|         DiskSpaceWarningThreshold|                                                             0.05|
++----------------------------------+-----------------------------------------------------------------+
+Total line number = 15
+It costs 0.242s
+```
+
+**注意:** 必须保证该 SQL 展示的所有配置参数在同一集群各个节点完全一致
+
 ## 展示 ConfigNode 信息
 
 当前 IoTDB 支持使用如下 SQL 展示 ConfigNode 的信息:
diff --git a/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseConfig.java b/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseConfig.java
index cfe1e2d554..f5acbeebc0 100644
--- a/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseConfig.java
+++ b/integration-test/src/main/java/org/apache/iotdb/itbase/env/BaseConfig.java
@@ -202,7 +202,11 @@ public interface BaseConfig {
     return this;
   }
 
-  default String getConfigNodeConsesusProtocolClass() {
+  default String getClusterName() {
+    return "defaultCluster";
+  }
+
+  default String getConfigNodeConsensusProtocolClass() {
     return "org.apache.iotdb.consensus.simple.SimpleConsensus";
   }
 
@@ -271,6 +275,22 @@ public interface BaseConfig {
     return 1;
   }
 
+  default double getDataRegionPerProcessor() {
+    return 1.0;
+  }
+
+  default double getSchemaRegionPerDataNode() {
+    return 1.0;
+  }
+
+  default double getDiskSpaceWarningThreshold() {
+    return 0.05;
+  }
+
+  default String getReadConsistencyLevel() {
+    return "strong";
+  }
+
   default BaseConfig setDataReplicationFactor(int dataReplicationFactor) {
     return this;
   }
@@ -287,6 +307,14 @@ public interface BaseConfig {
     return 10000;
   }
 
+  default String getSeriesPartitionExecutorClass() {
+    return "org.apache.iotdb.commons.partition.executor.hash.BKDRHashExecutor";
+  }
+
+  default long getDefaultTTL() {
+    return Long.MAX_VALUE;
+  }
+
   default BaseConfig setTimePartitionInterval(long timePartitionInterval) {
     return this;
   }
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java
index ca6493423f..1348db3d0d 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java
@@ -91,7 +91,7 @@ public class IoTDBConfigNodeSnapshotIT {
   @Before
   public void setUp() throws Exception {
     originalConfigNodeConsensusProtocolClass =
-        ConfigFactory.getConfig().getConfigNodeConsesusProtocolClass();
+        ConfigFactory.getConfig().getConfigNodeConsensusProtocolClass();
     ConfigFactory.getConfig().setConfigNodeConsesusProtocolClass(ConsensusFactory.RATIS_CONSENSUS);
 
     originalRatisSnapshotTriggerThreshold =
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterNodeErrorStartUpIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterNodeErrorStartUpIT.java
index b1ccbd6a32..d331af6226 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterNodeErrorStartUpIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterNodeErrorStartUpIT.java
@@ -79,7 +79,7 @@ public class IoTDBClusterNodeErrorStartUpIT {
 
   @Before
   public void setUp() throws Exception {
-    originalConfigNodeConsensusProtocolClass = CONF.getConfigNodeConsesusProtocolClass();
+    originalConfigNodeConsensusProtocolClass = CONF.getConfigNodeConsensusProtocolClass();
     CONF.setConfigNodeConsesusProtocolClass(testConsensusProtocolClass);
 
     // Init 3C1D environment
@@ -109,6 +109,7 @@ public class IoTDBClusterNodeErrorStartUpIT {
         (SyncConfigNodeIServiceClient) EnvFactory.getEnv().getLeaderConfigNodeConnection()) {
       TConfigNodeRegisterReq req =
           ConfigNodeTestUtils.generateTConfigNodeRegisterReq(conflictConfigNodeWrapper);
+      req.getClusterParameters().setConfigNodeConsensusProtocolClass(testConsensusProtocolClass);
       TConfigNodeRegisterResp resp = client.registerConfigNode(req);
       Assert.assertEquals(
           TSStatusCode.REJECT_NODE_START.getStatusCode(), resp.getStatus().getCode());
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterNodeGetterIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterNodeGetterIT.java
index 79bbd29c38..1462f579cd 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterNodeGetterIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterNodeGetterIT.java
@@ -24,12 +24,13 @@ 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.client.sync.SyncConfigNodeIServiceClient;
+import org.apache.iotdb.confignode.rpc.thrift.TClusterParameters;
 import org.apache.iotdb.confignode.rpc.thrift.TConfigNodeInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeConfigurationResp;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeInfo;
-import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRegisterReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRemoveReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRemoveResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowClusterParametersResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
@@ -40,6 +41,7 @@ import org.apache.iotdb.it.env.DataNodeWrapper;
 import org.apache.iotdb.it.env.EnvFactory;
 import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.ClusterIT;
+import org.apache.iotdb.itbase.env.BaseConfig;
 import org.apache.iotdb.rpc.TSStatusCode;
 
 import org.junit.After;
@@ -62,6 +64,8 @@ import static org.junit.Assert.fail;
 @Category({ClusterIT.class})
 public class IoTDBClusterNodeGetterIT {
 
+  private static final BaseConfig CONF = ConfigFactory.getConfig();
+
   private static final int testConfigNodeNum = 2;
   private static final int testDataNodeNum = 2;
 
@@ -72,15 +76,12 @@ public class IoTDBClusterNodeGetterIT {
 
   @Before
   public void setUp() throws Exception {
-    originalConfigNodeConsensusProtocolClass =
-        ConfigFactory.getConfig().getConfigNodeConsesusProtocolClass();
-    ConfigFactory.getConfig().setConfigNodeConsesusProtocolClass(testConsensusProtocolClass);
-    originalSchemaRegionConsensusProtocolClass =
-        ConfigFactory.getConfig().getSchemaRegionConsensusProtocolClass();
-    ConfigFactory.getConfig().setSchemaRegionConsensusProtocolClass(testConsensusProtocolClass);
-    originalDataRegionConsensusProtocolClass =
-        ConfigFactory.getConfig().getDataRegionConsensusProtocolClass();
-    ConfigFactory.getConfig().setDataRegionConsensusProtocolClass(testConsensusProtocolClass);
+    originalConfigNodeConsensusProtocolClass = CONF.getConfigNodeConsensusProtocolClass();
+    CONF.setConfigNodeConsesusProtocolClass(testConsensusProtocolClass);
+    originalSchemaRegionConsensusProtocolClass = CONF.getSchemaRegionConsensusProtocolClass();
+    CONF.setSchemaRegionConsensusProtocolClass(testConsensusProtocolClass);
+    originalDataRegionConsensusProtocolClass = CONF.getDataRegionConsensusProtocolClass();
+    CONF.setDataRegionConsensusProtocolClass(testConsensusProtocolClass);
 
     // Init 2C2D environment
     EnvFactory.getEnv().initClusterEnvironment(testConfigNodeNum, testDataNodeNum);
@@ -89,12 +90,9 @@ public class IoTDBClusterNodeGetterIT {
   @After
   public void tearDown() {
     EnvFactory.getEnv().cleanAfterClass();
-    ConfigFactory.getConfig()
-        .setConfigNodeConsesusProtocolClass(originalConfigNodeConsensusProtocolClass);
-    ConfigFactory.getConfig()
-        .setSchemaRegionConsensusProtocolClass(originalSchemaRegionConsensusProtocolClass);
-    ConfigFactory.getConfig()
-        .setDataRegionConsensusProtocolClass(originalDataRegionConsensusProtocolClass);
+    CONF.setConfigNodeConsesusProtocolClass(originalConfigNodeConsensusProtocolClass);
+    CONF.setSchemaRegionConsensusProtocolClass(originalSchemaRegionConsensusProtocolClass);
+    CONF.setDataRegionConsensusProtocolClass(originalDataRegionConsensusProtocolClass);
   }
 
   @Test
@@ -144,6 +142,43 @@ public class IoTDBClusterNodeGetterIT {
         assertTrue(found);
       }
 
+      /* Tests showClusterParameters */
+      TShowClusterParametersResp showClusterParametersResp = client.showClusterParameters();
+      Assert.assertEquals(
+          TSStatusCode.SUCCESS_STATUS.getStatusCode(),
+          showClusterParametersResp.getStatus().getCode());
+      TClusterParameters clusterParameters = showClusterParametersResp.getClusterParameters();
+      Assert.assertEquals(
+          testConsensusProtocolClass, clusterParameters.getConfigNodeConsensusProtocolClass());
+      Assert.assertEquals(
+          testConsensusProtocolClass, clusterParameters.getDataRegionConsensusProtocolClass());
+      Assert.assertEquals(
+          testConsensusProtocolClass, clusterParameters.getSchemaRegionConsensusProtocolClass());
+      Assert.assertEquals(
+          CONF.getSeriesPartitionSlotNum(), clusterParameters.getSeriesPartitionSlotNum());
+      Assert.assertEquals(
+          CONF.getSeriesPartitionExecutorClass(),
+          clusterParameters.getSeriesPartitionExecutorClass());
+      Assert.assertEquals(CONF.getDefaultTTL(), clusterParameters.getDefaultTTL());
+      Assert.assertEquals(
+          CONF.getTimePartitionInterval(), clusterParameters.getTimePartitionInterval());
+      Assert.assertEquals(
+          CONF.getDataReplicationFactor(), clusterParameters.getDataReplicationFactor());
+      Assert.assertEquals(
+          CONF.getSchemaReplicationFactor(), clusterParameters.getSchemaReplicationFactor());
+      Assert.assertEquals(
+          CONF.getDataRegionPerProcessor(), clusterParameters.getDataRegionPerProcessor(), 0.01);
+      Assert.assertEquals(
+          CONF.getSchemaRegionPerDataNode(), clusterParameters.getSchemaRegionPerDataNode(), 0.01);
+      Assert.assertEquals(
+          CONF.getDiskSpaceWarningThreshold(),
+          clusterParameters.getDiskSpaceWarningThreshold(),
+          0.01);
+      Assert.assertEquals(
+          CONF.getReadConsistencyLevel(), clusterParameters.getReadConsistencyLevel());
+      Assert.assertEquals(
+          CONF.getLeastDataRegionGroupNum(), clusterParameters.getLeastDataRegionGroupNum());
+
       /* Test showConfigNodes */
       TShowConfigNodesResp showConfigNodesResp = client.showConfigNodes();
       // Check ConfigNodeInfo
@@ -220,12 +255,8 @@ public class IoTDBClusterNodeGetterIT {
     try (SyncConfigNodeIServiceClient client =
         (SyncConfigNodeIServiceClient) EnvFactory.getEnv().getLeaderConfigNodeConnection()) {
 
-      /* Test success re-register */
-      TDataNodeRegisterReq dataNodeRegisterReq = new TDataNodeRegisterReq();
-      TDataNodeConfiguration dataNodeConfiguration = new TDataNodeConfiguration();
-      TDataNodeLocation dataNodeLocation = new TDataNodeLocation();
-
       // Pick a registered DataNode
+      TDataNodeLocation dataNodeLocation = new TDataNodeLocation();
       TShowDataNodesResp showDataNodesResp = client.showDataNodes();
       TDataNodeInfo dataNodeInfo = showDataNodesResp.getDataNodesInfoList().get(0);
 
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterRestartIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterRestartIT.java
index 28f2df6bb6..0191ed3323 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterRestartIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/cluster/IoTDBClusterRestartIT.java
@@ -83,7 +83,7 @@ public class IoTDBClusterRestartIT {
   @Before
   public void setUp() throws Exception {
     originalConfigNodeConsensusProtocolClass =
-        ConfigFactory.getConfig().getConfigNodeConsesusProtocolClass();
+        ConfigFactory.getConfig().getConfigNodeConsensusProtocolClass();
     originalSchemaRegionConsensusProtocolClass =
         ConfigFactory.getConfig().getSchemaRegionConsensusProtocolClass();
     originalDataRegionConsensusProtocolClass =
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/load/IoTDBConfigNodeSwitchLeaderIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/load/IoTDBConfigNodeSwitchLeaderIT.java
index 81abd2087c..e1b990e9f8 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/load/IoTDBConfigNodeSwitchLeaderIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/load/IoTDBConfigNodeSwitchLeaderIT.java
@@ -71,7 +71,7 @@ public class IoTDBConfigNodeSwitchLeaderIT {
   @Before
   public void setUp() throws Exception {
     originalConfigNodeConsensusProtocolClass =
-        ConfigFactory.getConfig().getConfigNodeConsesusProtocolClass();
+        ConfigFactory.getConfig().getConfigNodeConsensusProtocolClass();
     originalSchemaRegionConsensusProtocolClass =
         ConfigFactory.getConfig().getSchemaRegionConsensusProtocolClass();
     originalDataRegionConsensusProtocolClass =
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionDurableIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionDurableIT.java
index 665155e8ae..a5da4cf85e 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionDurableIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionDurableIT.java
@@ -103,7 +103,7 @@ public class IoTDBPartitionDurableIT {
   @Before
   public void setUp() throws Exception {
     originalConfigNodeConsensusProtocolClass =
-        ConfigFactory.getConfig().getConfigNodeConsesusProtocolClass();
+        ConfigFactory.getConfig().getConfigNodeConsensusProtocolClass();
     originalSchemaRegionConsensusProtocolClass =
         ConfigFactory.getConfig().getSchemaRegionConsensusProtocolClass();
     originalDataRegionConsensusProtocolClass =
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionGetterIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionGetterIT.java
index f50fb390d4..da6e76e3e4 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionGetterIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBPartitionGetterIT.java
@@ -106,7 +106,7 @@ public class IoTDBPartitionGetterIT {
   @BeforeClass
   public static void setUp() throws Exception {
     originalConfigNodeConsensusProtocolClass =
-        ConfigFactory.getConfig().getConfigNodeConsesusProtocolClass();
+        ConfigFactory.getConfig().getConfigNodeConsensusProtocolClass();
     originalSchemaRegionConsensusProtocolClass =
         ConfigFactory.getConfig().getSchemaRegionConsensusProtocolClass();
     originalDataRegionConsensusProtocolClass =
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/utils/ConfigNodeTestUtils.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/utils/ConfigNodeTestUtils.java
index 6914fe5f1f..66376ae959 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/utils/ConfigNodeTestUtils.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/utils/ConfigNodeTestUtils.java
@@ -30,6 +30,7 @@ import org.apache.iotdb.commons.exception.IllegalPathException;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.PathPatternTree;
 import org.apache.iotdb.confignode.rpc.thrift.IConfigNodeRPCService;
+import org.apache.iotdb.confignode.rpc.thrift.TClusterParameters;
 import org.apache.iotdb.confignode.rpc.thrift.TConfigNodeRegisterReq;
 import org.apache.iotdb.confignode.rpc.thrift.TConfigNodeRestartReq;
 import org.apache.iotdb.confignode.rpc.thrift.TDataNodeRegisterReq;
@@ -205,24 +206,41 @@ public class ConfigNodeTestUtils {
         new TEndPoint(configNodeWrapper.getIp(), configNodeWrapper.getConsensusPort()));
   }
 
+  /**
+   * Generate a ConfigNode register request with the given ConfigNodeLocation and default
+   * configurations
+   *
+   * @param configNodeWrapper The given ConfigNode
+   * @return TConfigNodeRegisterReq for the given ConfigNode
+   */
   public static TConfigNodeRegisterReq generateTConfigNodeRegisterReq(
       ConfigNodeWrapper configNodeWrapper) {
     return new TConfigNodeRegisterReq()
         .setConfigNodeLocation(generateTConfigNodeLocation(-1, configNodeWrapper))
-        .setDataRegionConsensusProtocolClass(CONF.getDataRegionConsensusProtocolClass())
-        .setSchemaRegionConsensusProtocolClass(CONF.getSchemaRegionConsensusProtocolClass())
-        .setSeriesPartitionSlotNum(CONF.getSeriesPartitionSlotNum())
-        .setSeriesPartitionExecutorClass(
-            "org.apache.iotdb.commons.partition.executor.hash.BKDRHashExecutor")
-        .setDefaultTTL(Long.MAX_VALUE)
-        .setTimePartitionInterval(CONF.getTimePartitionInterval())
-        .setSchemaReplicationFactor(CONF.getSchemaReplicationFactor())
-        .setDataReplicationFactor(CONF.getDataReplicationFactor())
-        .setSchemaRegionPerDataNode(1.0)
-        .setDataRegionPerProcessor(1.0)
-        .setReadConsistencyLevel("strong")
-        .setDiskSpaceWarningThreshold(0.05)
-        .setLeastDataRegionGroupNum(CONF.getLeastDataRegionGroupNum());
+        .setClusterParameters(generateClusterParameters());
+  }
+
+  private static TClusterParameters generateClusterParameters() {
+    TClusterParameters clusterParameters = new TClusterParameters();
+    clusterParameters.setClusterName(CONF.getClusterName());
+    clusterParameters.setConfigNodeConsensusProtocolClass(
+        CONF.getConfigNodeConsensusProtocolClass());
+    clusterParameters.setDataRegionConsensusProtocolClass(
+        CONF.getDataRegionConsensusProtocolClass());
+    clusterParameters.setSchemaRegionConsensusProtocolClass(
+        CONF.getSchemaRegionConsensusProtocolClass());
+    clusterParameters.setSeriesPartitionSlotNum(CONF.getSeriesPartitionSlotNum());
+    clusterParameters.setSeriesPartitionExecutorClass(CONF.getSeriesPartitionExecutorClass());
+    clusterParameters.setDefaultTTL(CONF.getDefaultTTL());
+    clusterParameters.setTimePartitionInterval(CONF.getTimePartitionInterval());
+    clusterParameters.setDataReplicationFactor(CONF.getDataReplicationFactor());
+    clusterParameters.setSchemaReplicationFactor(CONF.getSchemaReplicationFactor());
+    clusterParameters.setDataRegionPerProcessor(CONF.getDataRegionPerProcessor());
+    clusterParameters.setSchemaRegionPerDataNode(CONF.getSchemaRegionPerDataNode());
+    clusterParameters.setDiskSpaceWarningThreshold(CONF.getDiskSpaceWarningThreshold());
+    clusterParameters.setReadConsistencyLevel(CONF.getReadConsistencyLevel());
+    clusterParameters.setLeastDataRegionGroupNum(CONF.getLeastDataRegionGroupNum());
+    return clusterParameters;
   }
 
   public static TConfigNodeRestartReq generateTConfigNodeRestartReq(
diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java b/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
index 2070527674..b380716089 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
@@ -268,8 +268,24 @@ public class IoTDBConstant {
   // show cluster status
   public static final String NODE_TYPE_CONFIG_NODE = "ConfigNode";
   public static final String NODE_TYPE_DATA_NODE = "DataNode";
-  public static final String NODE_STATUS_RUNNING = "Running";
-  public static final String NODE_STATUS_Down = "Down";
+  public static final String CLUSTER_NAME = "ClusterName";
+  public static final String CONFIG_NODE_CONSENSUS_PROTOCOL_CLASS =
+      "ConfigNodeConsensusProtocolClass";
+  public static final String DATA_REGION_CONSENSUS_PROTOCOL_CLASS =
+      "DataRegionConsensusProtocolClass";
+  public static final String SCHEMA_REGION_CONSENSUS_PROTOCOL_CLASS =
+      "SchemaRegionConsensusProtocolClass";
+  public static final String SERIES_SLOT_NUM = "SeriesSlotNum";
+  public static final String SERIES_SLOT_EXECUTOR_CLASS = "SeriesSlotExecutorClass";
+  public static final String DEFAULT_TTL = "DefaultTTL(ms)";
+  public static final String TIME_PARTITION_INTERVAL = "TimePartitionInterval";
+  public static final String DATA_REPLICATION_FACTOR = "DataReplicationFactor";
+  public static final String SCHEMA_REPLICATION_FACTOR = "SchemaReplicationFactor";
+  public static final String SCHEMA_REGION_PER_DATA_NODE = "SchemaRegionPerDataNode";
+  public static final String DATA_REGION_PER_PROCESSOR = "DataRegionPerProcessor";
+  public static final String READ_CONSISTENCY_LEVEL = "ReadConsistencyLevel";
+  public static final String DISK_SPACE_WARNING_THRESHOLD = "DiskSpaceWarningThreshold";
+  public static final String LEAST_DATA_REGION_GROUP_NUM = "LeastDataRegionGroupNum";
 
   public static final String IOTDB_FOREGROUND = "iotdb-foreground";
   public static final String IOTDB_PIDFILE = "iotdb-pidfile";
diff --git a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
index 2a4b3b942a..ac2e8b3d82 100644
--- a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
+++ b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
@@ -98,6 +98,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaTemplateReq;
 import org.apache.iotdb.confignode.rpc.thrift.TSetStorageGroupReq;
 import org.apache.iotdb.confignode.rpc.thrift.TSetTimePartitionIntervalReq;
 import org.apache.iotdb.confignode.rpc.thrift.TShowCQResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowClusterParametersResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
@@ -478,6 +479,27 @@ public class ConfigNodeClient
     throw new TException(MSG_RECONNECTION_FAIL);
   }
 
+  @Override
+  public TShowClusterParametersResp showClusterParameters() throws TException {
+    for (int i = 0; i < RETRY_NUM; i++) {
+      try {
+        TShowClusterParametersResp resp = client.showClusterParameters();
+        if (!updateConfigNodeLeader(resp.status)) {
+          return resp;
+        }
+      } catch (TException e) {
+        logger.warn(
+            "Failed to connect to ConfigNode {} from DataNode {} when executing {}",
+            configNode,
+            config.getAddressAndPort(),
+            Thread.currentThread().getStackTrace()[1].getMethodName());
+        configLeader = null;
+      }
+      waitAndReconnect();
+    }
+    throw new TException(MSG_RECONNECTION_FAIL);
+  }
+
   @Override
   public TSStatus setStorageGroup(TSetStorageGroupReq req) throws TException {
     for (int i = 0; i < RETRY_NUM; i++) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java
index 3c788b8eaf..151668e148 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/ColumnHeaderConstant.java
@@ -58,6 +58,7 @@ public class ColumnHeaderConstant {
   public static final String VERSION = "Version";
   public static final String BUILD_INFO = "BuildInfo";
   public static final String PATHS = "Paths";
+  public static final String CLUSTER_PARAMETERS = "ClusterParameters";
 
   // column names for count statement
   public static final String COLUMN = "Column";
@@ -264,6 +265,11 @@ public class ColumnHeaderConstant {
           new ColumnHeader(SCHEMA_CONSENSUS_PORT, TSDataType.TEXT),
           new ColumnHeader(MPP_PORT, TSDataType.TEXT));
 
+  public static final List<ColumnHeader> showClusterParametersColumnHeaders =
+      ImmutableList.of(
+          new ColumnHeader(CLUSTER_PARAMETERS, TSDataType.TEXT),
+          new ColumnHeader(VALUE, TSDataType.TEXT));
+
   public static final List<ColumnHeader> showFunctionsColumnHeaders =
       ImmutableList.of(
           new ColumnHeader(FUNCTION_NAME, TSDataType.TEXT),
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java
index 00d4f7a4e5..76a0038e85 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/DatasetHeaderFactory.java
@@ -81,6 +81,10 @@ public class DatasetHeaderFactory {
     return new DatasetHeader(ColumnHeaderConstant.showClusterColumnHeaders, true);
   }
 
+  public static DatasetHeader getShowClusterParametersHeader() {
+    return new DatasetHeader(ColumnHeaderConstant.showClusterParametersColumnHeaders, true);
+  }
+
   public static DatasetHeader getShowClusterDetailsHeader() {
     return new DatasetHeader(ColumnHeaderConstant.showClusterDetailsColumnHeaders, true);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
index 5fe55dadcc..6f678e8ba0 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
@@ -34,6 +34,7 @@ import org.apache.iotdb.db.mpp.plan.execution.config.metadata.GetTimeSlotListTas
 import org.apache.iotdb.db.mpp.plan.execution.config.metadata.SetStorageGroupTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.metadata.SetTTLTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowClusterDetailsTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowClusterParametersTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowClusterTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowConfigNodesTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowContinuousQueriesTask;
@@ -172,9 +173,13 @@ public class ConfigTaskVisitor
   @Override
   public IConfigTask visitShowCluster(
       ShowClusterStatement showClusterStatement, TaskContext context) {
-    return showClusterStatement.isDetails()
-        ? new ShowClusterDetailsTask(showClusterStatement)
-        : new ShowClusterTask(showClusterStatement);
+    if (showClusterStatement.isDetails()) {
+      return new ShowClusterDetailsTask(showClusterStatement);
+    } else if (showClusterStatement.isParameters()) {
+      return new ShowClusterParametersTask();
+    } else {
+      return new ShowClusterTask(showClusterStatement);
+    }
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index a20a5cf3b6..5518645d35 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -60,6 +60,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TGetUDFTableResp;
 import org.apache.iotdb.confignode.rpc.thrift.TPipeSinkInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TSetStorageGroupReq;
 import org.apache.iotdb.confignode.rpc.thrift.TShowCQResp;
+import org.apache.iotdb.confignode.rpc.thrift.TShowClusterParametersResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp;
 import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
@@ -86,6 +87,7 @@ import org.apache.iotdb.db.mpp.plan.execution.config.metadata.GetSeriesSlotListT
 import org.apache.iotdb.db.mpp.plan.execution.config.metadata.GetTimeSlotListTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.metadata.SetStorageGroupTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowClusterDetailsTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowClusterParametersTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowClusterTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowConfigNodesTask;
 import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowContinuousQueriesTask;
@@ -788,6 +790,23 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor {
     return future;
   }
 
+  @Override
+  public SettableFuture<ConfigTaskResult> showClusterParameters() {
+    SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+    TShowClusterParametersResp showClusterParametersResp = new TShowClusterParametersResp();
+    try (ConfigNodeClient client =
+        CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.configNodeRegionId)) {
+      showClusterParametersResp = client.showClusterParameters();
+    } catch (ClientManagerException | TException e) {
+      future.setException(e);
+    }
+
+    // build TSBlock
+    ShowClusterParametersTask.buildTSBlock(showClusterParametersResp, future);
+
+    return future;
+  }
+
   @Override
   public SettableFuture<ConfigTaskResult> showTTL(ShowTTLStatement showTTLStatement) {
     SettableFuture<ConfigTaskResult> future = SettableFuture.create();
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
index 1e5ba37b17..292164396a 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
@@ -97,6 +97,8 @@ public interface IConfigTaskExecutor {
 
   SettableFuture<ConfigTaskResult> showCluster(ShowClusterStatement showClusterStatement);
 
+  SettableFuture<ConfigTaskResult> showClusterParameters();
+
   SettableFuture<ConfigTaskResult> showTTL(ShowTTLStatement showTTLStatement);
 
   SettableFuture<ConfigTaskResult> showRegion(ShowRegionStatement showRegionStatement);
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
index 15be2fa2cd..66df0af9d6 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
@@ -378,6 +378,16 @@ public class StandaloneConfigTaskExecutor implements IConfigTaskExecutor {
     return future;
   }
 
+  @Override
+  public SettableFuture<ConfigTaskResult> showClusterParameters() {
+    SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+    future.setException(
+        new IoTDBException(
+            "Executing show cluster parameters in standalone mode is not supported",
+            TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode()));
+    return future;
+  }
+
   @Override
   public SettableFuture<ConfigTaskResult> showTTL(ShowTTLStatement showTTLStatement) {
     SettableFuture<ConfigTaskResult> future = SettableFuture.create();
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowClusterParametersTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowClusterParametersTask.java
new file mode 100644
index 0000000000..fab89048a1
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/ShowClusterParametersTask.java
@@ -0,0 +1,136 @@
+/*
+ * 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.db.mpp.plan.execution.config.metadata;
+
+import org.apache.iotdb.commons.conf.IoTDBConstant;
+import org.apache.iotdb.confignode.rpc.thrift.TClusterParameters;
+import org.apache.iotdb.confignode.rpc.thrift.TShowClusterParametersResp;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeader;
+import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeaderFactory;
+import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult;
+import org.apache.iotdb.db.mpp.plan.execution.config.IConfigTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.executor.IConfigTaskExecutor;
+import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.iotdb.tsfile.utils.Binary;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class ShowClusterParametersTask implements IConfigTask {
+
+  public ShowClusterParametersTask() {
+    // Empty constructor
+  }
+
+  private static void buildTSBlock(TsBlockBuilder builder, Binary parameter, Binary value) {
+    builder.getTimeColumnBuilder().writeLong(0L);
+    builder.getColumnBuilder(0).writeBinary(parameter);
+    builder.getColumnBuilder(1).writeBinary(value);
+    builder.declarePosition();
+  }
+
+  public static void buildTSBlock(
+      TShowClusterParametersResp showClusterParametersResp,
+      SettableFuture<ConfigTaskResult> future) {
+    List<TSDataType> outputDataTypes =
+        ColumnHeaderConstant.showClusterParametersColumnHeaders.stream()
+            .map(ColumnHeader::getColumnType)
+            .collect(Collectors.toList());
+    TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
+
+    TClusterParameters clusterParameters = showClusterParametersResp.getClusterParameters();
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.CLUSTER_NAME),
+        new Binary(clusterParameters.getClusterName()));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.DATA_REPLICATION_FACTOR),
+        new Binary(String.valueOf(clusterParameters.getDataReplicationFactor())));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.SCHEMA_REPLICATION_FACTOR),
+        new Binary(String.valueOf(clusterParameters.getSchemaReplicationFactor())));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.DATA_REGION_CONSENSUS_PROTOCOL_CLASS),
+        new Binary(clusterParameters.getDataRegionConsensusProtocolClass()));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.SCHEMA_REGION_CONSENSUS_PROTOCOL_CLASS),
+        new Binary(clusterParameters.getSchemaRegionConsensusProtocolClass()));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.CONFIG_NODE_CONSENSUS_PROTOCOL_CLASS),
+        new Binary(clusterParameters.getConfigNodeConsensusProtocolClass()));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.TIME_PARTITION_INTERVAL),
+        new Binary(String.valueOf(clusterParameters.getTimePartitionInterval())));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.DEFAULT_TTL),
+        new Binary(String.valueOf(clusterParameters.getDefaultTTL())));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.READ_CONSISTENCY_LEVEL),
+        new Binary(String.valueOf(clusterParameters.getReadConsistencyLevel())));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.SCHEMA_REGION_PER_DATA_NODE),
+        new Binary(String.valueOf(clusterParameters.getSchemaRegionPerDataNode())));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.DATA_REGION_PER_PROCESSOR),
+        new Binary(String.valueOf(clusterParameters.getDataRegionPerProcessor())));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.LEAST_DATA_REGION_GROUP_NUM),
+        new Binary(String.valueOf(clusterParameters.getLeastDataRegionGroupNum())));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.SERIES_SLOT_NUM),
+        new Binary(String.valueOf(clusterParameters.getSeriesPartitionSlotNum())));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.SERIES_SLOT_EXECUTOR_CLASS),
+        new Binary(clusterParameters.getSeriesPartitionExecutorClass()));
+    buildTSBlock(
+        builder,
+        new Binary(IoTDBConstant.DISK_SPACE_WARNING_THRESHOLD),
+        new Binary(String.valueOf(clusterParameters.getDiskSpaceWarningThreshold())));
+
+    DatasetHeader datasetHeader = DatasetHeaderFactory.getShowClusterParametersHeader();
+    future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader));
+  }
+
+  @Override
+  public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor configTaskExecutor)
+      throws InterruptedException {
+    return configTaskExecutor.showClusterParameters();
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
index c4c3cf2fa2..d06d7c3c9d 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
@@ -2001,13 +2001,12 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
 
   @Override
   public Statement visitShowCluster(IoTDBSqlParser.ShowClusterContext ctx) {
-    return new ShowClusterStatement();
-  }
-
-  @Override
-  public Statement visitShowClusterDetails(IoTDBSqlParser.ShowClusterDetailsContext ctx) {
     ShowClusterStatement showClusterStatement = new ShowClusterStatement();
-    showClusterStatement.setDetails(true);
+    if (ctx.DETAILS() != null) {
+      showClusterStatement.setDetails(true);
+    } else if (ctx.PARAMETERS() != null) {
+      showClusterStatement.setParameters(true);
+    }
     return showClusterStatement;
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/ShowClusterStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/ShowClusterStatement.java
index be001b932f..db716b0f0c 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/ShowClusterStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/ShowClusterStatement.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
 public class ShowClusterStatement extends ShowStatement implements IConfigStatement {
 
   private boolean isDetails = false;
+  private boolean isParameters = false;
 
   @Override
   public QueryType getQueryType() {
@@ -43,4 +44,12 @@ public class ShowClusterStatement extends ShowStatement implements IConfigStatem
   public void setDetails(boolean details) {
     isDetails = details;
   }
+
+  public boolean isParameters() {
+    return isParameters;
+  }
+
+  public void setParameters(boolean parameters) {
+    isParameters = parameters;
+  }
 }
diff --git a/thrift-confignode/src/main/thrift/confignode.thrift b/thrift-confignode/src/main/thrift/confignode.thrift
index c2d4cc09c3..ae6766b947 100644
--- a/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/thrift-confignode/src/main/thrift/confignode.thrift
@@ -317,23 +317,31 @@ struct TCheckUserPrivilegesReq {
 }
 
 // ConfigNode
+
+/* These parameters should be consist within the cluster */
+struct TClusterParameters {
+  1: required string clusterName
+  2: required i32 dataReplicationFactor
+  3: required i32 schemaReplicationFactor
+  4: required string dataRegionConsensusProtocolClass
+  5: required string schemaRegionConsensusProtocolClass
+  6: required string configNodeConsensusProtocolClass
+  7: required i64 timePartitionInterval
+  8: required i64 defaultTTL
+  9: required string readConsistencyLevel
+  10: required double schemaRegionPerDataNode
+  11: required double dataRegionPerProcessor
+  12: required i32 leastDataRegionGroupNum
+  13: required i32 seriesPartitionSlotNum
+  14: required string seriesPartitionExecutorClass
+  15: required double diskSpaceWarningThreshold
+}
+
 struct TConfigNodeRegisterReq {
   1: required common.TConfigNodeLocation configNodeLocation
   // The Non-Seed-ConfigNode must ensure that the following
   // fields are consistent with the Seed-ConfigNode
-  2: required string dataRegionConsensusProtocolClass
-  3: required string schemaRegionConsensusProtocolClass
-  4: required i32 seriesPartitionSlotNum
-  5: required string seriesPartitionExecutorClass
-  6: required i64 defaultTTL
-  7: required i64 timePartitionInterval
-  8: required i32 schemaReplicationFactor
-  9: required double schemaRegionPerDataNode
-  10: required i32 dataReplicationFactor
-  11: required double dataRegionPerProcessor
-  12: required string readConsistencyLevel
-  13: required double diskSpaceWarningThreshold
-  14: required i32 leastDataRegionGroupNum
+  2: required TClusterParameters clusterParameters
 }
 
 struct TConfigNodeRegisterResp {
@@ -430,6 +438,11 @@ struct TShowClusterResp {
   4: required map<i32, string> nodeStatus
 }
 
+struct TShowClusterParametersResp {
+  1: required common.TSStatus status
+  2: optional TClusterParameters clusterParameters
+}
+
 // Show datanodes
 struct TDataNodeInfo {
   1: required i32 dataNodeId
@@ -987,6 +1000,9 @@ service IConfigNodeRPCService {
   /** Show cluster ConfigNodes' and DataNodes' information */
   TShowClusterResp showCluster()
 
+  /** Show cluster parameters who should be consist in the same cluster */
+  TShowClusterParametersResp showClusterParameters()
+
   /** Show cluster DataNodes' information */
   TShowDataNodesResp showDataNodes()