- Redis集群 安装、命令、API
- window 安装 redis
- java Jedis api:redis集群api JedisCluster、redis连接池api JedisPool
- Redis 集群搭建、Spring Data Redis使用
- redis 集群搭建
- redis报错信息:CLUSTERDOWN Hash slot not served 和 Not all 16384 slots are covered by nodes
linux下的Redis安装
1.第一步:先安装C的编译环境:yum install gcc gcc-c++ libstdc++-devel tcl -y
因为需要使用gcc进行编译才能安装Redis,Redis是基于C语言开发的。
2.第二步:查看是否安装gcc成功,输入gcc或make是否出现以下提示。
3.第三步:可联网下载redis-4.0.10.tar.gz或其他版本的源代码包,并进行安装
1.wget http://download.redis.io/releases/redis-4.0.10.tar.gz
2.tar xzf redis-4.0.10.tar.gz(解压缩)
3.cd redis-4.0.10(进入解压后目录)
4.make(使用make命令会进行编译)
5.make install PREFIX=/usr/local/redis(安装到/usr/local/redis目录下)
4.第四步:进入/usr/local/redis/bin目录下,查看到多个redis的命令文件
Redis服务器端的启动和停止
1.第一步:进入/usr/local/redis/bin目录下,有如下多个redis的命令文件
2.第二步:
1.前台启动模式:在当前/usr/local/redis/bin目录下启动Redis服务器的命令:./redis-server
2.后台启动模式:(每次修改完redis.conf请重新启动Redis服务器并再次指定加载该新修改后的redis.conf)
1.第一步:把 /redis-3.0.0的源码安装包目录下的 redis.conf 拷贝到 /usr/local/redis/bin的安装目录下
cp /root/redis-3.0.0/redis.conf /usr/local/redis/bin
2.第二步:修改/usr/local/redis/bin/redis.conf:修改为 daemonize yes,即把原来的 no 改为 yes,设置为后台运行。
每次修改完redis.conf请重新启动Redis服务器并再次指定加载该新修改后的redis.conf
3.第三步:在当前/usr/local/redis/bin目录下同时指定redis.conf 启动Redis服务器的命令:./redis-server redis.conf
即Redis服务器加载并应用该redis.conf中的配置信息再进行启动。
3.第三步:查看是否启动成功
4.第四步:
1.停止 前台模式下的redis服务器:ctrl + c
2.停止 后台模式下的redis服务器:
1.第一种方式:查看到redis-server的进程号,然后执行kill -9 进程号:ps aux|grep redis
2.第二种方式:在/usr/local/redis/bin目录下,使用redis客户端进行停止redis服务器:./redis-cli shutdown
3.第三种方式:执行了./redis-cli进入了redis客户端的输入模式下,执行shutdown命令也可停止redis服务器
Redis客户端的启动和停止
1.第一种启动方式:在/usr/local/redis/bin目录下,执行:./redis-cli
2.第二种启动方式:连接远程linux上的redis服务器,执行:./redis-cli -h 远程linux的IP -p 6379
默认连接localhost运行在6379端口的redis服务。
-h:连接的服务器的地址
-p:服务的端口号
3.第三种启动方式:
1.加上--raw的作用:
在客户端中显示查询出的中文数据时,如果以“/16进制”的形式显示中文数据的话,
那么使用“./redis-cli --raw”在进入客户端,那么查询出的中文数据便能正常以中文字符的形式显示。
2.例子:./redis-cli --raw
./redis-cli -h 远程linux的IP -p 6379 --raw
4.redis客户端下使用ping命令查看redis服务器是否正常运行:
Redis集群的搭建
1.分布式:
1.对于处理任务来说:
物理上是分开的,做的任务是不同的。每个服务器负责执行程序中的不同部分的任务,只要其中一个服务器宕机,便会影响整个程序的完整性。
2.对于存储数据来说:
每个服务器存储的数据都是不一样的
2.集群:
1.对于处理任务来说:
物理上是分开的,做的任务是相同的。每个服务器负责执行程序中的同一部分的任务,即使其中一个服务器宕机,也不影响整个程序的完整性。
2.对于存储数据来说:
1.每个服务器存储的数据都是一样的,分为两种,主服务器和从服务器。
主服务器负责提供数据库数据的增删查改,从服务器负责自动备份主服务器中的数据。主服务器和从服务器存储的都是相同的数据。
当主服务器宕机了之后,从服务器便替换作为主服务器来使用。
2.对于数据库进行集群来说,还可以配置主从读取分离。主服务器负责提供数据库数据的增删改,从服务器负责提供数据库数据的查询。
主服务器和从服务器还涉及到同步相关配置。
Redis集群:redis-cluster架构图
1.所有的redis节点是互相联通自动传输数据的,所以客户端只要连接到任意一个redis节点上即能获取redis集群下的数据库中的任意数据。
2.搭建主、从的Redis集群中:
1.所有的每个主的Redis节点负责互相自动传输数据,而每个Redis节点存储的都是不同的数据。
而每个主的Redis节点后面都可以连接一个或多个从的Redis节点,每个从的Redis节点只负责备份对应的主的Redis节点中的数据。
2.当某一个主的Redis节点失效之后,该主的Redis节点对应的从的Redis节点便充当新的主Redis节点的作用。
3.Redis集群中一共内置了16384个哈希槽slot,假如当前Redis集群中有3个Redis节点,
那么首先便会把 16384个哈希槽slot平均地自动分配并映射到对应的其中一个Redis节点上;当客户端要向Redis集群中存储键值对数据时,
首先会根据crc16算法计算出该键值对中的key对应的是哪个哈希槽slot,然后根据“该键值对中的key对应的”哈希槽slot所映射的是哪个Redis节点,
最终把该键值对存储到“哈希槽slot所映射到的”那个Redis节点上。
1.所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽 。
2.某个redis节点的失效是通过集群中超过半数的节点共同检测,认为该redis节点失效了时,就会使用该失效的redis节点的备份(从的redis服务器节点),
此时的从的redis服务器节点相当于替换作为新的主的redis节点,而从的redis服务器节点平时负责备份主的redis服务器节点中的数据。
3.client客户端与redis节点直连,不需要中间proxy层,客户端不需要连接redis集群中的所有节点,客户端只需要连接redis集群中的任何一个可用节点即可。
4.redis-cluster把所有的物理节点映射到[0-16383]slot(哈希槽)上,redis-cluster负责维护 redis节点node <---> 哈希槽slot <---> 数据值value
5.Redis集群中内置了 16384 个哈希槽slot,当需要在 Redis集群中存储一个 key-value键值对数据时,
redis 先对 key 使用 crc16 算法算出一个结果值,然后把该结果值对 16384 进行求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,
redis 会根据节点数量 大致均等地 将哈希槽映射到不同的redis节点上,然后把该键值对数据存储到“对应的哈希槽所映射到的”redis节点上。
Redis集群之搭建步骤
1.第一步:
首先需要确定Redis集群多少个Redis节点。
一般推荐至少集群3个或3个以上的Redis节点。
原因:集群中只有2个Redis节点的话,因为集群之间当有某一个Redis节点失效了的话,
是需要集群中超过半数的Redis节点进行投票判断该某个Redis节点是否失效了,所以如果只有集群中只有2个Redis节点的话,
其中一个Redis节点失效了之后,只剩下一个有效节点的话,是无法达到“超过半数的Redis节点进行投票判断”的条件的,
所以要求在搭建Redis集群中应至少集群3个或3个以上的Redis节点才符合要求。
2.第二步:
确定Redis集群中每个“主”Redis节点都应该至少拥有一个“从”Redis节点以上,那么不仅能保证“从”Redis节点随时备份“主”Redis节点中的数据,
并且能保证当“主”Redis节点失效了之后,会有对应的一个“从”Redis节点加入到Redis集群中,替代失效的“主”Redis节点,
否则整个Redis集群就会缺少部分数据库数据,而无法达到真正集群的效果和要求。
3.第三步:
因为至少需要配置 3个“主”Redis节点,而每个“主”Redis节点还需要配置 1个“从”Redis节点,所以一共需要配置 6个Redis节点,
而每个Redis节点都部署在不同的服务器上的话,则需要6台服务器,也即6台虚拟机。
模拟搭建一个伪的Redis集群
此处模拟搭建一个伪的Redis集群:
在一个服务器中的一个虚拟机上,配置开启6个不同的Redis节点服务器,每个Redis节点服务器单独使用一个端口,
一共配置7001~7006的6个端口。
1.第一步:
/usr/local目录下 创建一个redis-cluster的文件夹,该redis-cluster文件夹下创建 6个分别叫做redis01~redis06的文件夹。
然后redis01~redis06的每个文件夹中,都拷贝一份“/usr/local/redis/bin”(Redis安装目录)下所有的文件。
还需要保证redis01~redis06的bin目录中都没有 dump.rdb 和 appendonly.aof 两个持久化数据文件,保证数据库是干净的空的。
命令: cd /usr/local
mkdir /usr/local/redis-cluster/redis01
mkdir /usr/local/redis-cluster/redis02
mkdir /usr/local/redis-cluster/redis03
mkdir /usr/local/redis-cluster/redis04
mkdir /usr/local/redis-cluster/redis05
mkdir /usr/local/redis-cluster/redis06
cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis01
cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis02
cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis03
cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis04
cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis05
cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis06
redis01~redis06的每个bin目录下的文件详情如下:
2.第二步:
修改redis01~redis06的每个bin目录下的redis.conf配置文件:
1.修改端口号(45行):6379的端口号 分别修改为7001~7006
2.开启支持集群模式(632行):cluster-enabled yes
默认是被注释掉的,取消注释,即集群模式
3.第三步:
1.批处理连续启动6个Redis节点服务器,启动之前先保证没有多余的Redis服务器已经启动了。
2.创建一个redis-start.sh批处理文件,放到/usr/local/redis-cluster/目录下。
redis-start.sh内容如下:
#!/bin/bash
cd redis01/bin/
./redis-server redis.conf
cd ../..
cd redis02/bin/
./redis-server redis.conf
cd ../..
cd redis03/bin/
./redis-server redis.conf
cd ../..
cd redis04/bin/
./redis-server redis.conf
cd ../..
cd redis05/bin/
./redis-server redis.conf
cd ../..
cd redis06/bin/
./redis-server redis.conf
cd ../..
shell脚本:
1.第一步:shell脚本中的第一行为:#!/bin/bash
2.第二步:shell脚本如果是在window编辑创建的,那么shell脚本的格式实际为dos,执行“vi shell脚本名”,
然后执行“:set ff”查看到脚本的格式实际为dos,然后执行“:set ff=unix”,
把么shell脚本的格式修改为了unix。
3.第三步:修改脚本的执行权限,执行“chmod 777 shell脚本名”
4.第四步:执行脚本“./shell脚本名”
3.chmod 777 redis-start.sh:修改脚本的执行权限
./redis-start.sh:执行redis-start.sh 批处理文件,开启6个7001~7006端口的Redis节点服务器
4.ps aux|grep redis-server
4.第四步:使用ruby脚本搭建Redis集群,首先需要安装ruby的运行环境
1.第一步:安装 ruby环境
1.执行 yum install ruby
2.执行 yum install rubygems
2.第二步:ruby脚本运行redis-3.0.0.gem包
执行 gem install redis-3.0.0.gem
3.第三步:进入到 /root/redis-3.0.0/src/的源码包目录下,把 redis-trib.rb脚本文件 拷贝到/usr/local/redis-cluster/下
命令:cp /root/redis-3.0.0/src/redis-trib.rb /usr/local/redis-cluster/
4.第四步:使用ruby执行redis-trib.rb脚本文件 进行搭建Redis集群
1.执行的命令:./redis-trib.rb create --replicas 1 192.168.25.133:7001 192.168.25.133:7002 192.168.25.133:7003 192.168.25.133:7004 192.168.25.133:7005 192.168.25.133:7006
2.“create --replicas 1”命令中的“1”:表示每个“主”Redis节点后面都有一个“从”Redis节点
3.“./redis-trib.rb create --replicas 从节点数”命令后面还要拼接上所有每个的Redis节点服务器的“IP:端口”,
每个“IP:端口”之间使用空格隔开。
Redis集群之使用:Redis客户端连接Redis集群的服务器,进行存储数据
1.使用任意一个redis01~redis06下的bin目录中的rendis-cli客户端 连接 Redis集群下的任意一个Redis节点服务器 都可以进行 正常的存储/获取数据。
2.rendis-cli -p 端口 -c:
1.rendis-cli -p 7001~7006中的任意一个端口。
2.-c:表示进行集群链接。
3.rendis-cli -p “主”Redis节点服务器的端口 -c:
每个“主”Redis节点服务器已分配好哈希槽slot,自动把键值对存储到“哈希槽slot所映射到的”那个“主”Redis节点服务器中。
4.rendis-cli -p “从”Redis节点服务器的端口 -c:
每个“从”Redis节点服务器 都不拥有任何的哈希槽slot,所以往“从”Redis节点服务器中存储数据时,
会自动转为把键值对存储到“哈希槽slot所映射到的”那个“主”Redis节点服务器中。
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
Spring Data Redis 连接 Redis集群