You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2020/10/29 05:32:04 UTC

[shardingsphere] branch master updated: Consensus replication configuration update (#7952)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new b2202c4  Consensus replication configuration update (#7952)
b2202c4 is described below

commit b2202c437a880d401a112890d5aeb64fde565578
Author: sandynz <42...@users.noreply.github.com>
AuthorDate: Thu Oct 29 13:31:42 2020 +0800

    Consensus replication configuration update (#7952)
---
 ...susReplicationActualTableRuleConfiguration.java | 14 ++++----
 ...ConsensusReplicationNodeRuleConfiguration.java} | 20 ++++-------
 ...Rule.java => ConsensusReplicationNodeRule.java} | 18 ++++------
 .../rule/ConsensusReplicationTableRule.java        | 10 +++---
 ...susReplicationActualTableRuleConfiguration.java |  6 ++--
 ...ConsensusReplicationNodeRuleConfiguration.java} | 10 ++----
 ...ionActualTableRuleConfigurationYamlSwapper.java | 17 ++++++---
 ...plicationNodeRuleConfigurationYamlSwapper.java} | 23 ++++++------
 .../rule/ConsensusReplicationRuleTest.java         | 17 ++++++---
 ...ctualTableRuleConfigurationYamlSwapperTest.java | 34 ++++++++++++------
 ...ationNodeRuleConfigurationYamlSwapperTest.java} | 41 +++++++++-------------
 ...eplicationRuleConfigurationYamlSwapperTest.java | 29 ++++++++++-----
 .../route/engine/ConsensusReplicationGroup.java    |  6 ++--
 ...oup.java => ConsensusReplicationGroupNode.java} | 21 +++++------
 .../engine/ConsensusReplicationSQLRouter.java      | 15 +++++---
 15 files changed, 149 insertions(+), 132 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-api/src/main/java/org/apache/shardingsphere/replication/consensus/api/config/ConsensusReplicationActualTableRuleConfiguration.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-api/src/main/java/org/apache/shardingsphere/replication/consensus/api/config/ConsensusReplicationActualTableRuleConfiguration.java
index de4d474..0db0452 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-api/src/main/java/org/apache/shardingsphere/replication/consensus/api/config/ConsensusReplicationActualTableRuleConfiguration.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-api/src/main/java/org/apache/shardingsphere/replication/consensus/api/config/ConsensusReplicationActualTableRuleConfiguration.java
@@ -22,6 +22,8 @@ import com.google.common.base.Strings;
 import lombok.Getter;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 
+import java.util.Collection;
+
 /**
  * Consensus replication actual table rule configuration.
  */
@@ -32,18 +34,14 @@ public final class ConsensusReplicationActualTableRuleConfiguration implements R
     
     private final String replicaGroupId;
     
-    private final String replicaPeers;
-    
-    private final String dataSourceName;
+    private final Collection<ConsensusReplicationNodeRuleConfiguration> replicaNodes;
     
-    public ConsensusReplicationActualTableRuleConfiguration(final String physicsTable, final String replicaGroupId, final String replicaPeers, final String dataSourceName) {
+    public ConsensusReplicationActualTableRuleConfiguration(final String physicsTable, final String replicaGroupId, final Collection<ConsensusReplicationNodeRuleConfiguration> replicaNodes) {
         Preconditions.checkArgument(!Strings.isNullOrEmpty(physicsTable), "physicsTable is required.");
         Preconditions.checkArgument(!Strings.isNullOrEmpty(replicaGroupId), "replicaGroupId is required.");
-        Preconditions.checkArgument(!Strings.isNullOrEmpty(replicaPeers), "replicaPeers is required.");
-        Preconditions.checkArgument(!Strings.isNullOrEmpty(dataSourceName), "dataSourceName is required.");
+        Preconditions.checkArgument(null != replicaNodes, "replicaNodes is required.");
         this.physicsTable = physicsTable;
         this.replicaGroupId = replicaGroupId;
-        this.replicaPeers = replicaPeers;
-        this.dataSourceName = dataSourceName;
+        this.replicaNodes = replicaNodes;
     }
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-api/src/main/java/org/apache/shardingsphere/replication/consensus/api/config/ConsensusReplicationActualTableRuleConfiguration.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-api/src/main/java/org/apache/shardingsphere/replication/consensus/api/config/ConsensusReplicationNodeRuleConfiguration.java
similarity index 61%
copy from shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-api/src/main/java/org/apache/shardingsphere/replication/consensus/api/config/ConsensusReplicationActualTableRuleConfiguration.java
copy to shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-api/src/main/java/org/apache/shardingsphere/replication/consensus/api/config/ConsensusReplicationNodeRuleConfiguration.java
index de4d474..363dd70 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-api/src/main/java/org/apache/shardingsphere/replication/consensus/api/config/ConsensusReplicationActualTableRuleConfiguration.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-api/src/main/java/org/apache/shardingsphere/replication/consensus/api/config/ConsensusReplicationNodeRuleConfiguration.java
@@ -23,27 +23,19 @@ import lombok.Getter;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 
 /**
- * Consensus replication actual table rule configuration.
+ * Consensus replication node rule configuration.
  */
 @Getter
-public final class ConsensusReplicationActualTableRuleConfiguration implements RuleConfiguration {
+public final class ConsensusReplicationNodeRuleConfiguration implements RuleConfiguration {
     
-    private final String physicsTable;
-    
-    private final String replicaGroupId;
-    
-    private final String replicaPeers;
+    private final String replicaPeer;
     
     private final String dataSourceName;
     
-    public ConsensusReplicationActualTableRuleConfiguration(final String physicsTable, final String replicaGroupId, final String replicaPeers, final String dataSourceName) {
-        Preconditions.checkArgument(!Strings.isNullOrEmpty(physicsTable), "physicsTable is required.");
-        Preconditions.checkArgument(!Strings.isNullOrEmpty(replicaGroupId), "replicaGroupId is required.");
-        Preconditions.checkArgument(!Strings.isNullOrEmpty(replicaPeers), "replicaPeers is required.");
+    public ConsensusReplicationNodeRuleConfiguration(final String replicaPeer, final String dataSourceName) {
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(replicaPeer), "replicaPeer is required.");
         Preconditions.checkArgument(!Strings.isNullOrEmpty(dataSourceName), "dataSourceName is required.");
-        this.physicsTable = physicsTable;
-        this.replicaGroupId = replicaGroupId;
-        this.replicaPeers = replicaPeers;
+        this.replicaPeer = replicaPeer;
         this.dataSourceName = dataSourceName;
     }
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationTableRule.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationNodeRule.java
similarity index 67%
copy from shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationTableRule.java
copy to shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationNodeRule.java
index 17e9567..9172f43 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationTableRule.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationNodeRule.java
@@ -19,26 +19,20 @@ package org.apache.shardingsphere.replication.consensus.rule;
 
 import lombok.Getter;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationActualTableRuleConfiguration;
+import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationNodeRuleConfiguration;
 
 /**
- * Consensus replication table rule.
+ * Consensus replication node rule.
  */
 @Getter
-public final class ConsensusReplicationTableRule implements ShardingSphereRule {
+public final class ConsensusReplicationNodeRule implements ShardingSphereRule {
     
-    private final String physicsTable;
-    
-    private final String replicaGroupId;
-    
-    private final String replicaPeers;
+    private final String replicaPeer;
     
     private final String dataSourceName;
     
-    public ConsensusReplicationTableRule(final ConsensusReplicationActualTableRuleConfiguration config) {
-        physicsTable = config.getPhysicsTable();
-        replicaGroupId = config.getReplicaGroupId();
-        replicaPeers = config.getReplicaPeers();
+    public ConsensusReplicationNodeRule(final ConsensusReplicationNodeRuleConfiguration config) {
+        replicaPeer = config.getReplicaPeer();
         dataSourceName = config.getDataSourceName();
     }
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationTableRule.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationTableRule.java
index 17e9567..4c2ec18 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationTableRule.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationTableRule.java
@@ -21,6 +21,9 @@ import lombok.Getter;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationActualTableRuleConfiguration;
 
+import java.util.Collection;
+import java.util.stream.Collectors;
+
 /**
  * Consensus replication table rule.
  */
@@ -31,14 +34,11 @@ public final class ConsensusReplicationTableRule implements ShardingSphereRule {
     
     private final String replicaGroupId;
     
-    private final String replicaPeers;
-    
-    private final String dataSourceName;
+    private final Collection<ConsensusReplicationNodeRule> replicaNodeRules;
     
     public ConsensusReplicationTableRule(final ConsensusReplicationActualTableRuleConfiguration config) {
         physicsTable = config.getPhysicsTable();
         replicaGroupId = config.getReplicaGroupId();
-        replicaPeers = config.getReplicaPeers();
-        dataSourceName = config.getDataSourceName();
+        replicaNodeRules = config.getReplicaNodes().stream().map(ConsensusReplicationNodeRule::new).collect(Collectors.toList());
     }
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/config/YamlConsensusReplicationActualTableRuleConfiguration.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/config/YamlConsensusReplicationActualTableRuleConfiguration.java
index dee82cd..360e9d8 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/config/YamlConsensusReplicationActualTableRuleConfiguration.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/config/YamlConsensusReplicationActualTableRuleConfiguration.java
@@ -21,6 +21,8 @@ import lombok.Getter;
 import lombok.Setter;
 import org.apache.shardingsphere.infra.yaml.config.YamlConfiguration;
 
+import java.util.Collection;
+
 /**
  * Consensus replication actual table rule configuration for YAML.
  */
@@ -32,7 +34,5 @@ public final class YamlConsensusReplicationActualTableRuleConfiguration implemen
     
     private String replicaGroupId;
     
-    private String replicaPeers;
-    
-    private String dataSourceName;
+    private Collection<YamlConsensusReplicationNodeRuleConfiguration> replicaNodes;
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/config/YamlConsensusReplicationActualTableRuleConfiguration.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/config/YamlConsensusReplicationNodeRuleConfiguration.java
similarity index 79%
copy from shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/config/YamlConsensusReplicationActualTableRuleConfiguration.java
copy to shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/config/YamlConsensusReplicationNodeRuleConfiguration.java
index dee82cd..ddd003b 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/config/YamlConsensusReplicationActualTableRuleConfiguration.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/config/YamlConsensusReplicationNodeRuleConfiguration.java
@@ -22,17 +22,13 @@ import lombok.Setter;
 import org.apache.shardingsphere.infra.yaml.config.YamlConfiguration;
 
 /**
- * Consensus replication actual table rule configuration for YAML.
+ * Consensus replication node rule configuration for YAML.
  */
 @Getter
 @Setter
-public final class YamlConsensusReplicationActualTableRuleConfiguration implements YamlConfiguration {
+public final class YamlConsensusReplicationNodeRuleConfiguration implements YamlConfiguration {
     
-    private String physicsTable;
-    
-    private String replicaGroupId;
-    
-    private String replicaPeers;
+    private String replicaPeer;
     
     private String dataSourceName;
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlSwapper.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlS [...]
index c7ecfbd..19aa88a 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlSwapper.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlSwapper.java
@@ -19,7 +19,12 @@ package org.apache.shardingsphere.replication.consensus.yaml.swapper;
 
 import org.apache.shardingsphere.infra.yaml.swapper.YamlSwapper;
 import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationActualTableRuleConfiguration;
+import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationNodeRuleConfiguration;
 import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensusReplicationActualTableRuleConfiguration;
+import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensusReplicationNodeRuleConfiguration;
+
+import java.util.Collection;
+import java.util.stream.Collectors;
 
 /**
  * Consensus replication actual table rule configuration YAML swapper.
@@ -27,19 +32,23 @@ import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensus
 public final class ConsensusReplicationActualTableRuleConfigurationYamlSwapper
         implements YamlSwapper<YamlConsensusReplicationActualTableRuleConfiguration, ConsensusReplicationActualTableRuleConfiguration> {
     
+    private final ConsensusReplicationNodeRuleConfigurationYamlSwapper nodeRuleConfigurationYamlSwapper = new ConsensusReplicationNodeRuleConfigurationYamlSwapper();
+    
     @Override
     public YamlConsensusReplicationActualTableRuleConfiguration swapToYamlConfiguration(final ConsensusReplicationActualTableRuleConfiguration data) {
+        Collection<YamlConsensusReplicationNodeRuleConfiguration> replicaNodes = data.getReplicaNodes().stream()
+                .map(nodeRuleConfigurationYamlSwapper::swapToYamlConfiguration).collect(Collectors.toList());
         YamlConsensusReplicationActualTableRuleConfiguration result = new YamlConsensusReplicationActualTableRuleConfiguration();
         result.setPhysicsTable(data.getPhysicsTable());
         result.setReplicaGroupId(data.getReplicaGroupId());
-        result.setReplicaPeers(data.getReplicaPeers());
-        result.setDataSourceName(data.getDataSourceName());
+        result.setReplicaNodes(replicaNodes);
         return result;
     }
     
     @Override
     public ConsensusReplicationActualTableRuleConfiguration swapToObject(final YamlConsensusReplicationActualTableRuleConfiguration yamlConfig) {
-        return new ConsensusReplicationActualTableRuleConfiguration(yamlConfig.getPhysicsTable(), yamlConfig.getReplicaGroupId(),
-                yamlConfig.getReplicaPeers(), yamlConfig.getDataSourceName());
+        Collection<ConsensusReplicationNodeRuleConfiguration> replicaNodes = yamlConfig.getReplicaNodes().stream()
+                .map(nodeRuleConfigurationYamlSwapper::swapToObject).collect(Collectors.toList());
+        return new ConsensusReplicationActualTableRuleConfiguration(yamlConfig.getPhysicsTable(), yamlConfig.getReplicaGroupId(), replicaNodes);
     }
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlSwapper.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationNodeRuleConfigurationYamlSwapper.java
similarity index 50%
copy from shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlSwapper.java
copy to shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationNodeRuleConfigurationYamlSwapper.java
index c7ecfbd..8c96be4 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlSwapper.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/main/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationNodeRuleConfigurationYamlSwapper.java
@@ -18,28 +18,25 @@
 package org.apache.shardingsphere.replication.consensus.yaml.swapper;
 
 import org.apache.shardingsphere.infra.yaml.swapper.YamlSwapper;
-import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationActualTableRuleConfiguration;
-import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensusReplicationActualTableRuleConfiguration;
+import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationNodeRuleConfiguration;
+import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensusReplicationNodeRuleConfiguration;
 
 /**
- * Consensus replication actual table rule configuration YAML swapper.
+ * Consensus replication node rule configuration YAML swapper.
  */
-public final class ConsensusReplicationActualTableRuleConfigurationYamlSwapper
-        implements YamlSwapper<YamlConsensusReplicationActualTableRuleConfiguration, ConsensusReplicationActualTableRuleConfiguration> {
+public final class ConsensusReplicationNodeRuleConfigurationYamlSwapper
+        implements YamlSwapper<YamlConsensusReplicationNodeRuleConfiguration, ConsensusReplicationNodeRuleConfiguration> {
     
     @Override
-    public YamlConsensusReplicationActualTableRuleConfiguration swapToYamlConfiguration(final ConsensusReplicationActualTableRuleConfiguration data) {
-        YamlConsensusReplicationActualTableRuleConfiguration result = new YamlConsensusReplicationActualTableRuleConfiguration();
-        result.setPhysicsTable(data.getPhysicsTable());
-        result.setReplicaGroupId(data.getReplicaGroupId());
-        result.setReplicaPeers(data.getReplicaPeers());
+    public YamlConsensusReplicationNodeRuleConfiguration swapToYamlConfiguration(final ConsensusReplicationNodeRuleConfiguration data) {
+        YamlConsensusReplicationNodeRuleConfiguration result = new YamlConsensusReplicationNodeRuleConfiguration();
+        result.setReplicaPeer(data.getReplicaPeer());
         result.setDataSourceName(data.getDataSourceName());
         return result;
     }
     
     @Override
-    public ConsensusReplicationActualTableRuleConfiguration swapToObject(final YamlConsensusReplicationActualTableRuleConfiguration yamlConfig) {
-        return new ConsensusReplicationActualTableRuleConfiguration(yamlConfig.getPhysicsTable(), yamlConfig.getReplicaGroupId(),
-                yamlConfig.getReplicaPeers(), yamlConfig.getDataSourceName());
+    public ConsensusReplicationNodeRuleConfiguration swapToObject(final YamlConsensusReplicationNodeRuleConfiguration yamlConfig) {
+        return new ConsensusReplicationNodeRuleConfiguration(yamlConfig.getReplicaPeer(), yamlConfig.getDataSourceName());
     }
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationRuleTest.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationRuleTest.java
index 6d5e45f..b831323 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationRuleTest.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/rule/ConsensusReplicationRuleTest.java
@@ -19,11 +19,13 @@ package org.apache.shardingsphere.replication.consensus.rule;
 
 import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationActualTableRuleConfiguration;
 import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationLogicTableRuleConfiguration;
+import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationNodeRuleConfiguration;
 import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationRuleConfiguration;
 import org.junit.Test;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -42,7 +44,7 @@ public final class ConsensusReplicationRuleTest {
     
     private final String replicaGroupId = "raftGroupTest1";
     
-    private final String replicaPeers = "127.0.0.1:9090";
+    private final String replicaPeer = "127.0.0.1:9090";
     
     @Test
     public void assertCannotFindRouting() {
@@ -58,14 +60,21 @@ public final class ConsensusReplicationRuleTest {
         assertTrue(routingRuleOptional.isPresent());
         ConsensusReplicationTableRule routingRule = routingRuleOptional.get();
         assertNotNull(routingRule);
-        assertThat(routingRule.getDataSourceName(), is(dataSourceName));
         assertThat(routingRule.getPhysicsTable(), is(physicsTable));
         assertThat(routingRule.getReplicaGroupId(), is(replicaGroupId));
-        assertThat(routingRule.getReplicaPeers(), is(replicaPeers));
+        Collection<ConsensusReplicationNodeRule> replicaNodeRules = routingRule.getReplicaNodeRules();
+        assertNotNull(replicaNodeRules);
+        assertThat(replicaNodeRules.size(), is(1));
+        ConsensusReplicationNodeRule replicaNodeRule = replicaNodeRules.iterator().next();
+        assertThat(replicaNodeRule.getReplicaPeer(), is(replicaPeer));
+        assertThat(replicaNodeRule.getDataSourceName(), is(dataSourceName));
     }
     
     private ConsensusReplicationRule createConsensusReplicationRule() {
-        ConsensusReplicationActualTableRuleConfiguration replicaGroup = new ConsensusReplicationActualTableRuleConfiguration(physicsTable, replicaGroupId, replicaPeers, dataSourceName);
+        List<ConsensusReplicationNodeRuleConfiguration> replicaNodes = Collections.singletonList(
+            new ConsensusReplicationNodeRuleConfiguration(replicaPeer, dataSourceName)
+        );
+        ConsensusReplicationActualTableRuleConfiguration replicaGroup = new ConsensusReplicationActualTableRuleConfiguration(physicsTable, replicaGroupId, replicaNodes);
         Collection<ConsensusReplicationActualTableRuleConfiguration> replicaGroups = Collections.singleton(replicaGroup);
         ConsensusReplicationLogicTableRuleConfiguration table = new ConsensusReplicationLogicTableRuleConfiguration(logicTableName, replicaGroups);
         ConsensusReplicationRuleConfiguration config = new ConsensusReplicationRuleConfiguration(Collections.singleton(table));
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlSwapperTest.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationY [...]
index f148704..45b8f46 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlSwapperTest.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlSwapperTest.java
@@ -18,10 +18,15 @@
 package org.apache.shardingsphere.replication.consensus.yaml.swapper;
 
 import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationActualTableRuleConfiguration;
+import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationNodeRuleConfiguration;
 import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensusReplicationActualTableRuleConfiguration;
+import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensusReplicationNodeRuleConfiguration;
 import org.junit.Test;
 
+import java.util.Collections;
+
 import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 
 public class ConsensusReplicationActualTableRuleConfigurationYamlSwapperTest {
@@ -34,26 +39,30 @@ public class ConsensusReplicationActualTableRuleConfigurationYamlSwapperTest {
     
     private final String replicaGroupId = "raftGroupTest1";
     
-    private final String replicaPeers = "127.0.0.1:9090";
+    private final String replicaPeer = "127.0.0.1:9090";
     
     @Test(expected = IllegalArgumentException.class)
     public void assertSwapToYamlConfigurationWithMinProperties() {
-        swapper.swapToYamlConfiguration(new ConsensusReplicationActualTableRuleConfiguration(null, null, null, null));
+        swapper.swapToYamlConfiguration(new ConsensusReplicationActualTableRuleConfiguration(null, null, null));
     }
     
     @Test
     public void assertSwapToYamlConfigurationWithMaxProperties() {
         YamlConsensusReplicationActualTableRuleConfiguration yamlConfig = swapper.swapToYamlConfiguration(
-                new ConsensusReplicationActualTableRuleConfiguration(physicsTable, replicaGroupId, replicaPeers, dataSourceName));
-        assertThat(yamlConfig.getDataSourceName(), is(dataSourceName));
+                new ConsensusReplicationActualTableRuleConfiguration(physicsTable, replicaGroupId,
+                        Collections.singletonList(new ConsensusReplicationNodeRuleConfiguration(replicaPeer, dataSourceName))));
         assertThat(yamlConfig.getPhysicsTable(), is(physicsTable));
         assertThat(yamlConfig.getReplicaGroupId(), is(replicaGroupId));
-        assertThat(yamlConfig.getReplicaPeers(), is(replicaPeers));
+        assertNotNull(yamlConfig.getReplicaNodes());
+        assertThat(yamlConfig.getReplicaNodes().size(), is(1));
+        YamlConsensusReplicationNodeRuleConfiguration resultReplicaNode = yamlConfig.getReplicaNodes().iterator().next();
+        assertThat(resultReplicaNode.getReplicaPeer(), is(replicaPeer));
+        assertThat(resultReplicaNode.getDataSourceName(), is(dataSourceName));
     }
     
     @Test(expected = IllegalArgumentException.class)
     public void assertSwapToObjectWithMinProperties() {
-        new ConsensusReplicationActualTableRuleConfiguration(null, null, null, null);
+        new ConsensusReplicationActualTableRuleConfiguration(null, null, null);
     }
     
     @Test
@@ -61,12 +70,17 @@ public class ConsensusReplicationActualTableRuleConfigurationYamlSwapperTest {
         YamlConsensusReplicationActualTableRuleConfiguration yamlConfig = new YamlConsensusReplicationActualTableRuleConfiguration();
         yamlConfig.setPhysicsTable(physicsTable);
         yamlConfig.setReplicaGroupId(replicaGroupId);
-        yamlConfig.setReplicaPeers(replicaPeers);
-        yamlConfig.setDataSourceName(dataSourceName);
+        YamlConsensusReplicationNodeRuleConfiguration replicaNode = new YamlConsensusReplicationNodeRuleConfiguration();
+        replicaNode.setReplicaPeer(replicaPeer);
+        replicaNode.setDataSourceName(dataSourceName);
+        yamlConfig.setReplicaNodes(Collections.singletonList(replicaNode));
         ConsensusReplicationActualTableRuleConfiguration config = swapper.swapToObject(yamlConfig);
-        assertThat(config.getDataSourceName(), is(dataSourceName));
         assertThat(config.getPhysicsTable(), is(physicsTable));
         assertThat(config.getReplicaGroupId(), is(replicaGroupId));
-        assertThat(config.getReplicaPeers(), is(replicaPeers));
+        assertNotNull(config.getReplicaNodes());
+        assertThat(config.getReplicaNodes().size(), is(1));
+        ConsensusReplicationNodeRuleConfiguration resultReplicaNode = config.getReplicaNodes().iterator().next();
+        assertThat(resultReplicaNode.getReplicaPeer(), is(replicaPeer));
+        assertThat(resultReplicaNode.getDataSourceName(), is(dataSourceName));
     }
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlSwapperTest.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationNodeRuleConfigurationYamlSwap [...]
similarity index 52%
copy from shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlSwapperTest.java
copy to shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationNodeRuleConfigurationYamlSwapperTest.java
index f148704..b4ea4f2 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationActualTableRuleConfigurationYamlSwapperTest.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationNodeRuleConfigurationYamlSwapperTest.java
@@ -17,56 +17,49 @@
 
 package org.apache.shardingsphere.replication.consensus.yaml.swapper;
 
-import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationActualTableRuleConfiguration;
-import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensusReplicationActualTableRuleConfiguration;
+import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationNodeRuleConfiguration;
+import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensusReplicationNodeRuleConfiguration;
 import org.junit.Test;
 
 import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 
-public class ConsensusReplicationActualTableRuleConfigurationYamlSwapperTest {
+public class ConsensusReplicationNodeRuleConfigurationYamlSwapperTest {
     
-    private final ConsensusReplicationActualTableRuleConfigurationYamlSwapper swapper = new ConsensusReplicationActualTableRuleConfigurationYamlSwapper();
+    private final ConsensusReplicationNodeRuleConfigurationYamlSwapper swapper = new ConsensusReplicationNodeRuleConfigurationYamlSwapper();
     
     private final String dataSourceName = "demo_ds_0";
     
-    private final String physicsTable = "t_order_1";
-    
-    private final String replicaGroupId = "raftGroupTest1";
-    
-    private final String replicaPeers = "127.0.0.1:9090";
+    private final String replicaPeer = "127.0.0.1:9090";
     
     @Test(expected = IllegalArgumentException.class)
     public void assertSwapToYamlConfigurationWithMinProperties() {
-        swapper.swapToYamlConfiguration(new ConsensusReplicationActualTableRuleConfiguration(null, null, null, null));
+        swapper.swapToYamlConfiguration(new ConsensusReplicationNodeRuleConfiguration(null, null));
     }
     
     @Test
     public void assertSwapToYamlConfigurationWithMaxProperties() {
-        YamlConsensusReplicationActualTableRuleConfiguration yamlConfig = swapper.swapToYamlConfiguration(
-                new ConsensusReplicationActualTableRuleConfiguration(physicsTable, replicaGroupId, replicaPeers, dataSourceName));
+        YamlConsensusReplicationNodeRuleConfiguration yamlConfig = swapper.swapToYamlConfiguration(
+                new ConsensusReplicationNodeRuleConfiguration(replicaPeer, dataSourceName));
+        assertNotNull(yamlConfig);
+        assertThat(yamlConfig.getReplicaPeer(), is(replicaPeer));
         assertThat(yamlConfig.getDataSourceName(), is(dataSourceName));
-        assertThat(yamlConfig.getPhysicsTable(), is(physicsTable));
-        assertThat(yamlConfig.getReplicaGroupId(), is(replicaGroupId));
-        assertThat(yamlConfig.getReplicaPeers(), is(replicaPeers));
     }
     
     @Test(expected = IllegalArgumentException.class)
     public void assertSwapToObjectWithMinProperties() {
-        new ConsensusReplicationActualTableRuleConfiguration(null, null, null, null);
+        new ConsensusReplicationNodeRuleConfiguration(null, null);
     }
     
     @Test
     public void assertSwapToObjectWithMaxProperties() {
-        YamlConsensusReplicationActualTableRuleConfiguration yamlConfig = new YamlConsensusReplicationActualTableRuleConfiguration();
-        yamlConfig.setPhysicsTable(physicsTable);
-        yamlConfig.setReplicaGroupId(replicaGroupId);
-        yamlConfig.setReplicaPeers(replicaPeers);
+        YamlConsensusReplicationNodeRuleConfiguration yamlConfig = new YamlConsensusReplicationNodeRuleConfiguration();
+        yamlConfig.setReplicaPeer(replicaPeer);
         yamlConfig.setDataSourceName(dataSourceName);
-        ConsensusReplicationActualTableRuleConfiguration config = swapper.swapToObject(yamlConfig);
+        ConsensusReplicationNodeRuleConfiguration config = swapper.swapToObject(yamlConfig);
+        assertNotNull(config);
+        assertThat(config.getReplicaPeer(), is(replicaPeer));
         assertThat(config.getDataSourceName(), is(dataSourceName));
-        assertThat(config.getPhysicsTable(), is(physicsTable));
-        assertThat(config.getReplicaGroupId(), is(replicaGroupId));
-        assertThat(config.getReplicaPeers(), is(replicaPeers));
     }
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationRuleConfigurationYamlSwapperTest.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationRuleConfigurationYamlSwapperTest.java
index 016a8ef..fe8e1b2 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationRuleConfigurationYamlSwapperTest.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-common/src/test/java/org/apache/shardingsphere/replication/consensus/yaml/swapper/ConsensusReplicationRuleConfigurationYamlSwapperTest.java
@@ -19,9 +19,11 @@ package org.apache.shardingsphere.replication.consensus.yaml.swapper;
 
 import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationActualTableRuleConfiguration;
 import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationLogicTableRuleConfiguration;
+import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationNodeRuleConfiguration;
 import org.apache.shardingsphere.replication.consensus.api.config.ConsensusReplicationRuleConfiguration;
 import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensusReplicationActualTableRuleConfiguration;
 import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensusReplicationLogicTableRuleConfiguration;
+import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensusReplicationNodeRuleConfiguration;
 import org.apache.shardingsphere.replication.consensus.yaml.config.YamlConsensusReplicationRuleConfiguration;
 import org.junit.Test;
 
@@ -45,7 +47,7 @@ public final class ConsensusReplicationRuleConfigurationYamlSwapperTest {
     
     private final String replicaGroupId = "raftGroupTest1";
     
-    private final String replicaPeers = "127.0.0.1:9090";
+    private final String replicaPeer = "127.0.0.1:9090";
     
     @Test
     public void assertSwapToYamlConfigurationWithMinProperties() {
@@ -61,7 +63,8 @@ public final class ConsensusReplicationRuleConfigurationYamlSwapperTest {
     
     @Test
     public void assertSwapToYamlConfigurationWithMaxProperties() {
-        ConsensusReplicationActualTableRuleConfiguration replicaGroup = new ConsensusReplicationActualTableRuleConfiguration(physicsTable, replicaGroupId, replicaPeers, dataSourceName);
+        ConsensusReplicationActualTableRuleConfiguration replicaGroup = new ConsensusReplicationActualTableRuleConfiguration(physicsTable, replicaGroupId,
+                Collections.singletonList(new ConsensusReplicationNodeRuleConfiguration(replicaPeer, dataSourceName)));
         Collection<ConsensusReplicationActualTableRuleConfiguration> replicaGroups = Collections.singleton(replicaGroup);
         ConsensusReplicationLogicTableRuleConfiguration table = new ConsensusReplicationLogicTableRuleConfiguration(logicTableName, replicaGroups);
         YamlConsensusReplicationRuleConfiguration yamlConfig = swapper.swapToYamlConfiguration(new ConsensusReplicationRuleConfiguration(Collections.singleton(table)));
@@ -72,10 +75,14 @@ public final class ConsensusReplicationRuleConfigurationYamlSwapperTest {
         assertNotNull(resultReplicaGroups);
         assertThat(resultReplicaGroups.size(), is(1));
         YamlConsensusReplicationActualTableRuleConfiguration resultReplicaGroup = resultReplicaGroups.iterator().next();
-        assertThat(resultReplicaGroup.getDataSourceName(), is(dataSourceName));
         assertThat(resultReplicaGroup.getPhysicsTable(), is(physicsTable));
         assertThat(resultReplicaGroup.getReplicaGroupId(), is(replicaGroupId));
-        assertThat(resultReplicaGroup.getReplicaPeers(), is(replicaPeers));
+        Collection<YamlConsensusReplicationNodeRuleConfiguration> resultReplicaNodes = resultReplicaGroup.getReplicaNodes();
+        assertNotNull(resultReplicaNodes);
+        assertThat(resultReplicaNodes.size(), is(1));
+        YamlConsensusReplicationNodeRuleConfiguration resultReplicaNode = resultReplicaNodes.iterator().next();
+        assertThat(resultReplicaNode.getReplicaPeer(), is(replicaPeer));
+        assertThat(resultReplicaNode.getDataSourceName(), is(dataSourceName));
     }
     
     @Test
@@ -98,8 +105,10 @@ public final class ConsensusReplicationRuleConfigurationYamlSwapperTest {
         YamlConsensusReplicationActualTableRuleConfiguration replicaGroup = new YamlConsensusReplicationActualTableRuleConfiguration();
         replicaGroup.setPhysicsTable(physicsTable);
         replicaGroup.setReplicaGroupId(replicaGroupId);
-        replicaGroup.setReplicaPeers(replicaPeers);
-        replicaGroup.setDataSourceName(dataSourceName);
+        YamlConsensusReplicationNodeRuleConfiguration replicaNode = new YamlConsensusReplicationNodeRuleConfiguration();
+        replicaNode.setReplicaPeer(replicaPeer);
+        replicaNode.setDataSourceName(dataSourceName);
+        replicaGroup.setReplicaNodes(Collections.singletonList(replicaNode));
         Collection<YamlConsensusReplicationActualTableRuleConfiguration> replicaGroups = Collections.singleton(replicaGroup);
         YamlConsensusReplicationLogicTableRuleConfiguration table = new YamlConsensusReplicationLogicTableRuleConfiguration();
         table.setLogicTable(logicTableName);
@@ -114,9 +123,13 @@ public final class ConsensusReplicationRuleConfigurationYamlSwapperTest {
         assertNotNull(resultReplicaGroups);
         assertThat(resultReplicaGroups.size(), is(1));
         ConsensusReplicationActualTableRuleConfiguration resultReplicaGroup = resultReplicaGroups.iterator().next();
-        assertThat(resultReplicaGroup.getDataSourceName(), is(dataSourceName));
         assertThat(resultReplicaGroup.getPhysicsTable(), is(physicsTable));
         assertThat(resultReplicaGroup.getReplicaGroupId(), is(replicaGroupId));
-        assertThat(resultReplicaGroup.getReplicaPeers(), is(replicaPeers));
+        Collection<ConsensusReplicationNodeRuleConfiguration> resultReplicaNodes = resultReplicaGroup.getReplicaNodes();
+        assertNotNull(resultReplicaNodes);
+        assertThat(resultReplicaNodes.size(), is(1));
+        ConsensusReplicationNodeRuleConfiguration resultReplicaNode = resultReplicaNodes.iterator().next();
+        assertThat(resultReplicaNode.getReplicaPeer(), is(replicaPeer));
+        assertThat(resultReplicaNode.getDataSourceName(), is(dataSourceName));
     }
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationGroup.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationGroup.java
index 72611e7..66fe687 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationGroup.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationGroup.java
@@ -21,6 +21,8 @@ import lombok.AllArgsConstructor;
 import lombok.Getter;
 import org.apache.shardingsphere.infra.route.context.RawGroup;
 
+import java.util.Collection;
+
 /**
  * Consensus replication group.
  */
@@ -34,7 +36,5 @@ public final class ConsensusReplicationGroup implements RawGroup {
     
     private final String replicaGroupId;
     
-    private final String replicaPeers;
-    
-    private final String dataSourceName;
+    private final Collection<ConsensusReplicationGroupNode> replicaNodeRules;
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationGroup.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationGroupNode.java
similarity index 69%
copy from shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationGroup.java
copy to shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationGroupNode.java
index 72611e7..317d47f 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationGroup.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationGroupNode.java
@@ -17,24 +17,21 @@
 
 package org.apache.shardingsphere.replication.consensus.route.engine;
 
-import lombok.AllArgsConstructor;
 import lombok.Getter;
-import org.apache.shardingsphere.infra.route.context.RawGroup;
+import org.apache.shardingsphere.replication.consensus.rule.ConsensusReplicationNodeRule;
 
 /**
- * Consensus replication group.
+ * Consensus replication group node.
  */
-@AllArgsConstructor
 @Getter
-public final class ConsensusReplicationGroup implements RawGroup {
+public final class ConsensusReplicationGroupNode {
     
-    public static final String BLANK_CONSENSUS_REPLICATION_GROUP_KEY = "Nil";
-    
-    private final String physicsTable;
-    
-    private final String replicaGroupId;
-    
-    private final String replicaPeers;
+    private final String replicaPeer;
     
     private final String dataSourceName;
+    
+    public ConsensusReplicationGroupNode(final ConsensusReplicationNodeRule replicaNodeRule) {
+        replicaPeer = replicaNodeRule.getReplicaPeer();
+        dataSourceName = replicaNodeRule.getDataSourceName();
+    }
 }
diff --git a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationSQLRouter.java b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationSQLRouter.java
index 4e283b9..3ef4347 100644
--- a/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationSQLRouter.java
+++ b/shardingsphere-features/shardingsphere-consensus-replication/shardingsphere-consensus-replication-route/src/main/java/org/apache/shardingsphere/replication/consensus/route/engine/ConsensusReplicationSQLRouter.java
@@ -34,6 +34,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * Consensus replication SQL router.
@@ -45,7 +46,8 @@ public final class ConsensusReplicationSQLRouter implements SQLRouter<ConsensusR
         RouteContext result = new RouteContext();
         ConsensusReplicationTableRule tableRule = rule.getReplicaTableRules().iterator().next();
         ConsensusReplicationGroup replicaGroup = new ConsensusReplicationGroup(
-                tableRule.getPhysicsTable(), tableRule.getReplicaGroupId(), tableRule.getReplicaPeers(), tableRule.getDataSourceName());
+                tableRule.getPhysicsTable(), tableRule.getReplicaGroupId(),
+                tableRule.getReplicaNodeRules().stream().map(ConsensusReplicationGroupNode::new).collect(Collectors.toList()));
         Map<String, ConsensusReplicationGroup> replicaGroups = Collections.singletonMap(ConsensusReplicationGroup.BLANK_CONSENSUS_REPLICATION_GROUP_KEY, replicaGroup);
         boolean isReadOnly = SQLUtil.isReadOnly(logicSQL.getSqlStatementContext().getSqlStatement());
         result.getRouteStageContexts().put(getTypeClass(), new ConsensusReplicationRouteStageContext(schema.getName(), replicaGroups, isReadOnly));
@@ -53,7 +55,7 @@ public final class ConsensusReplicationSQLRouter implements SQLRouter<ConsensusR
     }
     
     @Override
-    public void decorateRouteContext(final RouteContext routeContext, 
+    public void decorateRouteContext(final RouteContext routeContext,
                                      final LogicSQL logicSQL, final ShardingSphereSchema schema, final ConsensusReplicationRule rule, final ConfigurationProperties props) {
         Map<String, ConsensusReplicationGroup> replicaGroups = new HashMap<>();
         for (RouteUnit each : routeContext.getRouteUnits()) {
@@ -61,7 +63,8 @@ public final class ConsensusReplicationSQLRouter implements SQLRouter<ConsensusR
             if (null == routeMappers || routeMappers.isEmpty()) {
                 ConsensusReplicationTableRule tableRule = rule.getReplicaTableRules().iterator().next();
                 ConsensusReplicationGroup replicaGroup = new ConsensusReplicationGroup(
-                        tableRule.getPhysicsTable(), tableRule.getReplicaGroupId(), tableRule.getReplicaPeers(), tableRule.getDataSourceName());
+                        tableRule.getPhysicsTable(), tableRule.getReplicaGroupId(),
+                        tableRule.getReplicaNodeRules().stream().map(ConsensusReplicationGroupNode::new).collect(Collectors.toList()));
                 replicaGroups.put(ConsensusReplicationGroup.BLANK_CONSENSUS_REPLICATION_GROUP_KEY, replicaGroup);
             } else {
                 routeReplicaGroups(routeMappers, rule, replicaGroups);
@@ -79,12 +82,14 @@ public final class ConsensusReplicationSQLRouter implements SQLRouter<ConsensusR
             if (tableRuleOptional.isPresent()) {
                 ConsensusReplicationTableRule tableRule = tableRuleOptional.get();
                 replicaGroup = new ConsensusReplicationGroup(
-                        tableRule.getPhysicsTable(), tableRule.getReplicaGroupId(), tableRule.getReplicaPeers(), tableRule.getDataSourceName());
+                        tableRule.getPhysicsTable(), tableRule.getReplicaGroupId(),
+                        tableRule.getReplicaNodeRules().stream().map(ConsensusReplicationGroupNode::new).collect(Collectors.toList()));
                 replicaGroups.put(actualTableName, replicaGroup);
             } else {
                 ConsensusReplicationTableRule tableRule = rule.getReplicaTableRules().iterator().next();
                 replicaGroup = new ConsensusReplicationGroup(
-                        tableRule.getPhysicsTable(), tableRule.getReplicaGroupId(), tableRule.getReplicaPeers(), tableRule.getDataSourceName());
+                        tableRule.getPhysicsTable(), tableRule.getReplicaGroupId(),
+                        tableRule.getReplicaNodeRules().stream().map(ConsensusReplicationGroupNode::new).collect(Collectors.toList()));
             }
             replicaGroups.put(actualTableName, replicaGroup);
         }