概念解释
redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。其redis-cluster架构图如下:
1 本人是源码安装redis:
[fish_study@fish-studydeMacBook-Pro redis-6.0.9]# tar xzf redis-6.0.9.tar.gz
[fish_study@fish-studydeMacBook-Pro redis-6.0.9]# cd redis-6.0.9
[fish_study@fish-studydeMacBook-Pro redis-6.0.9 % ]# make
[fish_study@fish-studydeMacBook-Pro redis-6.0.9 %]# make install PREFIX=/usr/andy/redis-cluster
在redis-cluster下 修改bin文件夹为redis01,复制redis.conf配置文件
创建目录redis-cluster并在此目录下再创建7001 7002 7003 7004 7005 7006共6个目录,在7000中创建配置文件redis.conf,内容如下:
daemonize yes #后台启动
port 7001 #修改端口号,从7001到7006
cluster-enabled yes #开启cluster,去掉注释
cluster-config-file nodes.conf #自动生成
cluster-node-timeout 15000 #节点通信时间
appendonly yes #持久化方式
使用sed 's/7001/7006/' redis_cluster.conf >redis_cluster7006.conf 分别创建其他文件
2、安装redis-trib所需的 ruby脚本
注意:centos7默认的ruby版本太低(2.0),要卸载重装(最低2.2)
yum remove ruby
yum install ruby
yum install rubygems
复制redis解压文件src下的redis-trib.rb文件到redis-cluster目录并安装gem
gem install redis-3.x.x.gem
3、启动所有的redis节点
可以写一个命令脚本start-all.sh
cd 7000
redis-server redis.conf
cd ..
cd 7001
redis-server redis.conf
cd ..
cd 7002
redis-server redis.conf
cd ..
cd 7003
redis-server redis.conf
cd ..
cd 7004
redis-server redis.conf
cd ..
cd 7005
redis-server redis.conf
cd ..
设置权限启动:
[root@localhost redis-cluster]# chmod 777 start-all.sh
[root@localhost redis-cluster]# ./start-all.sh
查看redis进程启动状态
fish_study@fish-studydeMacBook-Pro redis-6.0.9 % ps aux|grep redis
fish_study 7069 0.3 0.0 4349068 2324 ?? Ss 8:29下午 0:03.93 ./src/redis-server *:7006 [cluster]
fish_study 7067 0.3 0.0 4349068 2388 ?? Ss 8:29下午 0:03.91 ./src/redis-server *:7005 [cluster]
fish_study 6990 0.3 0.0 4349068 2352 ?? Ss 7:35下午 0:12.45 ./src/redis-server *:7004 [cluster]
fish_study 6985 0.3 0.0 4351120 2372 ?? Ss 7:35下午 0:12.45 ./src/redis-server *:7002 [cluster]
fish_study 6987 0.3 0.0 4349068 2348 ?? Ss 7:35下午 0:12.54 ./src/redis-server *:7003 [cluster]
fish_study 6803 0.2 0.0 4349112 2348 ?? Ss 5:27下午 0:33.72 ./src/redis-server *:7001 [cluster]
fish_study 7111 0.0 0.0 4268300 700 s000 S+ 8:50下午 0:00.00 grep redis
可以看到redis的6个节点已经启动成功
注意:这里并没有创建集群
4、使用redis-trib.rb创建集群
注意:redis-trib.rb在redis/src目录下。
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
使用create命令 --replicas 1 参数表示为每个主节点创建一个从节点,其他参数是实例的地址集合。
5、redis集群的测试
测试存取值,客户端连接集群redis-cli需要带上 -c ,redis-cli -c -p 端口号
[root@localhost redis]# ./redis-cli -c -p 7001
127.0.0.1:7001> set name andy
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
127.0.0.1:7002> get name
"andy"
127.0.0.1:7002>
根据redis-cluster的key值分配,name应该分配到节点7002[5461-10922]上,上面显示redis cluster自动从7001跳转到了7002节点。
测试一下7000从节点获取name值
[root@localhost redis]# ./redis-cli -c -p 7000
127.0.0.1:7000> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
"andy"
127.0.0.1:7002>
6、集群节点选举
现在模拟将7002节点挂掉,按照redis-cluster原理会选举会将 7002的从节点7005选举为主节点。
[root@localhost redis-cluster]# ps -ef | grep redis
root 7966 1 0 12:50 ? 00:00:29 ./redis-server 127.0.0.1:7000 [cluster]
root 7950 1 0 12:50 ? 00:00:28 ./redis-server 127.0.0.1:7001 [cluster]
root 7952 1 0 12:50 ? 00:00:29 ./redis-server 127.0.0.1:7002 [cluster]
root 7956 1 0 12:50 ? 00:00:29 ./redis-server 127.0.0.1:7003 [cluster]
root 7960 1 0 12:50 ? 00:00:29 ./redis-server 127.0.0.1:7004 [cluster]
root 7964 1 0 12:50 ? 00:00:29 ./redis-server 127.0.0.1:7005 [cluster]
root 11346 10581 0 14:57 pts/2 00:00:00 grep --color=auto redis
[root@localhost redis-cluster]# kill 7952
在查看集群中的7002节点
[root@localhost src]# ./redis-trib.rb check 127.0.0.1:7002
>>> Performing Cluster Check (using node 127.0.0.1:7002)
S: 671a0524a616da8b2f50f3d11a74aaf563578e41 127.0.0.1:7002
slots: (0 slots) slave
replicates 62a00566233fbff4467c4031345b1db13cf12b46
M: 18948dab5b07e3726afd1b6a42d5bf6e2f411ba1 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: 62a00566233fbff4467c4031345b1db13cf12b46 127.0.0.1:7005
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: f4ee0a501f9aaf11351787a46ffb4659d45b7bd7 127.0.0.1:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 34e322ca50a2842e9f3664442cb11c897defba06 127.0.0.1:7004
slots: (0 slots) slave
replicates f4ee0a501f9aaf11351787a46ffb4659d45b7bd7
S: 2cb649ad3584370c960e2036fb01db834a546114 127.0.0.1:7000
slots: (0 slots) slave
replicates 18948dab5b07e3726afd1b6a42d5bf6e2f411ba1
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
可以看到集群连接不了7002节点,而7005有原来的S转换为M节点,代替了原来的7002节点。我们可以获取name值:
[root@localhost redis]# ./redis-cli -c -p 7001
127.0.0.1:7001> get name
-> Redirected to slot [5798] located at 127.0.0.1:7005
"andy"
127.0.0.1:7005>
127.0.0.1:7005>
从7001节点连入,自动跳转到7005节点,并且获取name值。
现在我们将7002节点恢复,看是否会自动加入集群中以及充当的M还是S节点。
[root@localhost redis-cluster]# cd 7002
[root@localhost 7002]# ./redis-server redis.conf
[root@localhost 7002]#
再check一下7002节点,可以看到7002节点变成了7005的从节点
7 PHP代码连接redis集群实例:
<?php
//连接单个的Redis 服务
#$redis = new Redis();
#$redis->connect('10.1.1.35',6379);
#echo $redis->get("data_80300_0_");
#连接Redis集群
$redis_list = ['10.1.1.35:6379','10.1.1.151:6379','10.1.1.153:6379'];
$redisCluster = new RedisCluster(NUll,$redis_list);
echo $redisCluster->get("data_80300_0_");
echo "\n";
echo $redisCluster->get("data_76402_0_");
echo "\n";
echo $redisCluster->get("data_78989_0_");
# echo "Server is running: " . $redis->ping();
echo "\n";
?>