Search in sources :

Example 21 with RandomLoadBalancer

use of org.redisson.connection.balancer.RandomLoadBalancer in project redisson by redisson.

the class RedissonTest method testFailoverInCluster.

@Test
public void testFailoverInCluster() throws Exception {
    RedisRunner master1 = new RedisRunner().port(6890).randomDir().nosave();
    RedisRunner master2 = new RedisRunner().port(6891).randomDir().nosave();
    RedisRunner master3 = new RedisRunner().port(6892).randomDir().nosave();
    RedisRunner slave1 = new RedisRunner().port(6900).randomDir().nosave();
    RedisRunner slave2 = new RedisRunner().port(6901).randomDir().nosave();
    RedisRunner slave3 = new RedisRunner().port(6902).randomDir().nosave();
    RedisRunner slave4 = new RedisRunner().port(6903).randomDir().nosave();
    ClusterRunner clusterRunner = new ClusterRunner().addNode(master1, slave1, slave4).addNode(master2, slave2).addNode(master3, slave3);
    ClusterProcesses process = clusterRunner.run();
    Thread.sleep(5000);
    Config config = new Config();
    config.useClusterServers().setLoadBalancer(new RandomLoadBalancer()).addNodeAddress(process.getNodes().stream().findAny().get().getRedisServerAddressAndPort());
    RedissonClient redisson = Redisson.create(config);
    RedisProcess master = process.getNodes().stream().filter(x -> x.getRedisServerPort() == master1.getPort()).findFirst().get();
    List<RFuture<?>> futures = new ArrayList<RFuture<?>>();
    CountDownLatch latch = new CountDownLatch(1);
    Thread t = new Thread() {

        public void run() {
            for (int i = 0; i < 2000; i++) {
                RFuture<?> f1 = redisson.getBucket("i" + i).getAsync();
                RFuture<?> f2 = redisson.getBucket("i" + i).setAsync("");
                RFuture<?> f3 = redisson.getTopic("topic").publishAsync("testmsg");
                futures.add(f1);
                futures.add(f2);
                futures.add(f3);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if (i % 100 == 0) {
                    System.out.println("step: " + i);
                }
            }
            latch.countDown();
        }
    };
    t.start();
    t.join(1000);
    Set<InetSocketAddress> oldMasters = new HashSet<>();
    Collection<RedisClusterMaster> masterNodes = redisson.getRedisNodes(RedisNodes.CLUSTER).getMasters();
    for (RedisClusterMaster clusterNode : masterNodes) {
        oldMasters.add(clusterNode.getAddr());
    }
    master.stop();
    System.out.println("master " + master.getRedisServerAddressAndPort() + " has been stopped!");
    Thread.sleep(TimeUnit.SECONDS.toMillis(90));
    RedisProcess newMaster = null;
    Collection<RedisClusterMaster> newMasterNodes = redisson.getRedisNodes(RedisNodes.CLUSTER).getMasters();
    for (RedisClusterMaster clusterNode : newMasterNodes) {
        if (!oldMasters.contains(clusterNode.getAddr())) {
            newMaster = process.getNodes().stream().filter(x -> x.getRedisServerPort() == clusterNode.getAddr().getPort()).findFirst().get();
            break;
        }
    }
    assertThat(newMaster).isNotNull();
    Thread.sleep(30000);
    newMaster.stop();
    System.out.println("new master " + newMaster.getRedisServerAddressAndPort() + " has been stopped!");
    Thread.sleep(TimeUnit.SECONDS.toMillis(80));
    assertThat(latch.await(30, TimeUnit.SECONDS)).isTrue();
    int errors = 0;
    int success = 0;
    int readonlyErrors = 0;
    for (RFuture<?> rFuture : futures) {
        try {
            rFuture.toCompletableFuture().join();
        } catch (Exception e) {
        // skip
        }
        if (!rFuture.isSuccess()) {
            errors++;
        } else {
            success++;
        }
    }
    redisson.shutdown();
    process.shutdown();
    assertThat(readonlyErrors).isZero();
    assertThat(errors).isLessThan(1000);
    assertThat(success).isGreaterThan(5000);
}
Also used : Encoder(org.redisson.client.protocol.Encoder) java.util(java.util) StringCodec(org.redisson.client.codec.StringCodec) ByteBufAllocator(io.netty.buffer.ByteBufAllocator) Config(org.redisson.config.Config) State(org.redisson.client.handler.State) JsonJacksonCodec(org.redisson.codec.JsonJacksonCodec) MasterSlaveConnectionManager(org.redisson.connection.MasterSlaveConnectionManager) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) RandomString(net.bytebuddy.utility.RandomString) RedisProcess(org.redisson.RedisRunner.RedisProcess) ConnectionListener(org.redisson.connection.ConnectionListener) BaseCodec(org.redisson.client.codec.BaseCodec) ReadMode(org.redisson.config.ReadMode) ClusterProcesses(org.redisson.ClusterRunner.ClusterProcesses) ByteBuf(io.netty.buffer.ByteBuf) RedisClusterMaster(org.redisson.api.redisnode.RedisClusterMaster) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) CharsetUtil(io.netty.util.CharsetUtil) org.redisson.api(org.redisson.api) Decoder(org.redisson.client.protocol.Decoder) ClusterNodeInfo(org.redisson.cluster.ClusterNodeInfo) Awaitility.await(org.awaitility.Awaitility.await) java.util.concurrent(java.util.concurrent) org.redisson.client(org.redisson.client) SerializationCodec(org.redisson.codec.SerializationCodec) SubscriptionMode(org.redisson.config.SubscriptionMode) IOException(java.io.IOException) InetSocketAddress(java.net.InetSocketAddress) Collectors(java.util.stream.Collectors) RedisCommands(org.redisson.client.protocol.RedisCommands) Test(org.junit.jupiter.api.Test) CRC16(org.redisson.connection.CRC16) Assumptions(org.junit.jupiter.api.Assumptions) RedisNodes(org.redisson.api.redisnode.RedisNodes) Assertions(org.junit.jupiter.api.Assertions) RandomLoadBalancer(org.redisson.connection.balancer.RandomLoadBalancer) Flag(org.redisson.cluster.ClusterNodeInfo.Flag) RedisProcess(org.redisson.RedisRunner.RedisProcess) Config(org.redisson.config.Config) InetSocketAddress(java.net.InetSocketAddress) RedisClusterMaster(org.redisson.api.redisnode.RedisClusterMaster) IOException(java.io.IOException) ClusterProcesses(org.redisson.ClusterRunner.ClusterProcesses) RandomLoadBalancer(org.redisson.connection.balancer.RandomLoadBalancer) Test(org.junit.jupiter.api.Test)

Example 22 with RandomLoadBalancer

use of org.redisson.connection.balancer.RandomLoadBalancer in project redisson by redisson.

the class RedissonSpinLockTest method testInCluster.

@Test
public void testInCluster() throws Exception {
    RedisRunner master1 = new RedisRunner().port(6890).randomDir().nosave();
    RedisRunner master2 = new RedisRunner().port(6891).randomDir().nosave();
    RedisRunner master3 = new RedisRunner().port(6892).randomDir().nosave();
    RedisRunner slave1 = new RedisRunner().port(6900).randomDir().nosave();
    RedisRunner slave2 = new RedisRunner().port(6901).randomDir().nosave();
    RedisRunner slave3 = new RedisRunner().port(6902).randomDir().nosave();
    ClusterRunner clusterRunner = new ClusterRunner().addNode(master1, slave1).addNode(master2, slave2).addNode(master3, slave3);
    ClusterRunner.ClusterProcesses process = clusterRunner.run();
    Thread.sleep(5000);
    Config config = new Config();
    config.useClusterServers().setLoadBalancer(new RandomLoadBalancer()).addNodeAddress(process.getNodes().stream().findAny().get().getRedisServerAddressAndPort());
    RedissonClient redisson = Redisson.create(config);
    RLock lock = redisson.getSpinLock("myLock");
    lock.lock();
    assertThat(lock.isLocked()).isTrue();
    lock.unlock();
    assertThat(lock.isLocked()).isFalse();
    redisson.shutdown();
    process.shutdown();
}
Also used : RedissonClient(org.redisson.api.RedissonClient) Config(org.redisson.config.Config) RLock(org.redisson.api.RLock) RandomLoadBalancer(org.redisson.connection.balancer.RandomLoadBalancer) Test(org.junit.jupiter.api.Test)

Example 23 with RandomLoadBalancer

use of org.redisson.connection.balancer.RandomLoadBalancer in project redisson by redisson.

the class RedissonExecutorServiceTest method testFailoverInSentinel.

@Test
public void testFailoverInSentinel() throws Exception {
    RedisRunner.RedisProcess master = new RedisRunner().nosave().randomPort().randomDir().run();
    RedisRunner.RedisProcess slave1 = new RedisRunner().port(6380).nosave().randomDir().slaveof("127.0.0.1", master.getRedisServerPort()).run();
    RedisRunner.RedisProcess slave2 = new RedisRunner().port(6381).nosave().randomDir().slaveof("127.0.0.1", master.getRedisServerPort()).run();
    RedisRunner.RedisProcess sentinel1 = new RedisRunner().nosave().randomDir().port(26379).sentinel().sentinelMonitor("myMaster", "127.0.0.1", master.getRedisServerPort(), 2).run();
    RedisRunner.RedisProcess sentinel2 = new RedisRunner().nosave().randomDir().port(26380).sentinel().sentinelMonitor("myMaster", "127.0.0.1", master.getRedisServerPort(), 2).run();
    RedisRunner.RedisProcess sentinel3 = new RedisRunner().nosave().randomDir().port(26381).sentinel().sentinelMonitor("myMaster", "127.0.0.1", master.getRedisServerPort(), 2).run();
    Thread.sleep(5000);
    Config config = new Config();
    config.useSentinelServers().setLoadBalancer(new RandomLoadBalancer()).addSentinelAddress(sentinel3.getRedisServerAddressAndPort()).setMasterName("myMaster");
    RedissonClient redisson = Redisson.create(config);
    RedissonNodeConfig nodeConfig = new RedissonNodeConfig(config);
    nodeConfig.setExecutorServiceWorkers(Collections.singletonMap("test2", 1));
    node.shutdown();
    node = RedissonNode.create(nodeConfig);
    node.start();
    RExecutorService executor = redisson.getExecutorService("test2", ExecutorOptions.defaults().taskRetryInterval(10, TimeUnit.SECONDS));
    for (int i = 0; i < 10; i++) {
        executor.submit(new DelayedTask(2000, "counter"));
    }
    Thread.sleep(2500);
    assertThat(redisson.getAtomicLong("counter").get()).isEqualTo(1);
    master.stop();
    System.out.println("master " + master.getRedisServerAddressAndPort() + " stopped!");
    Thread.sleep(TimeUnit.SECONDS.toMillis(70));
    master = new RedisRunner().port(master.getRedisServerPort()).nosave().randomDir().run();
    System.out.println("master " + master.getRedisServerAddressAndPort() + " started!");
    Thread.sleep(25000);
    assertThat(redisson.getAtomicLong("counter").get()).isEqualTo(10);
    redisson.shutdown();
    node.shutdown();
    sentinel1.stop();
    sentinel2.stop();
    sentinel3.stop();
    master.stop();
    slave1.stop();
    slave2.stop();
}
Also used : Config(org.redisson.config.Config) RedissonNodeConfig(org.redisson.config.RedissonNodeConfig) RedissonNodeConfig(org.redisson.config.RedissonNodeConfig) RandomLoadBalancer(org.redisson.connection.balancer.RandomLoadBalancer) Test(org.junit.jupiter.api.Test)

Example 24 with RandomLoadBalancer

use of org.redisson.connection.balancer.RandomLoadBalancer in project redisson by redisson.

the class RedissonBlockingQueueTest method testTakeReattachSentinel.

@Test
public void testTakeReattachSentinel() throws IOException, InterruptedException, TimeoutException, ExecutionException {
    RedisRunner.RedisProcess master = new RedisRunner().nosave().randomDir().run();
    RedisRunner.RedisProcess slave1 = new RedisRunner().port(6380).nosave().randomDir().slaveof("127.0.0.1", 6379).run();
    RedisRunner.RedisProcess slave2 = new RedisRunner().port(6381).nosave().randomDir().slaveof("127.0.0.1", 6379).run();
    RedisRunner.RedisProcess sentinel1 = new RedisRunner().nosave().randomDir().port(26379).sentinel().sentinelMonitor("myMaster", "127.0.0.1", 6379, 2).run();
    RedisRunner.RedisProcess sentinel2 = new RedisRunner().nosave().randomDir().port(26380).sentinel().sentinelMonitor("myMaster", "127.0.0.1", 6379, 2).run();
    RedisRunner.RedisProcess sentinel3 = new RedisRunner().nosave().randomDir().port(26381).sentinel().sentinelMonitor("myMaster", "127.0.0.1", 6379, 2).run();
    Thread.sleep(1000);
    Config config = new Config();
    config.useSentinelServers().setLoadBalancer(new RandomLoadBalancer()).addSentinelAddress(sentinel3.getRedisServerAddressAndPort()).setMasterName("myMaster");
    RedissonClient redisson = Redisson.create(config);
    RBlockingQueue<Integer> queue1 = getQueue(redisson);
    RFuture<Integer> f = queue1.takeAsync();
    try {
        f.toCompletableFuture().get(1, TimeUnit.SECONDS);
    } catch (ExecutionException | TimeoutException e) {
    // skip
    }
    master.stop();
    Thread.sleep(TimeUnit.SECONDS.toMillis(60));
    queue1.put(123);
    // check connection rotation
    for (int i = 0; i < 10; i++) {
        queue1.put(i + 10000);
    }
    assertThat(queue1.size()).isEqualTo(10);
    Integer result = f.get(80, TimeUnit.SECONDS);
    assertThat(result).isEqualTo(123);
    redisson.shutdown();
    sentinel1.stop();
    sentinel2.stop();
    sentinel3.stop();
    master.stop();
    slave1.stop();
    slave2.stop();
}
Also used : RedissonClient(org.redisson.api.RedissonClient) Config(org.redisson.config.Config) RandomLoadBalancer(org.redisson.connection.balancer.RandomLoadBalancer) ExecutionException(java.util.concurrent.ExecutionException) RedisProcess(org.redisson.RedisRunner.RedisProcess) TimeoutException(java.util.concurrent.TimeoutException) Test(org.junit.jupiter.api.Test)

Example 25 with RandomLoadBalancer

use of org.redisson.connection.balancer.RandomLoadBalancer in project redisson by redisson.

the class RedissonBlockingQueueTest method testPollFromAnyInCluster.

@Test
public void testPollFromAnyInCluster() throws Exception {
    RedisRunner master1 = new RedisRunner().port(6890).randomDir().nosave();
    RedisRunner master2 = new RedisRunner().port(6891).randomDir().nosave();
    RedisRunner master3 = new RedisRunner().port(6892).randomDir().nosave();
    RedisRunner slave1 = new RedisRunner().port(6900).randomDir().nosave();
    RedisRunner slave2 = new RedisRunner().port(6901).randomDir().nosave();
    RedisRunner slave3 = new RedisRunner().port(6902).randomDir().nosave();
    ClusterRunner clusterRunner = new ClusterRunner().addNode(master1, slave1).addNode(master2, slave2).addNode(master3, slave3);
    ClusterProcesses process = clusterRunner.run();
    Thread.sleep(5000);
    Config config = new Config();
    config.useClusterServers().setLoadBalancer(new RandomLoadBalancer()).addNodeAddress(process.getNodes().stream().findAny().get().getRedisServerAddressAndPort());
    RedissonClient redisson = Redisson.create(config);
    RBlockingQueue<Integer> queue1 = redisson.getBlockingQueue("queue:pollany");
    Executors.newSingleThreadScheduledExecutor().schedule(() -> {
        RBlockingQueue<Integer> queue2 = redisson.getBlockingQueue("queue:pollany1");
        RBlockingQueue<Integer> queue3 = redisson.getBlockingQueue("queue:pollany2");
        try {
            queue3.put(2);
            queue1.put(1);
            queue2.put(3);
        } catch (InterruptedException e) {
            Assertions.fail();
        }
    }, 3, TimeUnit.SECONDS);
    Awaitility.await().between(Duration.ofSeconds(2), Duration.ofSeconds(4)).untilAsserted(() -> {
        int value = queue1.pollFromAny(4, TimeUnit.SECONDS, "queue:pollany1", "queue:pollany2");
        assertThat(value).isEqualTo(1);
    });
    redisson.shutdown();
    process.shutdown();
}
Also used : RedissonClient(org.redisson.api.RedissonClient) ClusterProcesses(org.redisson.ClusterRunner.ClusterProcesses) Config(org.redisson.config.Config) RandomLoadBalancer(org.redisson.connection.balancer.RandomLoadBalancer) Test(org.junit.jupiter.api.Test)

Aggregations

Config (org.redisson.config.Config)33 RandomLoadBalancer (org.redisson.connection.balancer.RandomLoadBalancer)33 Test (org.junit.jupiter.api.Test)24 ClusterProcesses (org.redisson.ClusterRunner.ClusterProcesses)14 RedisProcess (org.redisson.RedisRunner.RedisProcess)14 RedissonClient (org.redisson.api.RedissonClient)13 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)9 IOException (java.io.IOException)8 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)8 Assertions.assertThat (org.assertj.core.api.Assertions.assertThat)6 Awaitility.await (org.awaitility.Awaitility.await)6 StringCodec (org.redisson.client.codec.StringCodec)6 RedisClientConfig (org.redisson.client.RedisClientConfig)5 ClusterNodeInfo (org.redisson.cluster.ClusterNodeInfo)5 Serializable (java.io.Serializable)4 Duration (java.time.Duration)4 java.util (java.util)4 java.util.concurrent (java.util.concurrent)4 ExecutionException (java.util.concurrent.ExecutionException)4 TimeoutException (java.util.concurrent.TimeoutException)4