主从

哨兵

集群

集群扩容

1、节点加入集群
2、对扩展节点发送cluster setslot { slot } importing { sourceNodeId } 命令
3、对原节点发送cluster setslot { slot } migrating { targetNodeId } 命令
4、源节点执行 cluster getkeysinslot { slot } { count }
5、源节点执行 migrate { targetNodeIp} “ “ 0 { timeout } keys { key… }
6、迁移完成后 向所有节点发送 cluster setslot { slot } node { targetNodeId }

集群收缩

1、迁移下线节点对应的虚拟槽,迁移过程如上
2、迁移完成向剩余节点发送 cluster forget { downNodeId } ,忘记下线节点

分片策略

范围分片

顺序相邻近的数据放在一起,可以很好的支持遍历操作。
面对顺序写,会存在热点问题,写入的热点永远在最后一个分片。(不均匀)
适用于关系型数据库。(数据库分区)

哈希分片

获取key的hash值,根据节点数求模,根据余数将数据放到分片中
增加或删除节点,会导致大量key失效

一致性hash算法

将哈希值空间虚拟成一个环(哈希环),0与65536重合,将节点和数据的键值hash之后放到哈希环中,数据顺时针定位到相应的节点上
增删服务器节点只需要重定位部分数据,具有较好的容错和可扩展性
节点少时分配不均匀
解决方案:增加虚拟节点

哈希槽

设置16384个虚拟槽,数据的键值通过CRC16计算出hash值跟16383取模后放到虚拟槽中,每个节点管理一部分槽,增删节点只需要移动槽即可
解耦数据与节点,简化了节点扩容和收缩难度
节点的配置信息维护槽的映射关系,不需要额外的维护资源
支持节点、槽、数据之间的映射查询,便于数据路由,在线集群伸缩

为什么16384个槽

1、槽位越多,心跳信息的消息头越大,浪费带宽。65536为8k,16384为2k
2、设计原因,节点数不会超过1000个,16384个槽足够使用
3、节点的配置信息,哈希槽是以bitmap保存的。传输过程中会进行压缩。填充率=slots/n,当n一定时,slots越多,填充率越高,压缩率越低。

哈希算法

MD5

消息摘要算法 Message-Digest Algorithm
一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),MD5算法将数据(如一段文字)运算变为另一固定长度值,是散列算法的基础原理。由美国密码学家 Ronald Linn Rivest设计,于1992年公开并在 RFC 1321 中被加以规范。

CRC

循环冗余校验 Cyclic Redundancy Check
一种根据网络数据包或电脑文件等数据,产生简短固定位数校验码的一种散列函数,由 W. Wesley Peterson 于1961年发表。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。由于本函数易于用二进制的电脑硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。

MurmurHash

MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。由 Austin Appleby 在2008年发明,并出现了多个变种,与其它流行的哈希函数相比,对于规律性较强的键,MurmurHash的随机分布特征表现更良好。
这个算法已经被很多开源项目使用,比如libstdc++ (4.6版)、Perl、nginx (不早于1.0.1版)、Rubinius、 libmemcached、maatkit、Hadoop等。