redis集群(cluster)模式 详解与实操
一 概念Redis集群是一个分布式(distributed)、容错(fault-tolerant)的 Redis内存K/V服务, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset),比如Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误。二 特性Redis集群的几
一 概念
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)
三 架构
3.1 redis-cluster架构图
实现哈希映射
架构细节:
- 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
- 节点的fail是通过集群中超过半数的节点检测失效时才生效.
- 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
- redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
3.2 redis-cluster选举:容错
- 选举过程是集群中所有master参与,如果半数以上master节点与某个master节点通信超时(cluster-node-timeout),认为该master节点挂掉.
- 什么时候整个集群不可用(cluster_state:fail):
a:如果集群任意master挂掉,且当前master没有slave,集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完全时进入fail状态.
b:如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态. - 当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。
四 环境要求
- Redis3.0版本以上
- 要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点
五 集群搭建
5.1 安装ruby
apt-get install ruby
apt-get install rubygems
安装ruby redis 扩展包:
gem install redis
5.2. 安装redis server:
apt-get install redis-server
5.3. 创建redis-cluster文件夹
mkdir /usr/local/redis-cluster
5、4. 将你的redis.conf配置文件分别复制到redis-cluster这个文件夹中,更改如下
port 6379 #端口6379
bind 本机ip #默认ip为172.20.0.2/3/4/5/6/7需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes #redis后台运行
pidfile /var/run/redis_6379.pid #pidfile #文件对应6379
cluster-enabled yes #开启集群 把注释#去掉
cluster-config-file nodes_7000.conf #集群的配置 配置文件首次启动自动生成
cluster-node-timeout 15000 #请求超时 默认15秒,可自行设置
appendonly yes #aof日志开启 有需要就开启,它会每次写操作都记录一条日志
masterauth '86a1b907d54bf7010394bf316e183e67'
requirepass '86a1b907d54bf7010394bf316e183e67' #设置密码
5.5. 启动redis服务
需要启动6个服务
redis-server /usr/local/redis_cluster/redis.conf
5.6 创建集群
其中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为从)
5.7 设置redis集群密码
如下图,逐一设置redis密码:
5.8 连接集群并测试
redis-cli -p 6379
六 集群扩容
6.1 添加主节
创建一个新节点(使用的配置文件与之前一样)并启动。
执行命令./redis-trib.rb add-node 172.20.0.8:6379 172.20.0.7:6379,将新节点添加到集群里
(脚本先检查了集群状态,后添加了节点,添加后节点是空节点,还需分配哈希槽,没有哈希槽就没有储存功能)
6.2 为新节点分配哈希槽
./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个哈希槽
6.3 添加从节点slave
如上新建一个空节点并启动
./redis-trib.rb add-node 172.20.0.9:6379 172.20.0.7:6379
连接上新节点,执行命令cluster replicate (任意一个master的ID)。
查看当前节点状态:
执行命令cluster replicate (任意一个master的ID):
七 删除节点
7.1 迁移slots
把节点拥有的slots全部迁移出去
./redis-trib.rb reshard 172.20.0.2:6379
7.2 删除节点
redis-trib.rb del-node 172.20.0.2:6379 f113752f7763ceea613cb73018c043f8849edecf
7.3 没有slots
如果没有一个slots,可直接删除
redis-trib.rb del-node 172.20.0.2:6379 9f5bc99dba963671bb5664f84eda304dc94b1fcb
(这个主节点被删除之后,它之前拥有的从节点会自动成为其他主节点的从节点.)
更多推荐
所有评论(0)