Redis的切片集群(Redis Cluster)以及集群管理

首先放上一张整合redis切片集群与主从库的关系图,可以结合该图阅读下面文字。
请添加图片描述

一、数据库的扩容机制

  • 纵向扩展:增大服务器的内存,磁盘容量;
  • 横向扩展:增加多台服务器。

如果数据量在一定范围内,且不需要开启持久化可以选择使用纵向扩展,一般选择横向扩容(持久化时需要fork主进程,会拷贝一份主进程的内存,如果内存中数据量大,该fork过程就需要很长时间,而fork是会阻塞主线程处理客户端请求的)。

二、为什么使用切片集群

百万千万级的大数据量时:

  • 单机Redis部署需要很大的内存,硬件成本高;
  • 大数据量持久化时fork主进程的过程耗时高(主进程阻塞)。

ps:影响redis速度的原因归根结底就是主进程执行速度受到了影响

  1. 主线程本身造成(sql语句的读写、删除操作):增删改查;
  2. fork操作间接影响主线程(一些会产生fork过程的操作,抢占主进程的CPU资源):AOF重写、数据持久化落盘。

三、Redis切片集群的部署方式

1. 请求路由

默认每个redis实例均分16384个哈希槽(如果每台服务器性能不一致,可以用cluster_addslot指令手动分配每台服务器的槽个数),对于每一个key,求CRC16(key) % 16384得到的值就是slot的序号,找到该slot所在的redis实例,将该(K,V)键值对加入该实例的该slot中。

在这里插入图片描述
该过程主要有两步:

  1. 在客户端计算,找到key对应的slot(用CRC16算法);
  2. 找到存放该slot的redis实例(不一定按照一定的规律在实例中顺序存放slot)。

第一步可以简单计算处理,对于第二步:

客户端会在本地缓存一份集群中每个redis实例包含的slot编号(slot—实例映射表),计算出slot编号后在缓存中查找对应的实例,再直接将请求发给该实例。

注意:在客户端与redis集群建立连接的环节,客户端先访问一个redis实例,然后该redis实例会将它本身以及切片集群中其他实例各自包含的slot信息发给客户端,此时客户端中才能得到实例与slot映射关系,然后在本地缓存。(redis切片集群中各cluster通过gossip机制相互通信,获取各自的slot–实例映射关系表)

2. 集群扩容

重定向机制
当实例有增加或者删除时,为了负载均衡slot要重新分配到各个cluster实例中,此时客户端还没有更新本地缓存中原有的slot、实例映射表,可能访问的slot就会移动到新的实例中,此时客户端访问的实例就会将新实例的地址发送给客户端(向客户端发送一个MOVED命令),客户端再根据该实例地址再去新实例中找slot(同时更新新的slot、实例映射表)。

3. slot中间层解耦

客户端对redis的数据请求需要经过slot这层中间层,为什么要借助slot进行两次映射,而不是直接将数据(K,V)放在实例中?可以看下图
请添加图片描述

原因如下:

  1. 采用hash算法对数据量进行压缩,否则百千万个key放在一张表中会占用大量内存空间(相当于将一张大的数据表做分表,可以提高效率,节省内存空间),这点强调的是一张表的大小
  2. 每个redis实例只需要存放slot—实例之间的映射关系表(slot最多只有16384条记录,属于万级,相比于千万级的key—实例表来说极大的节省了内存空间),这点强调的是每个节点要保存一张表的大小
  3. 集群扩容缩容是以slot为单位移动数据,而不是一次次移动每一个(K,V),时刻注意slot最多16384行,(K,V)对有千万行(前者移动几万次,后者移动千万次)。

四、扩展知识:集群管理的两个核心知识

1. 请求路由方案

  • 中心化方案:使用proxy代理(Codis),客户端通过访问proxy,由proxy路由到对应的服务节点
    Codis是在cluster之前被广泛使用的Redis集群配置方案,主要由(Codis server, Codis proxy, Codis dashboard, Codis fe以及Zookeeper组成,支持数据的异步迁移,但是不支持Redis新版本的特性,可以按需选择使用Codis还是Cluster)
  • 去中心化:Redis的cluster方案,客户端与每个集群节点都缓存有各个服务节点地址,客户端可以直接访问目标节点,或者由任意节点路由到目标节点

请添加图片描述

2. 数据迁移方案

  • 离线扩容:服务器需要停机进行扩容(Twemproxy);
  • 在线扩容:服务器可以一边扩容,一边接受客户端请求(Redis Cluster同步迁移,Codis异步迁移),节点重定向机制实现或者Proxy在线更新路由表。

参考文章:

https://time.geekbang.org/column/article/276545

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值