1.概述
概念:
redis集群是从3.0版本开始支持的一个功能,是redis的一种水平扩展方式,将全局数据分散的存储在N个结点上,从而来将请求流量打散到各个结点上,减轻单结点压力。
实现原理:
redis的集群进行数据散列时使用了一致性hash算法的思想,如果对一致性hash算法有兴趣可以参照博主的另一篇文章:
具体实现上,1个redis集群包含16384个槽位(solt),编号0-16384,将这些槽位分段给各个结点。如果要操作某个数据,CRC16(key)%16384计算出槽位号,如果这个槽位号在当前结点就直接在当前结点进行处理,如果在其它结点就使用重定向的方式将操作指令重定向到对应结点上去。redis将CRC16算法当作自己的hash函数的实现来使用。
以下以一个查找操作为例:
为什么能分担流量压力:
如果一个操作请求从业务代码发送过来,因为存在请求重定向机制的存在,所以请求随便发给一个redis结点都行。
环境依赖:
需要注意的是,5.0版本以前需要ruby环境,5.0版本以后不需要。
2.配置
2.1.配置文件
redis的配置文件redis.conf中关于集群的主要配置项有三个:
cluster-enabled,是否开启集群模式。
cluster-config-file,本届点生成的集群文件的名称。
cluster-node-timeout,失联等待时间,主要用于主节点失联后其他从节点何时开始重新竞选出主节点。
2.2.合体
配置好后的各个结点还是相互独立的,集群处于未启动状态,各个结点还没分配各自的插槽号,需要使用指令来启动集群,并完成各节点插槽号的分配。
在5.0版本之前要使用redis-trib.rb命令来进行合体,在5.0以后合体命令继承在了redis-cli中,redis-cli支持了多种参数,在启动集群时对集群做一些初始化的配置:
注意:有多结点时,多个IP:port间以空格分隔。
命令格式 | 命令说明 |
redis-cli --cluster create IP:port | 以默认的方式启动集群 |
redis-cli --cluster create IP:port --cluster-replicas 1 | 创建带主从关系的集群,主从关系由redis随机创建 |
使用redis-cli启动集群时创建的主从关系是无法指定的,如有需要的话可以在创建后手动调整。
命令格式 | 命令说明 |
redis-cli --cluster add-node IP:port | 新增主结点 |
redis-cli --cluster add-node IP:port --cluster-slave --cluster-master-id 主节点的id | 新增从结点 |
以下使用默认的方式启动集群,启动时redis会主动询问自动生成的集群配置是否满意:
合体成功后可以使用cluster nodes来查看当前集群的信息:
2.3.进入cli
集群模式下最好使用./redis-cli -c来进入集群模式下的客户端,因为进入普通模式的客户端的话很多集群功能不支持,比如说无法重定向,一旦进行存放值的操作时运算出来的hash值不在当前节点所管的范围,会直接报错。
3.集群操作
3.1.查看集群信息
cluster nodes
如果存在主从关系,通过编号消息可以看出主从关系。
3.2.集群中录入值
一致性hash算法会将数据尽量均匀分布到集群中各个节点上去,但是不同节点上的数据不能进行批量操作,如mget、mset等。
如果想要强制指明将多个值都存放在一个节点上,以实现可以批量操作,可以使用{}来定义组。同组的数据,会在运算的时候强制将hash值算到一个范围中去。
3.3.查询集群中的值
4.故障处理
某组主从集体掉线以后,对应的这段插槽号集体失效,不会被均分到其他节点上。redis默认所有插槽都正常的时候才会对外正常提供服务,一旦出现上面的情况3,redis默认会无法正常进行工作,在配置文件中将cluster-require-full-coverage从注释中放出来,改为no即可修改默认机制。