一、安装Linux客户端
具体安装步骤见本人另一篇博客
https://blog.csdn.net/qq_22118991/article/details/100117996
二、集群原理
1.Redis-cluster架构图
![](https://i-blog.csdnimg.cn/blog_migrate/a8805e2707ec1ab2b8c017029547be22.png)
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
2.Redis-cluster投票:容错
![](https://i-blog.csdnimg.cn/blog_migrate/540201b20de838c3709f2dfdb8a6cd1b.png)
投票:
(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)错误
3.Ruby环境
redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:
cd redis-3.0.7/src
ll *.rb
![](https://i-blog.csdnimg.cn/blog_migrate/7be9a180fb1b64f5bcef35e287461568.png)
安装ruby
yum install ruby
yum install rubygems
安装ruby和redis的接口程序
拷贝redis-3.0.0.gem至/usr/local下
执行:
gem install /usr/local/redis-3.0.0.gem
![](https://i-blog.csdnimg.cn/blog_migrate/6d7e776f25f669e05531e260503c110f.png)
三、集群的搭建
本文搭建有三个节点的Redis集群,每个节点有一主一备,因此需要六台虚拟机,由于本人电脑比较渣,因此搭建6个Redis实例模拟几群的环境。
1.创建实例并修改配置
在/src/local目录下面创建一个rediscloud文件夹,将之前安装的redis移动至该文件夹下并命名为redis01,同时复制6个实例:
![](https://i-blog.csdnimg.cn/blog_migrate/635e5af4be528ae97639a1fe4cb86325.png)
这里在同一台服务器用不同的端口表示不同的redis服务器,如下:
主节点:192.168.119.131:7001 192.168.119.131:7002 192.168.119.131:7003
从节点:192.168.119.131:7004 192.168.119.131:7005 192.168.119.131:7006
修改各个实例的端口号:
![](https://i-blog.csdnimg.cn/blog_migrate/248623861cbe11af60739fb3c1286031.png)
并打开cluster-enabled 前的注释:
![](https://i-blog.csdnimg.cn/blog_migrate/d5c485f5825182677228f6c12468309e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6786b996e2dcd8dc9f096b75245efa3c.png)
2.将脚本拷到/rediscloud文件夹下
cd redis-3.0.7/src
cp *.rb /usr/local/rediscloud/
![](https://i-blog.csdnimg.cn/blog_migrate/2defa18b309c02d58b6871c218bfac04.png)
3.创建集群
启动6个Redis实例,通过脚本进行启动。创建脚本:
vim startAll.sh
写入如下命令:
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 ../../
给脚本添加执行权限:
chmod +x startAll.sh
![](https://i-blog.csdnimg.cn/blog_migrate/0303ce2af12d4ff3e60ff128947eb047.png)
执行脚本,运行实例。
./startAll.sh
ps aux|grep redis
![](https://i-blog.csdnimg.cn/blog_migrate/403503e4da2b89fb22c5f806e164184b.png)
可以看到,6个redis实例都已经在运行了。
使用命令创建集群
./redis-trib.rb create --replicas 1 192.168.119.131:7001 192.168.119.131:7002 192.168.119.131:7003 192.168.119.131:7004 192.168.119.131:7005 192.168.119.131:7006
![](https://i-blog.csdnimg.cn/blog_migrate/b5131ce0d921e6e616512f4d76361869.png)
可以看到,脚本为我们自动创建了三个主节点,每个主节点都有一个从节点,并且将16384个slots分配到了三个主节点上。
![](https://i-blog.csdnimg.cn/blog_migrate/291902851ca2bea50f520a96a2e444ff.png)
四、测试集群
使用任意一个节点的客户端,使用命令:
redis01/redis-cli -h 192.168.119.131 -p 7002 -c
命令中的 -h 表示连接的主机,-p 表示连接的端口号,由于连接的是集群,连接任意一个redis都可以, -c参数表示连接集群,一定不能少。
![](https://i-blog.csdnimg.cn/blog_migrate/e5b2cc87dd3a04a1e9258cdcde161610.png)
虽然练得式端口7002,但是通过计算,redis集群将该数据存放在了redis03的实例上了。
下面为缺少 -c 参数的命令,导致连接上集群二无法进行数据操作。
![](https://i-blog.csdnimg.cn/blog_migrate/af76659b8084f02ddfd8179170567493.png)