Redis集群是一个分布式(distributed)、容错(fault-tolerant)的 Redis内存K/V服务, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset),比如Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误。
Redis集群的几个重要特征: 1.Redis 集群的分片特征在于将键空间分拆了16384个槽位,每一个节点负责其中一些槽位。
2.Redis提供一定程度的可用性,可以在某个节点宕机或者不可达的情况下继续处理命令.(只要集群中大多数Master可达、且失效的Master至少有一个Slave可达,即集群非Fail状态,集群都是可用)
3.Redis 集群中不存在中心(central)节点或者代理(proxy)节点, 集群的其中一个主要设计目标是达到线性可扩展性(linear scalability)
实现哈希映射
架构细节:
所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.节点的fail是通过集群中超过半数的节点检测失效时才生效.客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value安装ruby redis 扩展包:
gem install redis需要启动6个服务
redis-server /usr/local/redis_cluster/redis.conf其中redis-trib.rb在你的redis安装目录/src下:
/usr/local/redis-cluster/redis-trib.rb create --replicas 1 172.20.0.2:6379 172.20.0.3:6379 172.20.0.4:6379 172.20.0.5:6379 172.20.0.6:6379 172.20.0.7:6379可以看到创建集群成功了:(如图:2,3,4为主,5,6,7为从)
如下图,逐一设置redis密码:
redis-cli -p 6379
创建一个新节点(使用的配置文件与之前一样)并启动。
执行命令./redis-trib.rb add-node 172.20.0.8:6379 172.20.0.7:6379,将新节点添加到集群里
(脚本先检查了集群状态,后添加了节点,添加后节点是空节点,还需分配哈希槽,没有哈希槽就没有储存功能)
./redis-trib.rb reshard 172.20.0.2:6379
注释: want to move (from 1 to 16384)? 1000(此处为想移动多少个哈希槽) What is the receiving node ID?(为加入的新节点的id) Source node #1:all(此处选择all,全部使用并移动,表示从所有主节点中随机转移,凑够1000个哈希槽
如上新建一个空节点并启动
./redis-trib.rb add-node 172.20.0.9:6379 172.20.0.7:6379
连接上新节点,执行命令cluster replicate (任意一个master的ID)。 查看当前节点状态: 执行命令cluster replicate (任意一个master的ID):
把节点拥有的slots全部迁移出去
./redis-trib.rb reshard 172.20.0.2:6379
redis-trib.rb del-node 172.20.0.2:6379 f113752f7763ceea613cb73018c043f8849edecf
如果没有一个slots,可直接删除
redis-trib.rb del-node 172.20.0.2:6379 9f5bc99dba963671bb5664f84eda304dc94b1fcb (这个主节点被删除之后,它之前拥有的从节点会自动成为其他主节点的从节点.)