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

背景

随着应用的越做越大,数据量越来越多,不论是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] 一致哈希-维基百科

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343