首先放上一张整合redis切片集群与主从库的关系图,可以结合该图阅读下面文字。
一、数据库的扩容机制
- 纵向扩展:增大服务器的内存,磁盘容量;
- 横向扩展:增加多台服务器。
如果数据量在一定范围内,且不需要开启持久化可以选择使用纵向扩展,一般选择横向扩容(持久化时需要fork主进程,会拷贝一份主进程的内存,如果内存中数据量大,该fork过程就需要很长时间,而fork是会阻塞主线程处理客户端请求的)。
二、为什么使用切片集群
百万千万级的大数据量时:
- 单机Redis部署需要很大的内存,硬件成本高;
- 大数据量持久化时fork主进程的过程耗时高(主进程阻塞)。
ps:影响redis速度的原因归根结底就是主进程执行速度受到了影响
- 主线程本身造成(sql语句的读写、删除操作):增删改查;
- fork操作间接影响主线程(一些会产生fork过程的操作,抢占主进程的CPU资源):AOF重写、数据持久化落盘。
三、Redis切片集群的部署方式
1. 请求路由
默认每个redis实例均分16384个哈希槽(如果每台服务器性能不一致,可以用cluster_addslot指令手动分配每台服务器的槽个数),对于每一个key,求CRC16(key) % 16384得到的值就是slot的序号,找到该slot所在的redis实例,将该(K,V)键值对加入该实例的该slot中。
该过程主要有两步:
- 在客户端计算,找到key对应的slot(用CRC16算法);
- 找到存放该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)放在实例中?可以看下图
原因如下:
- 采用hash算法对数据量进行压缩,否则百千万个key放在一张表中会占用大量内存空间(相当于将一张大的数据表做分表,可以提高效率,节省内存空间),这点强调的是一张表的大小;
- 每个redis实例只需要存放slot—实例之间的映射关系表(slot最多只有16384条记录,属于万级,相比于千万级的key—实例表来说极大的节省了内存空间),这点强调的是每个节点要保存一张表的大小;
- 集群扩容缩容是以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
原文链接:https://blog.csdn.net/skye_fly/article/details/119801688
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/17001