redis-cluster架构图
(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 会根据节点数量大致均等的将哈希槽映射到不同的节点
集群搭建
集群中应该至少有三个节点,每个节点有一备份节点。需要6台服务器。
搭建伪分布式,需要6个redis实例。
搭建集群的步骤:
第一步:创建6个redis实例指定端口从7001到7006
在/usr/local目录下新建一个redis-cluster目录
将/usr/local/redis0707目录下的bin复制到redis-cluster,并改名为redis01
复制多个cp -r redis01/ redis02
第二步:修改redis.conf 打开Cluster-enable yes前面的注释。
将632行的注释打开
45行端口号分别改为7001 7002 ...... 7006
第三步:需要一个ruby脚本。在redis源码文件夹下的src目录下 redis-trib.rb
第四步:把redis-trib.rb文件复制到到redis-cluster目录下。
cp redis-trib.rb /usr/local/redis-cluster/
第五步:执行ruby脚本之前,需要安装ruby环境。
1、yum install ruby
2、yum install rubygems
3、安装redis-trib.rb运行依赖的ruby的包。
[root@bogon ~]# gem install redis-3.0.0.gem
第六步:启动所有的redis实例。
在/usr/local/redis-cluster 目录下新建一个startup-all.sh文件,内容如下:
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..
在redis-cluster目录下,chmod +x startup-all.sh 修改文件权限
./start-all.sh 执行命令,启动6个redis
ps aux|grep redis 查看redis是否启动
第七步:使用redis-trib.rb创建集群。
./redis-trib.rb create --replicas 1 115.159.93.201:7001 115.159.93.201:7002 115.159.93.201:7003 115.159.93.201:7004 115.159.93.201:7005 115.159.93.201:7006
使用客户端连接集群: ./redis-cli -h 115.159.93.201 -p 7001 -c
维护节点
集群创建成功后可以向集群中添加节点,下面是添加一个master主节点
添加7007结点作为新节点:
在/usr/local/redis-cluster
./redis-trib.rb add-node 115.159.93.201:7007 115.159.93.201:7001
查看集群状态:
cluster info
查看集群中的节点:
cluster nodes
hash槽重新分配
添加完主节点需要对主节点进行hash槽分配,这样该主节才可以存储数据。
查看集群中槽占用情况:
cluster nodes
redis集群有16384个槽,集群中的每个结点分配自已槽,通过查看集群结点可以看到槽占用情况。
给刚添加的7007结点分配槽:
1.连接集群上的任意一个节点
./redis-trib.rb reshard 192 115.159.93.201:7001
2.输入要分配的槽数量
how many slots do you want to move (from 1 to 16384)? 500
3.给7007分配槽,通过cluster nodes查看7007节点的id:
8acc53cd234cb4bcc1d4f3e0e237f2655bc9e984
4.输入源节点id:
source node#1: all
5.输入yes开始移动槽点到目标节点
添加从节点
添加7008从结点,将7008作为7007的从结点
./redis-trib.rb add-node --slave --master-id 主节点id 新节点的ip和端口 旧节点ip和端口
./redis-trib.rb add-node --slave --master-id 8acc53cd234cb4bcc1d4f3e0e237f2655bc9e984 115.159.93.201:7008 115.159.93.201:7007