Search in sources :

Example 11 with ClusterConfig

use of io.mycat.config.ClusterConfig in project Mycat2 by MyCATApache.

the class SingleTest method testMasterBroken.

@Test
public void testMasterBroken() {
    ClusterConfig clusterConfig = CreateClusterHint.createConfig("c0", Arrays.asList("dsw1", "dsw2"), Arrays.asList("dsr1"));
    TimerConfig timerConfig = new TimerConfig();
    timerConfig.setTimeUnit(TimeUnit.SECONDS.name());
    timerConfig.setPeriod(1);
    timerConfig.setInitialDelay(0);
    clusterConfig.setTimer(timerConfig);
    clusterConfig.setClusterType(ReplicaType.SINGLE_NODE.name());
    HashMap<String, DatasourceConfig> map = new HashMap<>();
    map.put("dsw1", CreateDataSourceHint.createConfig("dsw1", DB1));
    map.put("dsw2", CreateDataSourceHint.createConfig("dsw2", DB2));
    map.put("dsr1", CreateDataSourceHint.createConfig("dsr1", DB2));
    LinkedList<Runnable> runnables = new LinkedList<>();
    ReplicaSelectorManager manager = ReplicaSelectorRuntime.create(Arrays.asList(clusterConfig), map, new LoadBalanceManager(), name -> 0, (command, initialDelay, period, unit) -> {
        runnables.add(command);
        return () -> {
        };
    });
    manager.start();
    manager.putHeartFlow("c0", "dsw1", makeBroken());
    manager.putHeartFlow("c0", "dsw2", checkSelect1());
    manager.putHeartFlow("c0", "dsr1", checkSelect1());
    // 模拟第一主节点无法连接
    MetaClusterCurrent.register(Maps.of(ConfigReporter.class, new ConfigReporter() {

        @Override
        public void reportReplica(Map<String, List<String>> state) {
            List<String> c0 = state.get("c0");
            Assert.assertEquals("[dsw2]", c0.toString());
        }
    }));
    // 三次错误后触发主从切换
    for (Runnable runnable : runnables) {
        runnable.run();
    }
    {
        checkALlRight(manager);
    }
    for (Runnable runnable : runnables) {
        runnable.run();
    }
    {
    }
    for (Runnable runnable : runnables) {
        runnable.run();
    }
    {
        PhysicsInstance dsw1 = manager.getPhysicsInstanceByName("dsw1");
        Assert.assertFalse(dsw1.asSelectRead());
        Assert.assertFalse(dsw1.isAlive());
        PhysicsInstance dsw2 = manager.getPhysicsInstanceByName("dsw2");
        Assert.assertTrue(dsw2.asSelectRead());
        Assert.assertTrue(dsw2.isAlive());
        PhysicsInstance dsr1 = manager.getPhysicsInstanceByName("dsr1");
        Assert.assertTrue(dsr1.asSelectRead());
        Assert.assertTrue(dsr1.isAlive());
    }
    // 测试已经切换
    Set<String> balanceTargets = new HashSet<>();
    test(() -> {
        balanceTargets.add(manager.getDatasourceNameByReplicaName("c0", false, null));
        return false;
    });
    Assert.assertTrue(balanceTargets.size() <= 2);
    Assert.assertFalse(balanceTargets.contains("dsw1"));
    Set<String> masterTargets = new HashSet<>();
    test(() -> {
        masterTargets.add(manager.getDatasourceNameByReplicaName("c0", true, null));
        return false;
    });
    Assert.assertEquals(1, masterTargets.size());
    Assert.assertTrue(masterTargets.contains("dsw2"));
    manager.putHeartFlow("c0", "dsw2", checkSelect1());
    manager.putHeartFlow("c0", "dsw1", checkSelect1());
    manager.putHeartFlow("c0", "dsr1", checkSelect1());
    for (Runnable runnable : runnables) {
        runnable.run();
    }
    {
        PhysicsInstance dsw1 = manager.getPhysicsInstanceByName("dsw1");
        Assert.assertTrue(dsw1.asSelectRead());
        Assert.assertTrue(dsw1.isAlive());
    }
    // 切换后又发生短暂的连接损坏,因为新建心跳对象导致切换周期重置,这里不测试最小切换周期
    manager.putHeartFlow("c0", "dsw2", makeBroken());
    manager.putHeartFlow("c0", "dsw1", checkSelect1());
    manager.putHeartFlow("c0", "dsr1", checkSelect1());
    MetaClusterCurrent.register(Maps.of(ConfigReporter.class, new ConfigReporter() {

        @Override
        public void reportReplica(Map<String, List<String>> state) {
            List<String> c0 = state.get("c0");
            Assert.assertEquals("[dsw1]", c0.toString());
        }
    }));
    for (Runnable runnable : runnables) {
        runnable.run();
    }
    for (Runnable runnable : runnables) {
        runnable.run();
    }
    for (Runnable runnable : runnables) {
        runnable.run();
    }
    {
        PhysicsInstance dsw1 = manager.getPhysicsInstanceByName("dsw1");
        Assert.assertTrue(dsw1.asSelectRead());
        Assert.assertTrue(dsw1.isAlive());
        PhysicsInstance dsw2 = manager.getPhysicsInstanceByName("dsw2");
        Assert.assertFalse(dsw2.asSelectRead());
        Assert.assertFalse(dsw2.isAlive());
        PhysicsInstance dsr1 = manager.getPhysicsInstanceByName("dsr1");
        Assert.assertTrue(dsr1.asSelectRead());
        Assert.assertTrue(dsr1.isAlive());
    }
    // 测试最小切换周期
    Consumer<HeartBeatStrategy> consumer = new Consumer<HeartBeatStrategy>() {

        int count = 0;

        @Override
        public void accept(HeartBeatStrategy heartBeatStrategy) {
            if (ThreadLocalRandom.current().nextBoolean()) {
                makeBroken().accept(heartBeatStrategy);
            } else {
                checkSelect1().accept(heartBeatStrategy);
            }
            count++;
        }
    };
    manager.putHeartFlow("c0", "dsw1", consumer);
    manager.putHeartFlow("c0", "dsw2", consumer);
    manager.putHeartFlow("c0", "dsr1", consumer);
    AtomicInteger switchCounter = new AtomicInteger();
    MetaClusterCurrent.register(Maps.of(ConfigReporter.class, new ConfigReporter() {

        @Override
        public void reportReplica(Map<String, List<String>> state) {
            switchCounter.getAndIncrement();
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
            }
        }
    }));
    for (int i = 0; i < 1000; i++) {
        for (Runnable runnable : runnables) {
            runnable.run();
        }
    }
    Assert.assertTrue(switchCounter.get() < 100);
}
Also used : TimerConfig(io.mycat.config.TimerConfig) LoadBalanceManager(io.mycat.plug.loadBalance.LoadBalanceManager) CreateDataSourceHint(io.mycat.hint.CreateDataSourceHint) CreateClusterHint(io.mycat.hint.CreateClusterHint) HeartBeatStrategy(io.mycat.replica.heartbeat.HeartBeatStrategy) DatasourceConfig(io.mycat.config.DatasourceConfig) Consumer(java.util.function.Consumer) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ConfigReporter(io.mycat.ConfigReporter) ClusterConfig(io.mycat.config.ClusterConfig) Test(org.junit.Test)

Example 12 with ClusterConfig

use of io.mycat.config.ClusterConfig in project Mycat2 by MyCATApache.

the class SingleTest method testSlaveBroken.

@Test
public void testSlaveBroken() {
    ClusterConfig clusterConfig = CreateClusterHint.createConfig("c0", Arrays.asList("dsw1", "dsw2"), Arrays.asList("dsr1"));
    TimerConfig timerConfig = new TimerConfig();
    timerConfig.setTimeUnit(TimeUnit.SECONDS.name());
    timerConfig.setPeriod(1);
    timerConfig.setInitialDelay(0);
    clusterConfig.setTimer(timerConfig);
    clusterConfig.setClusterType(ReplicaType.SINGLE_NODE.name());
    HashMap<String, DatasourceConfig> map = new HashMap<>();
    map.put("dsw1", CreateDataSourceHint.createConfig("dsw1", DB1));
    map.put("dsw2", CreateDataSourceHint.createConfig("dsw2", DB2));
    map.put("dsr1", CreateDataSourceHint.createConfig("dsr1", DB2));
    LinkedList<Runnable> runnables = new LinkedList<>();
    ReplicaSelectorManager manager = ReplicaSelectorRuntime.create(Arrays.asList(clusterConfig), map, new LoadBalanceManager(), name -> 0, (command, initialDelay, period, unit) -> {
        runnables.add(command);
        return () -> {
        };
    });
    MetaClusterCurrent.register(Maps.of(ConfigReporter.class, new ConfigReporter() {

        @Override
        public void reportReplica(Map<String, List<String>> state) {
            List<String> c0 = state.get("c0");
            Assert.assertEquals("[dsw2]", c0.toString());
        }
    }));
    manager.start();
    manager.putHeartFlow("c0", "dsw1", checkMasterSlave());
    manager.putHeartFlow("c0", "dsw2", checkMasterSlave());
    manager.putHeartFlow("c0", "dsr1", makeBroken());
    for (Runnable runnable : runnables) {
        runnable.run();
    }
    for (Runnable runnable : runnables) {
        runnable.run();
    }
    for (Runnable runnable : runnables) {
        runnable.run();
    }
    // 测试已经切换
    Set<String> balanceTargets = new HashSet<>();
    test(() -> {
        balanceTargets.add(manager.getDatasourceNameByReplicaName("c0", false, null));
        return false;
    });
    Assert.assertFalse(balanceTargets.contains("dsr1"));
    Set<String> masterTargets = new HashSet<>();
    test(() -> {
        masterTargets.add(manager.getDatasourceNameByReplicaName("c0", true, null));
        return false;
    });
    Assert.assertEquals(1, masterTargets.size());
    Assert.assertTrue(masterTargets.contains("dsw1"));
    manager.putHeartFlow("c0", "dsr1", checkMasterSlave());
    for (Runnable runnable : runnables) {
        runnable.run();
    }
    PhysicsInstance dsr1 = manager.getPhysicsInstanceByName("dsr1");
    Assert.assertTrue(dsr1.asSelectRead());
    Assert.assertTrue(dsr1.isAlive());
}
Also used : TimerConfig(io.mycat.config.TimerConfig) LoadBalanceManager(io.mycat.plug.loadBalance.LoadBalanceManager) DatasourceConfig(io.mycat.config.DatasourceConfig) ConfigReporter(io.mycat.ConfigReporter) ClusterConfig(io.mycat.config.ClusterConfig) Test(org.junit.Test)

Example 13 with ClusterConfig

use of io.mycat.config.ClusterConfig in project Mycat2 by MyCATApache.

the class DropClusterHint method create.

public static String create(String name) {
    ClusterConfig clusterConfig = new ClusterConfig();
    clusterConfig.setName(name);
    DropClusterHint dropClusterHint = new DropClusterHint();
    dropClusterHint.setConfig(clusterConfig);
    return dropClusterHint.build();
}
Also used : ClusterConfig(io.mycat.config.ClusterConfig)

Example 14 with ClusterConfig

use of io.mycat.config.ClusterConfig in project Mycat2 by MyCATApache.

the class CreateClusterHint method create.

public static String create(String name, List<String> masters, List<String> reads) {
    ClusterConfig clusterConfig = createConfig(name, masters, reads);
    CreateClusterHint createClusterHint = new CreateClusterHint();
    createClusterHint.setConfig(clusterConfig);
    return createClusterHint.build();
}
Also used : ClusterConfig(io.mycat.config.ClusterConfig)

Example 15 with ClusterConfig

use of io.mycat.config.ClusterConfig in project Mycat2 by MyCATApache.

the class CreateClusterHint method createConfig.

@NotNull
public static ClusterConfig createConfig(String name, List<String> masters, List<String> reads) {
    ClusterConfig clusterConfig = new ClusterConfig();
    clusterConfig.setName(name);
    clusterConfig.setMasters(masters);
    clusterConfig.setReplicas(reads);
    return clusterConfig;
}
Also used : ClusterConfig(io.mycat.config.ClusterConfig) NotNull(org.jetbrains.annotations.NotNull)

Aggregations

ClusterConfig (io.mycat.config.ClusterConfig)31 DatasourceConfig (io.mycat.config.DatasourceConfig)26 LoadBalanceManager (io.mycat.plug.loadBalance.LoadBalanceManager)24 TimerConfig (io.mycat.config.TimerConfig)22 Test (org.junit.Test)22 ConfigReporter (io.mycat.ConfigReporter)16 Consumer (java.util.function.Consumer)7 CreateClusterHint (io.mycat.hint.CreateClusterHint)6 CreateDataSourceHint (io.mycat.hint.CreateDataSourceHint)6 HeartBeatStrategy (io.mycat.replica.heartbeat.HeartBeatStrategy)6 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)5 ReplicaSelectorManager (io.mycat.replica.ReplicaSelectorManager)3 SchemaHandler (io.mycat.calcite.table.SchemaHandler)2 ServerConfig (io.mycat.config.ServerConfig)2 DruidDatasourceProvider (io.mycat.datasource.jdbc.DruidDatasourceProvider)2 JdbcConnectionManager (io.mycat.datasource.jdbc.datasource.JdbcConnectionManager)2 NameMap (io.mycat.util.NameMap)2 java.util (java.util)2 Collectors (java.util.stream.Collectors)2 Logger (org.slf4j.Logger)2