一、产生背景

1、虽然单机redis的qps已经达到了10万之多,但是有些突发情况下并发量可能会达到百万级,还有内存不够用的问题,这些情况下,单机已经无法满足业务环境

2、直观的解决方案就是增加服务器

3、在2015年的redis3.0+版本中加入了redis cluster,可以实现分布式集群的架构,将原本单机的数据进行分区,分到若干个子集中

二、分区方式

1、顺序分区

①原理:数据均匀顺序分布到若干节点,比如300个数据分配3个节点,1100号数据在1号节点,101200号数据在2号节点,201~300号数据在3号节点,很多关系型数据库就是使用此方式

②特点:数据分散度容易倾斜,键值分布与业务相关,可顺序访问,支持批量操作

③产品举例:bigtable

2、哈希分区

①原理:数据无序分布到若干节点,如节点取余分区,一致性哈希分区,虚拟槽分区

②特点:数据分散度高,键值分布与业务无关,无法顺序访问,支持批量操作

③产品举例:memcache,redis cluster

④节点取余分区:节点扩容与缩容时,很多数据需要迁移,建议翻倍扩容或半数缩容,可以使数据偏迁移率在最低的50%

redis 集群 fix redis 集群 分布式 分片_redis


redis 集群 fix redis 集群 分布式 分片_数据_02

⑤一致性哈希分区:每个节点负责一部分数据,对key进行hash,得到结果在node1和node2之间,就放到node2中,顺时针查找,假设添加一个新节点node5,现在只需要迁移一小部分数据,不会影响node3和node4的数据,只会迁移node1和node2的数据,节点比较多的话合适,假设有1000个节点,加一个只要迁移千分之一的数据

redis 集群 fix redis 集群 分布式 分片_客户端_03


redis 集群 fix redis 集群 分布式 分片_redis_04

⑥虚拟槽分区:预设虚拟槽,每个槽映射一个数据子集,如redis cluster,槽的范围是0~16383,使用CRC16哈希函数,服务端管理槽和节点,把16384个槽平均分配到每个节点,客户端会把数据发送给任意一个节点,通过CRC16对key进行哈希对16383进行取余,算出当前key属于哪部分槽,属于哪个节点,每个节点都会记录是不是负责这部分槽,如果是负责的,进行保存,如果槽不在自己范围内,redis cluster是共享消息的模式,它知道哪个节点负责哪些槽,返回结果,让客户端去找对应的节点

redis 集群 fix redis 集群 分布式 分片_redis_05

三、分布式集群搭建

1、架构:每个节点之间相互通信,都负责读写,客户端去存,如果不是当前节点,会返回应该存到哪个节点

redis 集群 fix redis 集群 分布式 分片_redis 集群 fix_06

2、redis cluster特性:节点,meet,指派槽,复制,高可用

①meetA meet一下C,C回复一下,A meet一下B ,B回复一下,这样B和C也能相互感知,A,B,C之间就可以相关交互数据,所有节点共享消息

②指派槽:总共有16383个槽,平均分配到每个节点上

redis 集群 fix redis 集群 分布式 分片_客户端_07


redis 集群 fix redis 集群 分布式 分片_redis 集群 fix_08

四、安装使用等:http://liuqingzheng.top/db/Redis系列/08-Redis系列之-Redis-Cluster/