架构-6.高可用架构之一致性哈希算法和数据分片

架构-1:高性能架构之读写分离和分表分库
架构-2:高性能架构之NoSQL和缓存
架构-3:高性能架构之单机高性能和负载均衡
架构-4:高可用架构之存储高可用
架构-5:高可用架构之Paxos和Raft
架构-6:高可用架构之一致性哈希算法和数据分片
架构-7.高可用架构之接口级故障

一致性哈希算法

一致性哈希算法是构建一个0~2^32的整数环,即首尾相连。

假设存放的是缓存数据。
每一个槽位可以存放一个缓存服务器。
当一个请求过来,可以根据ip和port计算出hash,然后根据顺时针,找到最近的缓存服务器。
这样的设计实现了容错性和可伸缩性,即使某台机器宕机了,那么顺时针就找到下一台机器了,加入机器也是找到一个槽位直接加入即可。

但是这样还是存在均衡性的问题,如果某一台机器宕机,原本这台机器的所有缓存都会堆积到下一台机器,导致下一台机器的请求翻倍。为了解决这个问题,一致性哈希算法引入的虚拟节点,即一台真实的机器可以对应多个哈希槽,具体的做法是在主机或者服务器IP后增加编号。

在这里插入图片描述

即使某一台服务器挂了,那么该服务器的压力会分配给多个虚拟节点的多个下台服务器,实现了均衡性。

但是一致性哈希算法还存在一个问题,当加入新的节点或者移除时,可能会导致大量的缓存请求不被命中,所以在加入新节点或者移除旧节点时,需要进行预热。

数据分片

redis集群使用的并不是一致性哈希算法来实现数据分散,而是使用数据分片。

  • 均衡性
    redis集群将数据库分为16384(2^14)个槽,一个key值到底属于哪个槽位由 crc16(key) &16384 计算得出,crc16是一种生成校验码的算法,crc16(key) 可以理解为生成key值得哈希码。而&16384则是计算出一个介于0~16383之间的值(这里并不是使用取余算法,&效率要更高)。
    redis里的每个节点保存了所有的节点分别负责哪些槽位(通过传播来告知其他节点自己所负责的槽位),可以通过配置来指定节点负责哪些槽位,只有当16384个槽位备全部分发了,集群才可以正常使用。
    指定7001节点负责5001~10000的槽位。
127.0.0.1:7001> CLUSTER ADDSLOTS 5001 5002 5003 5004 ... 10000
OK

如果访问了不包含该key值得redis节点,redis会返回一个MOVED错误,错误的信息中包含了正确的节点的信息,客户端通过该信息再次访问正确的redis节点。
在这里插入图片描述

  • 可伸缩性
    上文中redis实现了均衡性。而可伸缩性是通过重新分片来实现的。当增加一个节点时,redis会将新节点配置的槽位的信息先复制到新的节点。并将槽位指令指派给新节点。
    在这里插入图片描述

  • 容错性
    redis的容错性是由主从节点来实现的,主节点负责槽位命令的执行,而从节点只用于复制主节点的数据。从节点可能有多个,所以当主节点宕机后,从节点选举出新的主节点。。

redis使用数据分片的实现,相比一致性哈希算法,优点是避免新增节点时不会导致大量的缓存无法命中。使用主从结构提高容错性,避免某台机器宕机后导致大量命令命中失败。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值