一 概念

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架构图

在这里插入图片描述
实现哈希映射

在这里插入图片描述
架构细节:

  1. 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
  2. 节点的fail是通过集群中超过半数的节点检测失效时才生效.
  3. 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
  4. redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

3.2 redis-cluster选举:容错

在这里插入图片描述

  1. 选举过程是集群中所有master参与,如果半数以上master节点与某个master节点通信超时(cluster-node-timeout),认为该master节点挂掉.
  2. 什么时候整个集群不可用(cluster_state:fail):
    a:如果集群任意master挂掉,且当前master没有slave,集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完全时进入fail状态.
    b:如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.
  3. 当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。

四 环境要求

  1. Redis3.0版本以上
  2. 要让集群正常工作至少需要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
在这里插入图片描述
在这里插入图片描述
(这个主节点被删除之后,它之前拥有的从节点会自动成为其他主节点的从节点.)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐