数据分区
哈希分区
特点:数据分散度高,键值分布业务无关,无法顺序访问,支持批量操作
典型产品:一致性哈希Memcache,Redis Cluster,其他缓存产品。
顺序分区
特点:数据分散度易倾斜,键值业务有关,可顺序访问,不支持批量操作
典型产品:BigTable ,HBase等
哈希分布三种方式:
节点取余分区:hash(key)%nodes
问题:如果对结点扩容,需要添加节点
缺点:添加节点会有问题,数据会有迁移。
解决方式:建议使用多倍扩容(节点成倍扩容)
总结:
客户端分片:哈希+取余
节点伸缩:数据节点关系变化,导致数据迁移
迁移数量和添加节点数量有关,建议使用翻倍扩容
一致性哈希分区(一般在节点比较多的时候使用比较好)
添加一个node5之后只影响node2 和node4,不影响node3和node1
一致性哈希总结:
客户端分片:哈希+顺时针(优化取余)
节点伸缩:只影响邻近节点,但是还是有数据迁移
翻倍伸缩:保证最小迁移数据和负载均衡
哈希分区之虚拟槽分区
简介:
Redis Cluster采用的就是虚拟槽分区虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,这些整数就定义为槽(slot)。
Redis Cluster槽的范围是0 ~ 16383,即一共16384个槽。
槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,
每个节点(redis实例)负责一定数量的槽。
预设虚拟槽 : 每个槽映射一个数据子集,一般比字节数大
良好的哈希函数:例如CRC16
服务端管理节点,槽,数据:例如Redis Cluster
虚拟槽分配图解:
Redis Cluster 架构图
cluster-enabled:yes 是否集群模式
如果三个节点如下:
三个节点如果六个节点如下:
六个节点指派槽:
对于客户端来说,只需要计算一个key,算出对应的槽(slot)
Redis Cliuster特性:
Redis Cliuster特性
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的master节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->key
2) redis-cluster选举:容错 如下图:
redis-cluster选举:容错(1)选举过程是集群中所有master参与,如果半数以上master节点与故障节点通信超时(cluster-node-timeout),认为该节点故障,自动触发故障转移操作.
(2):什么时候整个集群不可用(cluster_state:fail)?
a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态.
ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.
b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.
ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误
网友评论