第九课时作业

静哥

by 2016.4.18~2016.4.25

1、节点

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

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

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

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

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

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

(4)查看当前集群状态

个节点都没有在处理任何槽,所以集群处于下线状态(fail)

2、槽指派

(1)概念—槽指派:

redis集群是通过分片方式来存储键值的,集群默认将整个redis数据库分成16384个槽(slot)(index从0到16383),集群里的每个节点可以处理最少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条数据,如下:

号库,单机redis则可以用select命令选择不同的数据库;

3、重新分片

(1)概念:

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

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

(2)重新分片:

案例:当前,10.7.12.98:8379节点上处理的槽位是0~10000;10.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();

}

});

}

}

第九课——redis集群的更多相关文章

  1. redis集群的搭建详细教程

    1 Redis-cluster架构图             redis-cluster投票:容错  (至少要三个才可以,才能超过半数) 架构细节: (1)所有的redis节点彼此互联(PING-PO ...

  2. 快速搭建redis单机版和redis集群版

    单机版 第一步:需要安装redis所需的C语言环境,若虚拟机联网,则执行 yum install gcc-c++ 第二步:redis的源码包上传到linux系统 第三步:解压缩redis   tar ...

  3. Redis集群的离线安装以及原理理解

    一.本文主要是记录一下Redis集群在linux系统下离线的安装步骤,毕竟在生产环境下一般都是无法联网的,Redis的集群的Ruby环境安装过程还是很麻烦的,涉及到很多的依赖的安装,所以写了一个文章来 ...

  4. 6.Redis集群

    redis-cluster[集群]架构图 redis-cluster投票:容错 搭建Ruby环境 集群的搭建过程 连接集群 查看集群的命令 1.1 redis-cluster[集群]架构图 架构细节: ...

  5. Redis集群案例与场景分析

    1.背景 Redis的出现确实大大地提高系统大并发能力支撑的可能性,转眼间Redis的最新版本已经是3.X版本了,但我们的系统依然继续跑着2.8,并很好地支撑着我们当前每天5亿访问量的应用系统.想当年 ...

  6. Java Spring mvc 操作 Redis 及 Redis 集群

    本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...

  7. Redis集群搭建与简单使用

    介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. 两台虚拟机都是 CentOS ,一台 ...

  8. window下使用Redis Cluster部署Redis集群

    日常的项目很多时候都需要用到缓存.redis算是一个比较好的选择.一般情况下做一个主从就可以满足一些比较小的项目需要.在一些并发量比较大的项目可能就需要用到集群了,redis在Windows下做集群可 ...

  9. Redis集群~windows下搭建Sentinel环境及它对主从模式的实际意义

    回到目录 关于redis-sentinel出现的原因 Redis集群的主从模式有个最大的弊端,就是当主master挂了之前,它的slave从服务器无法提升为主,而在redis-sentinel出现之后 ...

随机推荐

  1. atitit.软件gui按钮and面板---os区-----软链接,快捷方式

    atitit.软件gui按钮and面板---os区-----软链接,快捷方式 1. 硬链接 1 2. 二.软链接(符号链接)LN 1 3. 三.删除链接 2 4. 区别 2 5. 参考 3 1. 硬链 ...

  2. vim列编辑模式快捷键

    vi/vim编辑器 多行行首插入   1 在多行行首插入,在nomal模式下按下ctrl+v,然后进行选择(如果想要选择至文件结尾,则再按G) 2 选择好以后按大写的I,则光标会自动跳转到所选择行的第 ...

  3. 【Android】13.2 使用自定义的CursorAdapter访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 SQliteDemo1的例子演示了SimpleCursorAdapter的用法,本节我们将使用用途更广的自定义的游 ...

  4. yii2 beta版 执行流程

    yii2 beta版 执行流程 自动加载 1.composer的自动加载 //composer的加载实现了四种方式,可以看看 require(__DIR__ . '/../../vendor/auto ...

  5. 深入剖析 linux GCC 4.4 的 STL string

    转自: 深入剖析 linux GCC 4.4 的 STL string 本文通过研究STL源码来剖析C++中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Wri ...

  6. 整合quickx到普通cocos2dx

    quickx是对cocos2dx的lua扩展,它做了一些C++的扩展,同时还在lua做了一些封装, 让用lua开发cocos2dx更快,中文站http://quick.cocoachina.com/. ...

  7. PHP——动态随机数

    取1-13随机数 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  8. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  9. Spring Framework 官方文档学习(三)之Resource

    起因 标准JDK中使用 java.net.URL 来处理资源,但有很多不足,例如不能限定classpath,不能限定 ServletContext 路径. 所以,Spring提供了 Resource ...

  10. List接口的实现类与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比较多

    List接口的实现类(Vector)(与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比较多.) 结论:在考虑并发的情况下用Vector(保证线程的安全). 在不考虑并发的 ...