突破领导者的限制

突破领导者的限制

问题

假设我们使用 Raft 算法实现了一个 KV 服务。虽然领导者简化了共识协商,但是写请求只能在领导者上处理(如果系统设计要求强一致性,那么读请求也应该由领导者处理),所以集群的接入性能相当于单机。随着业务的发展,系统很容易到达性能瓶颈。

那么,怎么突破领导者的限制呢?方法就是数据分片,即每个集群只负责存储一部分数据。所有集群的数据合起来才是全部数据。

为了方便,以下用节点来代替集群。

那怎么决定哪些数据由哪个节点存储呢?我们需要在客户端和节点之间加一层 Proxy 层:Proxy 层接收客户端的请求,通过对 key 哈希,然后取模来决定由哪个节点来处理该请求。

哈希算法

使用哈希算法,我们是这样切分流量的:假设客户端的请求中有一个 key,Proxy 层接收到请求后,根据下列公式,计算出处理该请求的节点:cluster_index = hash(key) % cluster_num

这种哈希算法优点是简单、快速。但是当节点的数量发生变更时,同一个 key 计算出的节点索引也会变化,导致无法定位到数据。这种情况下,我们就需要迁移数据。迁移数据的成本非常高。例如,从 3 个节点变更为 4 个节点,75% 的数据需要迁移,成本非常高。

一致性哈希算法

我们希望有一种哈希算法:在发生节点数量变更时,迁移尽量少的数据。一致性算法能满足我们的要求。

算法原理

算法原理为:

  • 将一个虚拟圆环分为 2^32 份,按顺时针方向,从 0 开始,直到 2^32 - 1。

  • 使用某种哈希算法,将各个节点映射到圆环上。

  • 当需要对指定的 key 读写时,需要

    • 使用某种哈希算法,计算出 key 在圆环上的位置
    • 沿着顺时针方向找到的第一个节点,就是 key 对应的节点。
GuWw2n.jpg

假设,如果节点 C 故障了,那么只会影响故障节点与其前一个节点间的数据,它们都会被路由到故障节点的下一个节点。

GuhVte.jpg

所以,相比哈希算法,如果使用一致性哈希算法,从 3 个节点变更为 4 个节点,只有 25% 的数据需要迁移,成本为原来的 1/3。

假设,如果新增一个节点 D,那么只会影响新节点与其前一个节点间的数据,它们都会被路由到新节点。

[站外图片上传中...(image-58f87f-1590412658301)]

总的来说,一致哈希算法具有较好的容错性和可扩展性。

虚拟节点

在哈希寻址中,经常会出现这样的问题:客户端请求的 key 比较集中,有的机器负载高,有的机器负载低,那有什么办法使得访问均匀分布吗?答案是虚拟节点

其实,每个节点有多个哈希值分布在虚拟圆环上,并且同一个节点的多个哈希值是相邻的,不会出现交叉的情况。一个哈希值对应一个虚拟节点,并将虚拟节点映射到实际节点。

Gu4w2d.jpg

对比

当节点数量越多时,哈希算法的迁移数量越大,一致性哈希算法的迁移数量越小。使用一致哈希实现哈希寻址时,可以通过增加节点数降低节点宕机对整个集群的影响,以及故障恢复时需要迁移的数据量。

提高 Raft 集群的可用性

在多个 Raft 集群组成的 KV 系统中,如何设计一致哈希,实现当某个集群的节点出现了故障时,整个系统还能稳定运行呢?

答:数据要同时写入当前集群和下一个集群。某个Raft集群挂掉后,原本路由到这个集群的请求,现在都到下一个Raft集群去了。只要下一个Raft集群保存了上一个集群的数据,即使某个集群挂了,整个系统还能正常提供服务。只有两个相邻集群都同时挂掉时,某个集群数据才不能访问。

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