版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
- Redis集群 安装、命令、API
- window 安装 redis
- java Jedis api:redis集群api JedisCluster、redis连接池api JedisPool
-
-
redis报错信息:CLUSTERDOWN Hash slot not served 和 Not all 16384 slots are covered by node
1.执行命令:
cd /home/data/redis/bin
redis-cli -p 2311 -c
127.0.0.1:2311> get ng
报错:(error) CLUSTERDOWN Hash slot not served
(错误)clusterdown哈希槽未提供
执行命令:cd /home/data/redis/bin
redis-cli --cluster check IP:2311 或 redis-trib.rb check 127.0.0.1:2311
报错:[ERR] Not all 16384 slots are covered by nodes.
[错误]并非所有16384插槽都由节点覆盖
2.解决:
1.在修复之前,先使用redis-server命令启动所有的redis实例
2.如果是使用redis-cli来搭建Redis集群的话,请使用如下修复命令。
/home/data/redis/bin/redis-cli --cluster fix 127.0.0.1:2311
/home/data/redis/bin/redis-cli --cluster fix 127.0.0.1:2312
3.如果是使用redis-trib.rb来搭建Redis集群的话,请使用如下修复命令
/home/redis-5.0.4/src/redis-trib.rb fix 127.0.0.1:2311
/home/redis-5.0.4/src/redis-trib.rb fix 127.0.0.1:2312
4.注意:redis 5.0以上的版本,通过 redis-cli 进行搭建Redis集群。
redis 5.0以下的版本,通过 redis-trib.rb 进行搭建Redis集群。
5.执行redis-trib.rb命令可能出现的问题:
命令:/home/redis-5.0.4/src/redis-trib.rb fix IP:端口号
打印如下信息
WARNING: redis-trib.rb is not longer available!
You should use redis-cli instead.
All commands and features belonging to redis-trib.rb have been moved
to redis-cli.
In order to use them you should call redis-cli with the --cluster
option followed by the subcommand name, arguments and options.
Use the following syntax:
redis-cli --cluster SUBCOMMAND [ARGUMENTS] [OPTIONS]
Example:
redis-cli --cluster fix
To get help about all subcommands, type:
redis-cli --cluster help
意思是:redis-trib.rb不再可用,因为redis-trib.rb命令的功能已经移动到redis cli命令中。
请使用 redis-cli --cluster 子命令[参数][选项]。
例子:redis-cli --cluster fix IP:端口号
原因:redis 5.0以上的版本,通过 redis-cli 进行搭建Redis集群。
redis 5.0以下的版本,通过 redis-trib.rb 进行搭建Redis集群
Sorry, the cluster configuration file nodes.conf is already used by a different Redis Cluster node.
Please make sure that different nodes use different cluster configuration files.
1.原因:如果在同一台机器上启动两个redis实例的话,因为当启动每一个redis实例的时候,都会自动生成一个nodes.conf文件,
想要解决上面报错,要保证以下两点的其中一点:
1.要么保证每个redis实例对应的 redis.conf(redis-端口号.conf)配置信息如下:cluster-config-file nodes-端口号.conf
2.如果没有配置cluster-config-file信息,要么redis实例启动的时候默认自动生成的文件名都统一为nodes.conf,
因此在同一台机器上有多个redis实例要启动的话,要么必须保证redis实例的文件都在单独一个的文件夹中,
要么启动每个redis实例的时候在不同的路径下执行启动命令,因为执行启动命令默认是在当前路径下自动生成nodes.conf的,
所以只要保证每次启动redis实例都在不同的路径下自动生成nodes.conf,那么便不会发生覆盖nodes.conf的问题。
2.解决方式1:
本教程建议您为每个实例配置使用单独的文件夹,因此每个实例也会在其自己的文件夹上生成nodes.conf。
在每个目录中创建一个redis.conf文件,从7000到7005。每个端口名称的文件夹就是相当于一个redis实例。
比如:
/tmp/redis-cluster/7000
/tmp/redis-cluster/7001
/tmp/redis-cluster/7002
/tmp/redis-cluster/7003
/tmp/redis-cluster/7004
/tmp/redis-cluster/7005
您需要在每个实例的单独文件夹(每个端口名称的文件夹)中放置redis.conf文件,并且必须从该文件夹中运行可执行文件。
假设要执行的redis-server文件在/tmp/redis-cluster/目录下,并且每个/tmp/redis-cluster/700x文件夹上都有redis.conf
执行命令流程如下:
cd /tmp/redis-cluster/7000
../redis-server ./redis.conf
这样,nodes.conf将在当前/tmp/redis-cluster/7000文件夹下上生成,实际即是nodes.conf将在当前文件夹下(每个端口名称的文件夹中)上生成。
3.解决方式2:
在redis.conf(redis-2311.conf)的配置文件中修改如下配置:cluster-config-file nodes-2311.conf
在redis.conf(redis-2312.conf)的配置文件中修改如下配置:cluster-config-file nodes-2312.conf
报错3:
1.问题:如果进入1机的redis可以拿到数据,但是进入2机的redis却拿不到同样key的数据的话,或者从别的端口进入redis拿不到数据的话,
应重新搭建redis集群,只需要执行一条搭建redis命令即可。
2.原因分析:每台主机之间的主redis/备redis实例之间失去了联系,所以每个redis实例之间不再是集群关系,所以需要重新搭建redis集群,
只需要执行一条搭建redis命令即可。
2.解决:执行搭建redis命令
/home/data/redis/bin/redis-cli --cluster create IP1:2311 IP1:2312 IP2:2311 IP2:2312 IP3:2311 IP3:2312 --cluster-replicas 1
“--replicas 1”命令中的“1”:表示每个“主”Redis节点服务器后面都有1个“从”Redis节点服务器。
报错4:
1.执行命令:/home/data/redis/bin/redis-cli --cluster create IP1:2311 IP1:2312 IP2:2311 IP2:2312 IP3:2311 IP3:2312 --cluster-replicas 1
2.报错:Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
3.解决:
1.删除各节点下的 dump.rdb 和 appendonly.aof
2.删除各节点下的 redis.conf(redis-端口号.conf)所配置的 cluster-config-file 对应的 nodes.conf(nodes-端口号.conf)文件
3.进入各节点下的 redis-cli -p 2311 -c、redis-cli -p 2312 -c 执行 “flushdb 数据库名” 或者 “flushall” 清空所有数据库
可用过获取所有key(keys *),查看是否所有key被清除完毕。
如果执行“flushdb 数据库名” 或者 “flushall” 清空所有数据库时,报错(error) READONLY You can't write against a read only replica,
表示当前进入的端口的数据库是备机,所以显示只读。
4.各节点下重启redis
/home/data/redis/bin/redis-server /home/data/redis/redis-2311.conf
/home/data/redis/bin/redis-server /home/data/redis/redis-2312.conf
ps aux|grep redis