美文网首页
图解分布式DB/redis的几种路由算法(一致性哈希)

图解分布式DB/redis的几种路由算法(一致性哈希)

作者: JackpotDC | 来源:发表于2020-08-08 20:11 被阅读0次

背景

随着应用的越做越大,数据量越来越多,不论是MySQL数据库的单库单表还是单台redis都无法满足高并发的读写操作和大数据量的存储功能,因此有了大家耳熟能详的分库分表

垂直拆分和水平拆分

垂直拆分,即拆分列,从业务上将原来一个表的信息拆到两个表中,形象的理解为垂直的一把刀切开了表

image

水平拆分,即拆分行,通过某种规则将一个表中的数据拆分到不同的表中,形象的理解为水平的一把刀切开了表

image

当然垂直拆分和水平拆分的概念不是本文要讨论的重点,本文要讨论的是水平拆分的规则。水平拆分的本质其实和分布式系统下微服务的思想不谋而合,微服务的出现笔者前文提到过是因为单个服务承载了太多的业务逻辑,导致出现了诸如代码逻辑庞大复杂、开发人员关系耦合、单点故障等问题。这些问题对于DB和redis同样会有:

  • 当访问请求越来越多时,单机的DB/redis无法分配足够的线程抗住高并发的请求
  • 当数据量越来越大时,从一碗水中找一根针和从一片大海中找一根针的难度和耗时也是不一样的,我们要做的是找到那个碗,然后从碗里捞针


    大碗捞针
    大海捞针

所以我们需要将DB/redis扩展为多台。

几种分布式集群中的路由算法

相信前面的介绍已经说明了水平拆分的必要性,现在的问题就是如何拆分,按何种规则将不同的数据归类到不同的mysql库/mysql表/redis机器上。下面我们以userid作为key为例。

固定哈希

固定哈希很好理解,笔者现在所在的部门数据库的分库分表逻辑就是简单的 (userid % 32) ^ (userid >> 32),取了userid的高32位和低32位进行了与运算。

image
这么做的好处是逻辑简单,相信这也是很多公司db业务的分库分表方法,如果能够保证用户的id能够均匀分布在每个分片上。
缺点是伸缩性差,当需要新增服务时,新机器根本路由不到;当需要下线服务时,由于固定哈希必然会导致请求到该服务的请求失败。

一致性哈希

一致性哈希带来的最大变化就是把节点对应的哈希值变成了一个范围,可以将一致性哈希想象成一个环形的钟表,现在我们在12点、4点、8点钟反向分别有三台机器,这时候我们算出hash(key)之后就去找离它最近的机器节点

一致性哈希是一个钟表
例如这里hash(key)=2,则找到了4点钟方向的节点
image

一致性哈希虽然能够稳定的将请求切换到新机器,但是它也有一些小缺陷。因为 hash取模算法得到的结果是随机的,我们并不能保证各个服务节点能均匀的分配到哈希环上,这就导致了经典的热点问题,又叫数据倾斜问题,例如如图情况会导致8点钟服务承受了过多的负载。

image

引入虚拟节点的一致性哈希

为了应对上面的问题,我们引入了虚拟节点的概念,我们通过对每个机器映射出多个hash,

hashA = hash("192.168.0.1-A") % 32
hashB = hash("192.168.0.1-B") % 32
hashC = hash("192.168.0.1-C") % 32

从而实现一个机器在环上有多个虚拟节点,如图


image

自定义计算方式

如上文所述,笔者所在的公司前期的分库规则是固定哈希,但是随后结合业务实际表现来看有部分用户(称为大户)访问量是小用户的n倍,和普通用户路由到一个db或redis中势必会影响到普通用户的读写,因此对于这些特殊的户单独做了一个规则路由到分片号为9999的特殊分片。

ip = \begin{cases} ip[userid \% 32],\quad userid\ not\ in\ big\ users \\ ip[9999], \quad userid\ in\ big\ users \end{cases}

以上这种模式其实就是自定义计算方式。

reference

[1] 分布式系统中一致性哈希算法
[2] 大型网站系统与Java中间件开发实践
[3] 一致哈希-维基百科

相关文章

  • 图解分布式DB/redis的几种路由算法(一致性哈希)

    背景 随着应用的越做越大,数据量越来越多,不论是MySQL数据库的单库单表还是单台redis都无法满足高并发的读写...

  • Redis随笔(1)

    ShardedJedis是基于一致性哈希算法实现的分布式Redis集群客户端 Redis操作都是原子的,不用考虑并...

  • Redis-Cluster

    Redis Cluster是一个高性能高可用的分布式系统。由多个Redis实例组成的整体,数据按照一致性哈希算法存...

  • Redis分布式

    1 Redis分布式算法原理 1.1 传统分布式算法 1.2 Consistent hashing一致性算法原理 ...

  • redis入门-一致性哈希算法

    一、前言 这次我们来讨论下redis cluster依赖的一个核心的算法,一致性哈希算法。我们都知道,redis ...

  • 一致性哈希和哈希槽对比

    背景 随着memcache和redis的出现,更多人认识到了一致性哈希。 一致性哈希用于解决分布式缓存系统中的数据...

  • 一致性哈希和哈希槽对比

    背景 随着memcache和redis的出现,更多人认识到了一致性哈希。 一致性哈希用于解决分布式缓存系统中的数据...

  • Redis之旅--Redis集群(九)

    一、Redis Cluster模式 redis集群并没有使用一致性hash算法而引入了哈希槽概念,Redis 集群...

  • 一致性哈希 Go 语言版简单实现

    在分布式系统中,经常提到一致性哈希算法,那么,这个一致性哈希算法到底是干什么的?具体解决了什么问题呢?简单的回答就...

  • 自己实现一个一致性 Hash 算法

    前言 在前文分布式理论(八)—— Consistent Hash(一致性哈希算法)中,我们讨论了一致性 hash ...

网友评论

      本文标题:图解分布式DB/redis的几种路由算法(一致性哈希)

      本文链接:https://www.haomeiwen.com/subject/wunerktx.html