Redis高可用-Cluster-测试

本文详细介绍了 Redis 集群的高可用测试流程,包括关闭节点、删除多余文件、启动所有节点、重启集群以及登录检查节点状态。通过模拟用户使用 Redis 的过程,展示了集群在故障转移时的表现,以及如何通过 JedisCluster 库实现集群的读写操作。同时,文章还讨论了在集群中可能出现的常见错误及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



I.高可用测试



II.关闭所有节点

ps -ef|grep redis 
kill -9 888
 

II.删除

cd /usr/local/redis3/cluster/7111/
-rw-r--r--. 1 root root 352415 3月  29 11:42 appendonly.aof
-rw-r--r--. 1 root root   7008 3月  29 11:46 dump.rdb
-rw-r--r--. 1 root root    750 3月  29 10:53 nodes.conf
cd /usr/local/redis3/cluster/7112/
cd /usr/local/redis3/cluster/7113/
cd /usr/local/redis3/cluster/7114/
cd /usr/local/redis3/cluster/7115/
cd /usr/local/redis3/cluster/7116/


保留redis-7111.conf
#删除redis*之外的所有文件
rm -f !(redis*) 


II.启动所有节点

/usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7111/redis-7111.conf 
/usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7112/redis-7112.conf 
/usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7113/redis-7113.conf 
/usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7114/redis-7114.conf 
/usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7115/redis-7115.conf 
/usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7116/redis-7116.conf 
 检查启动
ps -ef|grep redis 


II.重启启动集群

# cd /usr/local/src/redis-3.0.3/src/ 
# cp redis-trib.rb /usr/local/bin/redis-trib 
/usr/local/bin/redis-trib  create  --replicas  1 10.1.125.152:7111 10.1.125.89:7112 10.1.125.212:7113 10.1.125.203:7114 10.1.125.129:7115 10.1.125.180:7116


II.登录slave5 

-登录集群必须加-c 
[root@localhost 7116]# /usr/local/redis3/bin/redis-cli -c -p 7116
127.0.0.1:7116> set name dingsai
-> Redirected to slot [5798] located at 10.1.125.89:7112
OK
10.1.125.89:7112> get name
"dingsai"


II.登录master

/usr/local/redis3/bin/redis-cli -c -p 7111
127.0.0.1:7112> get name
"dingsai"


II.检查节点

在任意节点上执行
[root@localhost local]# /usr/local/bin/redis-trib check 10.1.125.152:7111
Connecting to node 10.1.125.152:7111: OK
Connecting to node 10.1.125.212:7113: OK
Connecting to node 10.1.125.180:7116: OK
Connecting to node 10.1.125.203:7114: OK
Connecting to node 10.1.125.129:7115: OK
Connecting to node 10.1.125.89:7112: OK
>>> Performing Cluster Check (using node 10.1.125.152:7111)
M: adaebf848247181fba9d50886a8712bf2a38a9d1 10.1.125.152:7111
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: e3c9199d23ce76c2df3d6ddb0fa5145364f0bb18 10.1.125.212:7113
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: a6e06d51f4f99ce1adc306dc62da84aa3dc95f7a 10.1.125.180:7116
   slots: (0 slots) slave
   replicates e3c9199d23ce76c2df3d6ddb0fa5145364f0bb18
S: 510a0b83d2b39b43ecf893a27c2c3bbf1a431399 10.1.125.203:7114
   slots: (0 slots) slave
   replicates adaebf848247181fba9d50886a8712bf2a38a9d1
S: e6d20715e56350fb690c609d5fc68a7a166b4fea 10.1.125.129:7115
   slots: (0 slots) slave
   replicates 4ac21be2d805505cbedee871161cf856607a29f0
M: 4ac21be2d805505cbedee871161cf856607a29f0 10.1.125.89:7112
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.






II.模拟用户使用redis

 
package com.ding.study.redis;

import java.util.HashSet;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 
 * @author daniel
 * @email 576699909@qq.com
 * @time 2016-3-29 下午3:41:31
 */
public class RedisClusterFailoverTest {
	private static final Log log = LogFactory.getLog(RedisClusterFailoverTest.class);

	public static void main(String[] args) {
		
		// 数据库链接池配置
		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("10.1.125.152", 7111));
		jedisClusterNodes.add(new HostAndPort("10.1.125.89", 7112));
		jedisClusterNodes.add(new HostAndPort("10.1.125.212", 7113));
		jedisClusterNodes.add(new HostAndPort("10.1.125.203", 7114));
		jedisClusterNodes.add(new HostAndPort("10.1.125.129", 7115));
		jedisClusterNodes.add(new HostAndPort("10.1.125.180", 7116));
		
		try {
			
			// 根据节点集创集群链接对象
			//JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes);
			// 集群各节点集合,超时时间,最多重定向次数,链接池
			JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, 5000, 100, config);
			int num = 1000;
			String key = "dingsai";
			String value = "";
			int count = 1;

			while(true){
				for (int i=1; i <= num; i++){
					try {
						// 存数据
				      jedisCluster.set(key+i, "Value"+i); 
						
						// 取数据
						 value = jedisCluster.get(key+i); 
						log.info(key+i + "=" + value);
						if (value == null || "".equals(value)){
							log.error("===>break" + key+i + " value is null");
							break;
						}
					} catch (Exception e) {
						log.error("====>", e);
						Thread.sleep(3000);
						continue;
					}
					// 删除数据
					//jedisCluster.del(key+i); 
					//value = jedisCluster.get(key+i); 
					//log.info(key+i + "=" + value);
				}
				log.info("===================================>count:" + count);
				if (value == null || "".equals(value)){
					break;
				}
				count++;
				Thread.sleep(1000);
			}
		} catch (Exception e) {
			log.error("====>", e);
		}
		
	}
}


 






II.关闭master节点10.1.125.212

[root@localhost local]# ps -ef|grep redis
root     37230     1  3 14:45 ?        00:00:43 /usr/local/redis3/bin/redis-server *:7113 [cluster]
root     38794 22391  0 15:07 pts/2    00:00:00 grep --color=auto redis
[root@localhost local]# kill -9 37230
客户端很大的延迟,等了好几秒才进行操作




II.再次查看集群状态

127.0.0.1:7116> cluster nodes
a6e06d51f4f99ce1adc306dc62da84aa3dc95f7a 10.1.125.180:7116 myself,master - 0 0 7 connected 10923-16383
4ac21be2d805505cbedee871161cf856607a29f0 10.1.125.89:7112 master - 0 1459235330419 2 connected 5461-10922
adaebf848247181fba9d50886a8712bf2a38a9d1 10.1.125.152:7111 master - 0 1459235328412 1 connected 0-5460
e6d20715e56350fb690c609d5fc68a7a166b4fea 10.1.125.129:7115 slave 4ac21be2d805505cbedee871161cf856607a29f0 0 1459235329416 5 connected
e3c9199d23ce76c2df3d6ddb0fa5145364f0bb18 10.1.125.212:7113 master,fail - 1459235250356 1459235244712 3 disconnected
510a0b83d2b39b43ecf893a27c2c3bbf1a431399 10.1.125.203:7114 slave adaebf848247181fba9d50886a8712bf2a38a9d1 0 1459235327407 4 connected
127.0.0.1:7116> 


[root@localhost local]# /usr/local/bin/redis-trib check 10.1.125.152:7111
Connecting to node 10.1.125.152:7111: OK
Connecting to node 10.1.125.180:7116: OK
Connecting to node 10.1.125.203:7114: OK
Connecting to node 10.1.125.129:7115: OK
Connecting to node 10.1.125.89:7112: OK
>>> Performing Cluster Check (using node 10.1.125.152:7111)
M: adaebf848247181fba9d50886a8712bf2a38a9d1 10.1.125.152:7111
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: a6e06d51f4f99ce1adc306dc62da84aa3dc95f7a 10.1.125.180:7116
   slots:10923-16383 (5461 slots) master
   0 additional replica(s)
S: 510a0b83d2b39b43ecf893a27c2c3bbf1a431399 10.1.125.203:7114
   slots: (0 slots) slave
   replicates adaebf848247181fba9d50886a8712bf2a38a9d1
S: e6d20715e56350fb690c609d5fc68a7a166b4fea 10.1.125.129:7115
   slots: (0 slots) slave
   replicates 4ac21be2d805505cbedee871161cf856607a29f0
M: 4ac21be2d805505cbedee871161cf856607a29f0 10.1.125.89:7112
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.




II.启动master3(slave2)节点

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


 

II.再次查看集群状态

[root@localhost local]# /usr/local/bin/redis-trib check 10.1.125.152:7111
Connecting to node 10.1.125.152:7111: OK
Connecting to node 10.1.125.212:7113: OK
Connecting to node 10.1.125.180:7116: OK
Connecting to node 10.1.125.203:7114: OK
Connecting to node 10.1.125.129:7115: OK
Connecting to node 10.1.125.89:7112: OK
>>> Performing Cluster Check (using node 10.1.125.152:7111)
M: adaebf848247181fba9d50886a8712bf2a38a9d1 10.1.125.152:7111
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: e3c9199d23ce76c2df3d6ddb0fa5145364f0bb18 10.1.125.212:7113
   slots: (0 slots) slave
   replicates a6e06d51f4f99ce1adc306dc62da84aa3dc95f7a
M: a6e06d51f4f99ce1adc306dc62da84aa3dc95f7a 10.1.125.180:7116
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 510a0b83d2b39b43ecf893a27c2c3bbf1a431399 10.1.125.203:7114
   slots: (0 slots) slave
   replicates adaebf848247181fba9d50886a8712bf2a38a9d1
S: e6d20715e56350fb690c609d5fc68a7a166b4fea 10.1.125.129:7115
   slots: (0 slots) slave
   replicates 4ac21be2d805505cbedee871161cf856607a29f0
M: 4ac21be2d805505cbedee871161cf856607a29f0 10.1.125.89:7112
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


127.0.0.1:7116> cluster nodes
a6e06d51f4f99ce1adc306dc62da84aa3dc95f7a 10.1.125.180:7116 myself,master - 0 0 7 connected 10923-16383
4ac21be2d805505cbedee871161cf856607a29f0 10.1.125.89:7112 master - 0 1459235640927 2 connected 5461-10922
adaebf848247181fba9d50886a8712bf2a38a9d1 10.1.125.152:7111 master - 0 1459235643946 1 connected 0-5460
e6d20715e56350fb690c609d5fc68a7a166b4fea 10.1.125.129:7115 slave 4ac21be2d805505cbedee871161cf856607a29f0 0 1459235641934 5 connected
e3c9199d23ce76c2df3d6ddb0fa5145364f0bb18 10.1.125.212:7113 slave a6e06d51f4f99ce1adc306dc62da84aa3dc95f7a 0 1459235642943 7 connected
510a0b83d2b39b43ecf893a27c2c3bbf1a431399 10.1.125.203:7114 slave adaebf848247181fba9d50886a8712bf2a38a9d1 0 1459235636891 4 connected




 



I.JedisCluster 常见错误



II.重定向次数过多默认5次
redis.clients.jedis.exceptions.JedisClusterMaxRedirectionsException: Too many Cluster redirections  
默认超时2s,重定向5次 初始化JedisCluster 配置maxRedirections 
 // 集群各节点集合,超时时间,最多重定向次数,链接池
 JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, 5000, 100, config);


II.集群不可用,高可用切换的时候可能报错.
redis.clients.jedis.exceptions.JedisClusterException: CLUSTERDOWN The cluster is down 
 重试即可
 
II.超时 
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out 

修改超时时间










<think>嗯,用户想了解redis-cluster的创建命令和参数含义,特别是redis-cli --cluster create和cluster-replicas。我需要先回忆一下Redis Cluster的相关知识。记得Redis Cluster是通过分片来实现数据分布的,每个节点负责一部分哈希槽。创建集群的时候需要指定主节点,然后如果有副本的话,每个主节点会有对应的从节点。 首先,redis-cli --cluster create这个命令是用来创建集群的,后面跟着节点列表,然后是参数比如--cluster-replicas。根据引用[2],例子中用了--cluster-replicas 0,也就是没有副本。那如果这个参数是1的话,每个主节点应该有一个副本。比如节点数目是6个,如果replicas是1,那么主节点数目应该是3,剩下的3个作为副本分配到各个主节点下。 接下来,参数的具体含义需要解释清楚。--cluster-replicas后面的数字指的是每个主节点需要的副本数量。比如,当设置为1时,系统会自动为每个主节点分配一个从节点。这时候总的节点数应该是主节点数乘以(1+副本数)。比如主节点3个,每个有一个副本,总共有6个节点。 然后,用户可能需要知道命令的具体格式和每个参数的作用。比如节点列表的顺序是否重要,是否需要先列主节点还是可以混在一起。根据Redis的文档,节点列表中的前N个会被视为主节点,其中N是总节点数/(replicas+1)。比如总节点6,replicas=1,那么主节点是6/(1+1)=3,剩下的3个作为副本。 另外,需要注意用户可能遇到的常见问题,比如节点数目不符合要求时的错误提示。比如如果总节点数不满足主节点数*(replicas+1),就会报错。比如总节点5,replicas=1,这时候主节点数应该是5/2=2.5,这显然不行,所以会失败。 然后,引用中的例子,比如引用[3]里测试集群的时候用了set和get命令,说明集群正常工作。而引用[1]和[2]中的命令可能涉及其他操作,比如导入数据或者替换节点,但用户现在的问题主要是创建命令,所以重点在create的参数。 最后,用户可能需要了解一些实际例子,比如不同的副本数如何影响集群结构。比如当replicas=1时,每个主节点有一个副本,而如果设置为0,就没有副本,所有节点都是主节点,数据分片但无冗余。需要解释清楚这些区别,以及在实际应用中的选择依据,比如高可用性需要至少1个副本。 总结下来,回答的结构应该是先介绍命令的基本格式,然后详细说明每个参数,特别是cluster-replicas,再给出示例,最后解答常见问题。同时,结合引用中的例子来支持解释,比如引用[2]中的例子展示了如何创建没有副本的集群,而用户可能需要更多有副本的情况的例子。</think>### Redis Cluster创建命令详解 #### 命令基本格式: ```bash redis-cli --cluster create <节点列表> --cluster-replicas <副本数> ``` 例如: ```bash redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1 ``` #### 参数解析: 1. **节点列表** 需要包含所有主节点和从节点的IP:Port信息。总节点数需满足公式: $$ \text{总节点数} = \text{主节点数} \times (1 + \text{副本数}) $$ 例如:`--cluster-replicas 1`时,总节点数需为偶数(如6节点包含3主3从)。 2. **--cluster-replicas** - **作用**:定义每个主节点的副本数量,用于数据冗余和高可用- **示例**: - `--cluster-replicas 0`:无副本,所有节点均为主节点(如引用[2]中的示例)[^2]。 - `--cluster-replicas 1`:每个主节点分配1个从节点,形成主从结构。 #### 参数验证逻辑: - 若节点数不符合公式,命令会直接报错(如5节点 + `--cluster-replicas 1`)。 - 节点列表顺序影响主从分配:前$N$个节点默认被选为主节点,$N = \frac{\text{总节点数}}{1+\text{副本数}}$。 #### 工作流程: 1. 自动分配哈希槽(16384个槽均分给主节点)。 2. 建立主从关系(若副本数>0)。 3. 输出集群拓扑结构(如`[OK] All nodes agree about slots configuration`表示成功)[^3]。 --- ### 常见问题解答 #### 1. 为什么需要指定副本数? 副本数决定了数据冗余级别。例如: - `--cluster-replicas 1`:主节点故障时,从节点自动接管,保障高可用[^3]。 - `--cluster-replicas 0`:无冗余,适用于纯性能扩展场景。 #### 2. 节点列表顺序是否重要? 是。前$N$个节点会被优先设为主节点,后续节点作为从节点。例如: 6节点 + `--cluster-replicas 1` → 前3个为主节点,后3个为从节点。 #### 3. 如何验证集群状态? 执行以下命令检查槽分配和主从关系: ```bash redis-cli --cluster check <任意节点IP:Port> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dingsai88

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值