redis集群(cluster)模式 详解与实操

tech2024-01-11  73

一 概念

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)