Redis从3.0版本开始支持cluster模式,集群至少需要三个主节点和三个从节点,生产环境部署时要保证主从在不同服务器,避免单点故障,实现集群高可用。
其结构特点:
1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value。
5、Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。
Redis服务器说明
10.199.194.14 6379
10.199.194.14 6380
10.199.194.14 6381
10.199.194.14 6382
10.199.194.14 6383
10.199.194.14 6384
部署步骤
1、编译安装redis, 安装目录:/apps/svr
cd /apps/svr
tar -zxf redis-3.0.5.tar.gz
cd redis-3.0.5
make && make install
2、创建redis集群节点
mkdir /apps/svr/redis_cluster
cd /apps/svr/redis_cluster
mkdir 6379 6380 6381 6382 6383 6384
3、复制默认的节点配置文件到集群节点中
cp /apps/svr/redis-3.0.5/redis.conf /apps/svr/redis_cluster/6379
4、修改默认配置文件
[root@testdb-5qvnf 6379]# vim /apps/svr/redis_cluster/6379/redis.conf
daemonize yes //redis后台运行
pidfile /var/run/redis_6379.pid //pidfile文件对应6379
port 6379 //端口6379
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes-6379.conf //集群的配置 配置文件首次启动自动生成
cluster-node-timeout 6000 //请求超时
appendonly yes //日志开启,环境测试开启,正式环境建议关闭
bind 10.199.194.14 //修改监听的地址为本机地址
5、修改完后把配置文件复制到7001上并修改相应的端口
[root@testdb-5qvnf 6379]# cp /apps/svr/redis_cluster/6379/redis.conf /apps/svr/redis_cluster/6380
[root@testdb-5qvnf 6379]# cp /apps/svr/redis_cluster/6379/redis.conf /apps/svr/redis_cluster/6381
[root@testdb-5qvnf 6379]# cp /apps/svr/redis_cluster/6379/redis.conf /apps/svr/redis_cluster/6382
[root@testdb-5qvnf 6379]# cp /apps/svr/redis_cluster/6379/redis.conf /apps/svr/redis_cluster/6383
[root@testdb-5qvnf 6379]# cp /apps/svr/redis_cluster/6379/redis.conf /apps/svr/redis_cluster/6384
6、启动各个节点,并检查是否正常启动
redis-server /apps/svr/redis_cluster/6379/redis.conf &
redis-server /apps/svr/redis_cluster/6380/redis.conf &
redis-server /apps/svr/redis_cluster/6381/redis.conf &
redis-server /apps/svr/redis_cluster/6382/redis.conf &
redis-server /apps/svr/redis_cluster/6383/redis.conf &
redis-server /apps/svr/redis_cluster/6384/redis.conf &
查看启动进程
[root@testdb-5qvnf 6379]# ps -ef|grep redis
root 31862 1 0 16:22 ? 00:00:00 redis-server 10.199.194.14:6379 [cluster]
root 31881 1 0 16:23 ? 00:00:00 redis-server 10.199.194.14:6380 [cluster]
root 31882 1 0 16:23 ? 00:00:00 redis-server 10.199.194.14:6381 [cluster]
root 31883 1 0 16:23 ? 00:00:00 redis-server 10.199.194.14:6382 [cluster]
root 31884 1 0 16:23 ? 00:00:00 redis-server 10.199.194.14:6383 [cluster]
root 31894 1 0 16:23 ? 00:00:00 redis-server 10.199.194.14:6384 [cluster]
8、创建集群
创建集群命令需要以下软件支持
#安装ruby
yum install ruby -y
#安装相关组件
gem install redis
确认所有的节点都启动后, 执行创建集群命令
/apps/svr/redis-3.0.5/src/redis-trib.rb create --replicas 1 10.199.194.14:6379 10.199.194.14:6380 10.199.194.14:6381 10.199.194.14:6382 10.199.194.14:6383 10.199.194.14:6384
查看redis集群状态
/apps/svr/redis-3.0.5/src/redis-trib.rb check 10.199.194.14:6379
测试redis集群
# redis-cli -c -p 6379 -h 10.199.194.14
10.199.194.14:6379> set hello world
10.199.194.14:6379> get hello
查看进程
[root@testdb-5qvnf /]# ps aux |grep redis
root 2629 0.0 0.0 103244 864 pts/0 S+ 10:17 0:00 grep redis
root 31862 0.0 0.4 137444 9536 ? Ssl May26 0:57 redis-server 10.199.194.14:6379 [cluster]
root 31881 0.0 0.4 137444 9532 ? Ssl May26 0:56 redis-server 10.199.194.14:6380 [cluster]
root 31882 0.0 0.4 137444 9536 ? Ssl May26 0:57 redis-server 10.199.194.14:6381 [cluster]
root 31883 0.0 0.3 137444 7664 ? Ssl May26 0:54 redis-server 10.199.194.14:6382 [cluster]
root 31884 0.0 0.3 137444 7420 ? Ssl May26 0:55 redis-server 10.199.194.14:6383 [cluster]
root 31894 0.0 0.3 137444 7412 ? Ssl May26 0:54 redis-server 10.199.194.14:6384 [cluster]
[root@testdb-5qvnf /]# kill -9 31862 //关闭6379端口,看数据会不会丢失
查看集群情况,发现变成了3主2从
/apps/svr/redis-3.0.5/src/redis-trib.rb check 10.199.194.14:6380
Connecting to node 10.199.194.14:6380: OK
Connecting to node 10.199.194.14:6384: OK
Connecting to node 10.199.194.14:6383: OK
Connecting to node 10.199.194.14:6382: OK
Connecting to node 10.199.194.14:6381: OK
[root@slave2 redis]# redis-cli -c -p 6380 -h 10.199.194.14
192.168.10.219:6379> get hello
三 集群管理
- 查看集群情况
redis-trib.rb check 127.0.0.1:7000 - 添加主节点,将新节点7006添加到集群
redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000 - 添加子节点,分配给最少从节点的主节点(执行以下命令如果提示Node 10.199.194.14:6380 is not empty,则先登录该节点清空数据(flushdb),再执行以下命令)
redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000 - 添加子节点,指定主节点
redis-trib.rb add-node --slave --<master-id> 127.0.0.1:7006 127.0.0.1:7000 - 重新分配槽
redis-trib.rb reshard --from <node-id> --to <node-id> --slots <number_of_slots> --yes <host:port> - 数据导入
redis-trib.rb import --from <host:port> <host:port> - 删除节点(移除主节点,要求主节点为空,即移除前要先将槽移动到其他节点)
redis-trib.rb del-node 127.0.0.1:7000 <node-id>