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

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 = new JedisPoolConfig();

config.setMaxTotal(100);

config.setMaxIdle(50);

config.setMinIdle(20);

config.setMaxWaitMillis(6 * 1000);

config.setTestOnBorrow(true);

// Redis集群的节点集合

Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();

jedisClusterNodes.add(new HostAndPort("192.168.1.111", 7111));

jedisClusterNodes.add(new HostAndPort("192.168.1.112", 7112));

jedisClusterNodes.add(new HostAndPort("192.168.1.113", 7113));

jedisClusterNodes.add(new HostAndPort("192.168.1.114", 7114));

jedisClusterNodes.add(new HostAndPort("192.168.1.115", 7115));

jedisClusterNodes.add(new HostAndPort("192.168.1.116", 7116));

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

//JedisCluster jedisCluster = newJedisCluster(jedisClusterNodes);

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

JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, 2000, 100,config);

int num = 1000;

String key = "wusc";

String value = "";

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

// 存数据

jedisCluster.set(key+i,"WuShuicheng"+i);

// 取数据

value= jedisCluster.get(key+i);

log.info(key+i + "=" + value);

// 删除数据

//jedisCluster.del(key+i);

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

//log.info(key+i + "=" + value);

}

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

<!-- Jedis链接池配置,注意:Jedis版本建议升级到最新(当前最新版为2.7.2) -->

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">

<property name="maxTotal" value="100"/>

<property name="maxIdle" value="20"/>

<property name="minIdle" value="10"/>

<property name="blockWhenExhausted" value="true"></property>

<property name="maxWaitMillis" value="3000" />

<property name="testOnBorrow" value="false" />

<property name="testOnReturn" value="false" />

<property name="testWhileIdle" value="true" />

<property name="minEvictableIdleTimeMillis" value="60000" />

<property name="timeBetweenEvictionRunsMillis" value="30000" />

<property name="numTestsPerEvictionRun" value="-1" />

</bean>

<!-- JedisCluster -->

<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">

<constructor-arg index="0">

<set>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg index="0" value="192.168.1.111"/>

<constructor-arg index="1" value="7111"type="int" />

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg index="0" value="192.168.1.112"/>

<constructor-arg index="1" value="7112"type="int" />

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg index="0" value="192.168.1.113"/>

<constructor-arg index="1" value="7113"type="int" />

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg index="0" value="192.168.1.114"/>

<constructor-arg index="1" value="7114"type="int" />

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg index="0" value="192.168.1.115"/>

<constructor-arg index="1" value="7115"type="int" />

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg index="0" value="192.168.1.116"/>

<constructor-arg index="1" value="7116"type="int" />

</bean>

</set>

</constructor-arg>

<constructor-arg index="1" value="2000"type="int"></constructor-arg>

<constructor-arg index="2"value="100" type="int"></constructor-arg>

<constructor-arg index="3" ref="jedisPoolConfig"></constructor-arg>

</bean>

对应的Java调用代码样例

JedisCluster jedisCluster = (JedisCluster)context.getBean("jedisCluster");

int num = 1000;

String key = "wusc";

String value = "";

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

// 存数据

jedisCluster.set(key+i,"WuShuicheng"+i);

// 取数据

value= jedisCluster.get(key+i);

log.info(key+i + "=" + 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> :将ip和port所指定的节点添加到集群当中,让它成为集群的一份子。

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

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

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

槽(slot)

cluster addslots<slot> [slot ...]:将一个或多个槽(slot)指派(assign)给当前节点。

clusterdelslots <slot> [slot ...]:移除一个或多个槽对当前节点的指派。

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

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

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

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

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

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

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

clustergetkeysinslot <slot> <count>:返回 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 --replicas 1192.168.1.114:7114 192.168.1.115:7115 192.168.1.116:7116 192.168.1.111:7111 192.168.1.112:7112 192.168.1.113:7113

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

[[email protected] 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集群当前状态(用于接下来做节点状态变化对比)

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

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

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

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

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

由上可见,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)查看集群状态

其中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节点)这两个操作,所以实际中,命令丢失的窗口非常小。

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

时间: 2024-10-07 08:24:47

Redis集群的高可用测试(含Jedis客户端的使用)的相关文章

Redis集群与高可用

Redis集群 redis cluster 是redis官方提供的分布式解决方案,在3.0版本后推出的,有效地解决了redis分布式的需求,当一个redis节点挂了可以快速的切换到另一个节点.当遇到单机内存.并发等瓶颈时,可以采用分布式方案要解决问题. 分布式redis数据库 1.分区和槽slot redis cluster中有一个16384(2^4 * 2^10)长度的槽的概念.通过哈希算法再加上取模运算可以将一个值固定地映射到某个区间,区间由连续的slot组成. redis cluster采

Redis集群服务器-高可用调研随笔[转]

今天改了一天的Bug,本想下午开始专研Redis命令集,结果也泡汤了.只能在下班的路上考虑下Redis集群服务器的高可用方案.随笔而已,尚未成型,仅作记录. 当然,我说的可能比较片面,欢迎拍砖.斧正. 一.Redis与MySQL对比 相同点: Master-Slave架构,集群架构下无法很好的完成数据拷贝,确保数据一致性. 支持数据文件持久化存储,但数据文件过大时,宕机重启可能存在安全隐患. 不同点: Redis时效性能远比MySQL要高得多,支持复杂的数据类型,基本上都是内存操作,效率远胜于M

Redis 哨兵集群实现高可用

哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis master 和 slave 进程是否正常工作. 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员. 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上. 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址. 哨兵用于实现 redis 集群的高可用,本身

11.Redis 哨兵集群实现高可用

作者:中华石杉 Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis master 和 slave 进程是否正常工作. 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员. 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上. 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址

浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)

1.熟悉几个组件 1.1.apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 全Socket层(SSL)等等,目前互联网主要使用它做静态资源服务器,也可以做代理服务器转发请求(如:图片链等),结合tomcat等 servlet容器处理jsp.1.2.ngnix     —— 俄罗斯人开发的一个高性能的 HTTP和反向代理服务器.由于Nginx 超越 Apache 的高性能和稳

keepalived实现LVS集群的高可用(1)

HA集群:高可用集群: 实现方式:vrrp协议和ais完备HA集群 vrrp可以由keepalived实现 ais可以由heartbeat和corosync vrrp协议:虚拟冗余路由协议 VRRP为虚拟路由冗余协议,目的就是为了解决静态路由单点故障问题.在一个VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台的物理的机器并不能同时工作,而是由一台称为MASTER的负责路由工作,其它的都是BACKUP,MASTER并非一成不变,VRRP让每个VRRP路由器参与竞选,最终获胜的就是MAS

RabbitMQ 集群与高可用配置

RabbitMQ 集群与高可用配置 集群概述 通过 Erlang 的分布式特性(通过 magic cookie 认证节点)进行 RabbitMQ 集群,各 RabbitMQ 服务为对等节点,即每个节点都提供服务给客户端连接,进行消息发送与接收. 这些节点通过 RabbitMQ HA 队列(镜像队列)进行消息队列结构复制.本方案中搭建 3 个节点,并且都是磁盘节点(所有节点状态保持一致,节点完全对等),只要有任何一个节点能够工作,RabbitMQ 集群对外就能提供服务. 环境 · CentOS 6

java架构师大型分布式综合项目实战,高并发,集群,高可用,程序设计,性能优化,架构设计,负载均衡,大数据量

* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat

keepalived实现WEB服务集群的高可用负载均衡

要求:利用keepalived实现WEB服务集群的高可用负载均衡,即在lvs_dr模型中扮演director的角色,对来自用户的请求按照一定的算法分配至后端服务器中:且keepalived服务器可实现高可用. keepalived是vrrp协议的一种实现,专门为lvs设计,以实现对lvs高可用就集群中的dirctor进行冗余以及对realserver进行健康检测.当一台主机(MASTER)出现问题后,keepalived能够将VIP自动的分配到备用的主机上(BACKUP),从而实现了自身(dir