热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Redis集群的使用测试(Jedis客户端的使用)

本文参考:http:www.roncoo.comcourseviewf614343765bc4aac8597c6d8b38f06fdRedis集群的使用测试(Jedis客户端的使用

本文参考:http://www.roncoo.com/course/view/f614343765bc4aac8597c6d8b38f06fd

Redis集群的使用测试(Jedis客户端的使用)

1、Jedis客户端建议升级到最新版(当前为2.7.3),这样对3.0.x集群有比较好的支持。

https://github.com/xetorthio/jedis

http://mvnrepository.com/artifact/redis.clients/jedis

2、直接在Java代码中链接Redis集群:

//数据库链接池配置

JedisPoolConfig cOnfig=newJedisPoolConfig();

config.setMaxTotal(100);

config.setMaxIdle(50);

config.setMinIdle(20);

config.setMaxWaitMillis(6 * 1000);

config.setTestOnBorrow(true);

//Redis集群的节点集合

Set jedisClusterNodes =newHashSet();

jedisClusterNodes.add(newHostAndPort(“192.168.1.111”, 7111));

jedisClusterNodes.add(newHostAndPort(“192.168.1.112”, 7112));

jedisClusterNodes.add(newHostAndPort(“192.168.1.113”, 7113));

jedisClusterNodes.add(newHostAndPort(“192.168.1.114”, 7114));

jedisClusterNodes.add(newHostAndPort(“192.168.1.115”, 7115));

jedisClusterNodes.add(newHostAndPort(“192.168.1.116”, 7116));

//根据节点集创集群链接对象

//JedisCluster jedisCluster = newJedisCluster(jedisClusterNodes);

//节点,超时时间,最多重定向次数,链接池

JedisClusterjedisCluster=newJedisCluster(jedisClusterNodes, 2000, 100,config);

intnum = 1000;

String key =”wusc”;

String value =””;

for(inti=1; i <= num; i++){

//存数据

jedisCluster.set(key+i,&#8221;WuShuicheng&#8221;+i);

//取数据

value= jedisCluster.get(key+i);

log.info(key+i +&#8221;=&#8221;+ value);

//删除数据

//jedisCluster.del(key+i);

//value = jedisCluster.get(key+i);

//log.info(key+i + &#8220;=&#8221; + value);

}

3、Spring配置Jedis链接Redis3.0集群的配置:

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

undefinedundefined

对应的Java调用代码样例

JedisCluster jedisCluster = (JedisCluster)context.getBean(&#8220;jedisCluster&#8221;);

intnum = 1000;

String key =&#8221;wusc&#8221;;

String value =&#8221;&#8221;;

for(inti=1; i <= num; i++){

//存数据

jedisCluster.set(key+i,&#8221;WuShuicheng&#8221;+i);

//取数据

value= jedisCluster.get(key+i);

log.info(key+i +&#8221;=&#8221;+ value);

//删除数据

//jedisCluster.del(key+i);

}

Redis集群的高可用性测试

一、Redis集群特点

1、集群架构特点:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽;

(2)节点的fail是通过集群中超过半数的节点检测失效时才生效;

(3)客户端与redis节点直连,不需要中间proxy层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可;

(4)redis-cluster把所有的物理节点映射到[0-16383]个slot(哈希槽)上,cluster 负责维护

node<->slot<->value。

2、集群选举容错:

(1)节点失效选举过程是集群中所有master参与,如果半数以上master节点与当前被检测master节点通信检测超时(cluster-node-timeout),就认为当前master节点挂掉;

(2):什么时候整个集群不可用(cluster_state:fail)?

A:如果集群任意master挂掉,且当前master没有slave。集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态。 ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败;

B:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态。ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。

二、客户端集群命令

集群

cluster info:打印集群的信息

cluster nodes:列出集群当前已知的所有节点(node),以及这些节点的相关信息。

节点

cluster meet :将ip和port所指定的节点添加到集群当中,让它成为集群的一份子。

cluster forget:从集群中移除 node_id 指定的节点。

clusterreplicate :将当前节点设置为node_id指定的节点的从节点。

clustersaveconfig:将节点的配置文件保存到硬盘里面。

槽(slot)

cluster addslots [slot &#8230;]:将一个或多个槽(slot)指派(assign)给当前节点。

clusterdelslots [slot &#8230;]:移除一个或多个槽对当前节点的指派。

clusterflushslots:移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。

cluster setslot node :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。

cluster setslot migrating :将本节点的槽 slot 迁移到node_id 指定的节点中。

cluster setslot importing :从 node_id 指定的节点中导入槽slot 到本节点。

cluster setslot stable:取消对槽 slot 的导入(import)或者迁移(migrate)。

cluster keyslot:计算键 key 应该被放置在哪个槽上。

clustercountkeysinslot :返回槽 slot 目前包含的键值对数量。

clustergetkeysinslot :返回 count 个 slot 槽中的键。

三、集群高可用测试

1、重建集群,步骤:

(1)关闭集群的各节点;

(2)删除各节点数据目录下的 nodes.conf、appendonly.aof、dump.rdb;

# rm -rf appendonly.aof| rm -rf dump.rdb | rm -rf nodes.conf

(3)重新启用所有的节点

192.168.1.111

# /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7111/redis-7111.conf

192.168.1.112

# /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7112/redis-7112.conf

192.168.1.113

# /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7113/redis-7113.conf

192.168.1.114

# /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7114/redis-7114.conf

192.168.1.115

# /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7115/redis-7115.conf

192.168.1.116

# /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7116/redis-7116.conf

(4)执行集群创建命令(只需要在其中一个节点上执行一次则可)

# cd/usr/local/src/redis-3.0.3/src/

# cpredis-trib.rb /usr/local/bin/redis-trib

# redis-tribcreate &#8211;replicas 1192.168.1.114:7114 192.168.1.115:7115 192.168.1.116:7116 192.168.1.111:7111192.168.1.112:7112 192.168.1.113:7113

2、查看当前集群各节点的状态

[root@edu-redis-01 7111]# /usr/local/redis3/bin/redis-cli -c -p 7111

127.0.0.1:7111> cluster nodes

3、使用demo应用向集群写入1000个键值数据

使用 /usr/local/redis3/bin/redis-cli-c -p 711X命令登录各节点,使用 keys *查看各节点的所有key

4、运行demo应用,获取所有的键值数据

如果有空值则停止

5、模拟集群节点宕机(实现故障转移)

(1)Jedis客户端循环操作集群数据(模拟用户持续使用系统)

(2)查看Redis集群当前状态(用于接下来做节点状态变化对比)

《Redis集群的使用测试(Jedis客户端的使用)》

(3)关闭其中一个master节点(7111)

(4)观察该master节点和对应的slave节点的状态变化

《Redis集群的使用测试(Jedis客户端的使用)》

节点状态 fail? 表示正在判断是否失败

节点状态 fail 表示节点失败,对应的slave节点提升为master

(5)再查看集群状态变化# /usr/local/src/redis-3.0.3/src/redis-trib.rbcheck 192.168.1.116:7116

《Redis集群的使用测试(Jedis客户端的使用)》

由上可见,7114节点替换7111,由slave变成了master

此时再执行demo应用获取所有的键值数据,依然正常,说明slave替换master成功,集群正常。

6、恢复fail节点

(1)启动7111

# /usr/local/redis3/bin/redis-server/usr/local/redis3/cluster/7111/redis-7111.conf

(2)查看集群状态

《Redis集群的使用测试(Jedis客户端的使用)》

其中7111变成 7114的slave

7、观察集群节点切换过程中,对客户端的影响

JedisCluster链接Redis集群操作时遇到的几个常见异常:

(1)重定向次数过多

redis.clients.jedis.exceptions.JedisClusterMaxRedirectionsException:Too many Cluster redirections?

解决方法: 初始化JedisCluster时,设定JedisCluster的maxRedirections

//集群各节点集合,超时时间(默认2秒),最多重定向次数(默认5),链接池

newJedisCluster(jedisClusterNodes, 2000, 100,config);

(2)集群不可以用

redis.clients.jedis.exceptions.JedisClusterException:CLUSTERDOWN The cluster is down

原因:集群节点状态切换过程中会出现临时闪断,客户端重试操作则可。

(3)链接超时

redis.clients.jedis.exceptions.JedisConnectionException:java.net.SocketTimeoutException: Read timed out

解决方法: 初始化JedisCluster时,设定JedisCluster的timeout(默认为两秒);也可以修改源码中的默认时间。

7、总结:

优点:

在master节点下线后,slave节点会自动提升为master节点,保存集群持续提供服务;

fail节点恢复后,会自动添加到集群中,变成slave节点;

缺点:

由于redis的复制使用异步机制,在自动故障转移的过程中,集群可能会丢失写命令。然而 redis 几乎是同时执行(将命令恢复发送给客户端,以及将命令复制到slave节点)这两个操作,所以实际中,命令丢失的窗口非常小。


推荐阅读
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
author-avatar
手机用户2502869883
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有