Redis 集群之Cluster模式

1. Redis 集群模式

2. Cluster 模式

2.1 Cluster 模式介绍

  • sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。
    另外,哨兵模式中,只有一个master,而Cluster中,可以有多个master,可以提高系统的吞吐量。
  • cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例(三主三从)。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容。
  • 使用集群,只需要将redis配置文件中的cluster-enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行,新增节点非常方便。
    在这里插入图片描述

2.2 数据存储设计

  • Redis Cluster集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot,分布在主节点上), 数据库中的每个键值对都存在这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
  • 集群中的每个节点负责处理一部分哈希槽。 举个例子, 一个集群可以有三个主节点, 其中:
    节点 A 负责处理 0 号至 5500 号哈希槽。
    节点 B 负责处理 5501 号至 11000 号哈希槽。
    节点 C 负责处理 11001 号至 16384 号哈希槽。
  • 这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。 比如说:
    如果用户将新节点 D 添加到集群中, 那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
    与此类似, 如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。
    因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞, 所以无论是添加新节点还是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会造成集群下线。

2.3 内部通讯设计

在这里插入图片描述

2.4 cluster 集群结构搭建

  • 原生安装(单条命令)
    • 配置服务器(3主3从)
    • 建立通信(Meet)
    • 分槽(Slot)
    • 搭建主从(master-slave)
  • 工具安装(批处理)
  • Cluster 配置
  • 开启Cluster(配置这个属性,表示服务器是集群中的节点)
    cluster-enabled yes | no
  • cluster配置文件名,该文件属于自动生成,它不是用户可编辑的配置文件,而是Redis Cluster节点每次发生更改时都会自动持久保存集群配置的文件(状态,基本上是状态),为了能够在启动时重新阅读它,给它指定一个名字。
    cluster-config-file <filename>
  • 节点服务响应超时时间,用于判定该节点是否下线或切换为从节点
    cluster-node-timeout <milliseconds>
  • master连接的slave最小数量
    cluster-migration-barrier <count>
    在这里插入图片描述
  • 配置好之后,启动这六台服务器即可
  • 创建集群(包括建立通信、分槽和搭建主从)
  • 单单启动cluster后还没有正式组成集群,还需要用到redis-trib.rb(redis-trib是个集群软件,用于管理槽)命令来创建集群,由于redis-trib.rb命令是一个ruby脚本,会对ruby环境有一些依赖,在执行前需要安装以下软件包(Redis 5开始可以使用redis-cli --cluster来创建集群,命令语法和redis-trib.rb脚本一样,省去了配置ruby环境的步骤)
    yum install ruby rubygems
    gem source -l #安装完成后可以查看当前ruby源
    gem sources --remove https://rubygems.org/ #去掉官方源
    gem sources --remove http://rubygems.org/ #去掉官方源
    gem sources -a https://ruby.taobao.org/ #新增国内源
    gem install redis --version 3.2.0 #安装redis与ruby连接接口
  • 创建集群,–replicas 1 ,指定一个master有几个slave,并且后面按顺序写上master和slave的ip和端口号
    ./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
    注意要在redis安装目录下的src下执行该命令
    在这里插入图片描述

2.5 设置与获取数据

  • 设置数据

当使用redis-cli启动master客户端存数据时,会报错,提示你key所对应的槽在哪,不让你放数据
在这里插入图片描述
可以使用redis -cli -c来启动客户端,这条指令是专门操作Cluster集群的,不用指定端口号,存数据时会重定向到含有key所对应的槽的master的客户端下
在这里插入图片描述
如果直接在端口号为6380的客户端下存数据的话,就不会报错

  • 获取数据

同设置数据一样,如果按普通方式启动客户端,获取数据时,如果数据刚好在master的槽中,可以获取到数据,如果不在的话,会报错,提示数据在哪个master的槽中
在这里插入图片描述
使用redis-cli -c启动客户端,来获取数据
在这里插入图片描述

2.6 主从下线与切换

集群中,当一个master下线时,会和哨兵模式中一样,会选一个slave当做master,当下线的master上线时,就变成slave了

Cluster 结点操作命令

  • cluster info 打印集群的信息
  • cluster nodes 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
  • cluster meet 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
  • cluster forget<node_id> 从集群中移除 node_id 指定的节点。

参考
Redis 集群详解
Redis教程(九)cluster集群的配置