文章参考链接:
https://blog.csdn.net/qq_42815754/article/details/82912130
由于我安装的是redis5.0.5版本
本文是基于redis5.x以上版本的:
一、Redis Cluster(Redis集群)简介
- redis是一个开源的key value存储系统,受到了广大互联网公司的青睐。redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我这里用的是redis3.0.0版本;
- redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;
- redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;
- 为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法;
- 那么如何判断集群是否挂了呢? -> 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法;
- 那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? -> 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。
- 综上所述,每个Redis集群理论上最多可以有16384个节点。
二、集群搭建需要的环境
2.1 Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。
2.2 要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。因为我没有那么多服务器,也启动不了那么多虚拟机,所在这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7001-7006),当然实际生产环境的Redis集群搭建和这里是一样的。
2.3 安装ruby
三、集群搭建具体步骤如下(注意要关闭防火墙)
3.1 在usr/local目录下新建redis-cluster目录,用于存放集群节点
命令: mkdir redis-cluster
~ cd redis-cluster
3.2 把redis安装目录下的所有文件复制到/usr/local/redis-cluster/redis01目录下,不用担心这里没有redis01目录,会自动创建的。操作命令如下(注意当前所在路径):
(我的redis安装在/root目录下的redis-5.0.5/)
命令: cp -r /root/redis-5.0.5/ /usr/local/redis-cluster/redis01
-
3.3 删除redis01目录下的快照文件dump.rdb,并且修改该目录下的redis.cnf文件,具体修改两处地方:一是端口号修改为7001,二是开启集群创建模式,打开注释即可。分别如下图所示:
- 修改端口号为7001,默认是6379
cd redis01
vim redis.conf
- 将cluster-enabled yes 的注释打开
![图片](https://i-blog.csdnimg.cn/blog_migrate/2cb2a0a0870e5c89b6e1674c492e7ab6.png)
3.4 将redis-cluster/redis01文件复制5份到redis-cluster目录下(redis02-redis06),创建6个redis实例,模拟Redis集群的6个节点。然后将其余5个文件下的redis.conf里面的端口号分别修改为7002-7006。
3.5 接着启动所有redis节点,由于一个一个启动太麻烦了,所以在这里创建一个批量启动redis节点的脚本文件,命令为start-all-redis.sh,文件内容如下:
1 cd redis01/src
2 ./redis-server …/redis.conf &
3 cd …/…
4 cd redis02/src
5 ./redis-server …/redis.conf &
6 cd …/…
7 cd redis03/src
8 ./redis-server …/redis.conf &
9 cd …/…
10 cd redis04/src
11 ./redis-server …/redis.conf &
12 cd …/…
13 cd redis05/src
14 ./redis-server …/redis.conf &
15 cd …/…
16 cd redis06/src
17 ./redis-server …/redis.conf &
18 cd …/…
-
3.6 创建好启动脚本文件之后,需要修改该脚本的权限,使之能够执行,指令如下:
- 命令: chmod +x start-all-redis.sh
3.7 执行start-all-redis.sh脚本,启动6个redis节点
./start-all-redis.sh
-
查看redis-server启动情况:
- ps aux | grep redis
3.8 ok,至此6个redis节点启动成功,接下来正式开启搭建集群,以上都是准备条件。大家不要觉得图片多看起来冗长所以觉得麻烦,其实以上步骤也就一句话的事情:创建6个redis实例(6个节点)并启动。
-
要搭建集群的话,需要使用一个工具(脚本文件),这个工具在redis解压文件的源代码里。因为这个工具是一个ruby脚本文件,所以这个工具的运行需要ruby的运行环境,就相当于java语言的运行需要在jvm上。所以需要安装ruby,指令如下:
- yum -y install ruby ruby-devel rubygems rpm-build
由于我是使用的redis5.x的版本,所以创建集群的命令不同于之前的 版本(之前的版本是使用redis-trib.rd这个可执行文件创建的),5.x版本以后是采用redis-cli 命令来创建集群
脚本文件搭建集群:
redis-cli --cluster create 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 127.0.0.1:7006 --cluster-replicas 1
(先使用的是ip地址创建,发现不行,后来用本机的127.0.0.1创建就可以了)
中途有个地方需要手动输入yes即可
**至此,Redi集群搭建成功!**大家注意最后一段文字,显示了每个节点所分配的slots(哈希槽),这里总共6个节点,其中3个是从节点,所以3个主节点分别映射了0-5460、5461-10922、10933-16383solts。
3.11 最后连接集群节点,连接任意一个即可:
~ 命令: redis-cli -p 7001 -c
注意:一定要加上-c,不然节点之间是无法自动跳转的!如下图可以看到,存储的数据(key-value)是均匀分配到不同的节点的:
四、结语
呼~~~长舒一口气…终于搭建好了Redis集群。
整个过程其实挺简单,本篇主要正对入门级别的小伙伴,插入了很多图片,所以显得冗长,希望大家多多理解,如果不当之处,还望及时指正~
五、集群一些相关命令:
注:ip为安装redis的那台服务器(集群中的其中一台)的ip,password为redis的密码
集群相关信息查看
1.集群状态
redis-cli -h ip -p 9379 -a password cluster info
2.集群节点信息
redis-cli -h ip -p 9379 -a password cluster nodes
3.节点内存、cpu、key数量等信息(每个节点都需查看)
redis-cli -h ip -p 9379 -a password info
4.从redis集群中查看key(只需要连接master节点查看)
a.查看该节点的所有key
redis-cli -h ip -p 9379 -a password keys *
b.查看key的value值
redis-cli -h ip -p 9379 -a password -c get key
c.查看key值得有效期
redis-cli -h ip -p 9379 -a password -c ttl key
查看 redis 中存的数据
1.ssh root@ip
2.Password: password
3.keys *
4.查看存储的数据剩余过期时间
ttl key
4.查看key的类型(string,set,list,hash)
type key
5.查看key的值(string类型)
get key
6.查看key的值(set类型)
scard key //获取 set 集合中元素的数量
smembers key //查看 set 中的内容
7.查看key的值(hash类型)
hlen key //获取 key 键的字段数量
hgetall key //返回 key 键的所有字段及其值
hkeys key //获取 key 键中所有字段的名字
hvals key //获取 key 键中所有字段的值