zoukankan      html  css  js  c++  java
  • 第九课——redis集群

    第九课时作业

    静哥

    by 2016.4.18~2016.4.25

    1、节点

    1)节点概念:一个节点就是redis集群里的一台redis服务器。一个redis集群是由多个节点(node)组成,最初每个节点是相互独立的,可以理解成都处于一个只包含自己的集群当中,要组建一个真正可用的集群环境,必须将各个独立的节点连接起来。

    2)将一个redis服务器以集群模式启动:

    Redis服务器在启动时会根据cluster-enabled参数选项来决定是否开启集群模式;

    3)节点之间相互连接成一个集群:

    按照(2)中以集群模式分别启动3redis服务器,分别占用端口6379 73798379。如下:

    客户端连接其中一个节点(例如6379端口所在redis服务器),执行cluster meet命令来完成连接各个节点的工作

     

    4)查看当前集群状态

    因为虽然指定了8379  73792个节点,但是这2个节点都没有在处理任何槽,所以集群处于下线状态(fail

    2、槽指派

    1)概念—槽指派:

    redis集群是通过分片方式来存储键值的,集群默认将整个redis数据库分成16384个槽(slot(index016383),集群里的每个节点可以处理最少0个,最多16384个槽,每个节点处理槽的情况,就需要做槽指派;

    需要注意,16384个槽,但凡有一个槽没被指派到,整个集群就处在fail状态;即只有16384个槽全部被指派完,集群才处于上线状态(cluter_state:ok

    2)槽指派的实现:

    16384个槽位必须全部分配完,不同节点不能重复,目前没有按照区间进行分配的命令,只能通过shell脚本:

    for i in {0..10000}; do redis-cli -p 8379 cluster addslots $i; done

     

    将槽0…10000指派给10.7.12.98:8379;将槽10001…16383指派给10.7.12.98:7379

    通过脚本来实现槽指派:

    查看节点上槽分配信息:

    集群是上线状态了;

    或者:

    3)插入数据进行测试:

    当节点发现键所在的槽并非由自己负责处理时,节点会向客户端返回一个MOVED错误,指引客户端转向至正在负责槽的节点,MOVED错误格式是:

    MOVED <slot> <ip>:<port>

    Redis-cli命令不带-c参数,表示单点客户端模式,单点客户端模式下,客户端会打印MOVED错误,不会字自动进行节点转向;

    下图,带上-c参数,表示集群模式的redis-cli客户端,在接收到MOVEDc错误时,不会打印MOVED错误,而是根据MOVED错误自动进行节点转向,并打印转向信息;

    一共插入10条数据,如下:

    值得注意的是:节点和单机服务器在数据库方面的一个区别是:节点只能使用0号库,单机redis则可以用select命令选择不同的数据库;

     

    3、重新分片

    1)概念:

    Redis集群的重新分片,可以将任意数量已经指派给某个节点的槽改为指派给另一个节点,且相关槽所属的键值也会从源节点被移动给目标节点;

    重新分片可以在线(online)进行,重新分片过程中,集群不需要下线,且源节点和目标节点可以继续处理命令请求。

    2)重新分片:

    案例:当前,10.7.12.98:8379节点上处理的槽位是0~1000010.7.12.98:7379节点处理的槽位是10001~16383

    现做重新分片:新增10.7.12.98:6379节点到当前集群,并且将8379节点的槽位重新指派给6379节点,重新指派5000个槽位;

    现将6379节点添加到当前集群里

    以下是槽位重新指派,要用到redis集群管理软件redis-trib.rb

     

    publicclass ListTypeTests extends ClusterBaseTests {

     

        @Test

        publicvoid testLSetGet() {

            // 测试新增和获取

            doTest(new Executor() {

                @Override

                publicvoid execute(ShardedJedis jedis) {

                    String key = "testLset";

                    jedis.lpush(key"test0""test1");

                    jedis.rpush(key"test2");

                    MatcherAssert.assertThat(jedis.lrange(key, 0, -1), Matchers.contains("test1""test0""test2"));

                }

            });

        }

       

        @Test

        publicvoid testAddByIndex() {

            doTest(new Executor() {

                @Override

                publicvoid execute(ShardedJedis jedis) {

                    jedis.lpush("testAddByIndex""value1");

                    jedis.lpush("testAddByIndex""value2");

                    jedis.rpush("testAddByIndex""value3");

                    MatcherAssert.assertThat(jedis.lrange("testAddByIndex", 0, -1), Matchers.contains("value2""value1""value3"));

                }

            });

        }

     

        @Test

        publicvoid testLength() {

            doTest(new Executor() {

                @Override

                publicvoid execute(ShardedJedis jedis) {

                    for(inti = 0; i < 10; i++) {

                        jedis.rpush("testLength"i + "");

                    }

                   

                    assertThat(jedis.llen("testLength")).isEqualTo(10);

                    assertThat(jedis.lindex("testLength", 2)).isEqualTo("2");

                }

            });

        }

     

     

    publicclass SetTypeTests extends ClusterBaseTests {

     

        @Test

        publicvoid testSetGet() {

            doTest(new Executor() {

                @Override

                publicvoid execute(ShardedJedis jedis) {

                    jedis.sadd("testSet""value1""value2""value3");

                   

                    MatcherAssert.assertThat(jedis.smembers("testSet"), Matchers.containsInAnyOrder("value1""value2""value3"));

                }

            });

        }

       

        @Test

        publicvoid testIsMember() {

            doTest(new Executor() {

                @Override

                publicvoid execute(ShardedJedis jedis) {

                    jedis.sadd("testIsMember""value1""value2""value3""value1");

                   

                    assertThat(jedis.sismember("testIsMember""value2")).isTrue();

                }

            });

        }

       

    }

     





  • 相关阅读:
    LateX安装记录
    阅读《基于区块链技术的溯源系统 》总结(硕士论文)
    阅读《轻量级比特币交易溯源机制》总结
    论文复现实践
    20199316 2019-2020-2 《网络攻防实践》第12周作业
    20199316 2019-2020-2 《网络攻防实践》第十一周作业
    网络空间安全学习笔记
    20199316 2019-2020-2 《网络攻防实践》第10周作业
    20199316 2019-2020-2 《网络攻防实践》第9周作业
    20199316 2019-2020-2 《网络攻防实践》第8周作业
  • 原文地址:https://www.cnblogs.com/cjing2011/p/a08e65d8aa6441fea7c5af2937afe214.html
Copyright © 2011-2022 走看看