图解分布式DB/redis的几种路由算法(一致性哈希)
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
背景
随着应用的越做越大,数据量越来越多,不论是MySQL数据库的单库单表还是单台redis都无法满足高并发的读写操作和大数据量的存储功能,因此有了大家耳熟能详的分库分表。
垂直拆分和水平拆分
垂直拆分,即拆分列,从业务上将原来一个表的信息拆到两个表中,形象的理解为垂直的一把刀切开了表
水平拆分,即拆分行,通过某种规则将一个表中的数据拆分到不同的表中,形象的理解为水平的一把刀切开了表
当然垂直拆分和水平拆分的概念不是本文要讨论的重点,本文要讨论的是水平拆分的规则。水平拆分的本质其实和分布式系统下微服务的思想不谋而合,微服务的出现笔者前文提到过是因为单个服务承载了太多的业务逻辑,导致出现了诸如代码逻辑庞大复杂、开发人员关系耦合、单点故障等问题。这些问题对于DB和redis同样会有:
- 当访问请求越来越多时,单机的DB/redis无法分配足够的线程抗住高并发的请求
- 当数据量越来越大时,从一碗水中找一根针和从一片大海中找一根针的难度和耗时也是不一样的,我们要做的是找到那个碗,然后从碗里捞针
所以我们需要将DB/redis扩展为多台。
几种分布式集群中的路由算法
相信前面的介绍已经说明了水平拆分的必要性,现在的问题就是如何拆分,按何种规则将不同的数据归类到不同的mysql库/mysql表/redis机器上。下面我们以userid作为key为例。
固定哈希
固定哈希很好理解,笔者现在所在的部门数据库的分库分表逻辑就是简单的 (userid % 32) ^ (userid >> 32),取了userid的高32位和低32位进行了与运算。
这么做的好处是逻辑简单,相信这也是很多公司db业务的分库分表方法,如果能够保证用户的id能够均匀分布在每个分片上。
缺点是伸缩性差,当需要新增服务时,新机器根本路由不到;当需要下线服务时,由于固定哈希必然会导致请求到该服务的请求失败。
一致性哈希
一致性哈希带来的最大变化就是把节点对应的哈希值变成了一个范围,可以将一致性哈希想象成一个环形的钟表,现在我们在12点、4点、8点钟反向分别有三台机器,这时候我们算出hash(key)之后就去找离它最近的机器节点
例如这里hash(key)=2,则找到了4点钟方向的节点
一致性哈希虽然能够稳定的将请求切换到新机器,但是它也有一些小缺陷。因为 hash取模算法得到的结果是随机的,我们并不能保证各个服务节点能均匀的分配到哈希环上,这就导致了经典的热点问题,又叫数据倾斜问题,例如如图情况会导致8点钟服务承受了过多的负载。
引入虚拟节点的一致性哈希
为了应对上面的问题,我们引入了虚拟节点的概念,我们通过对每个机器映射出多个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
从而实现一个机器在环上有多个虚拟节点,如图
自定义计算方式
如上文所述,笔者所在的公司前期的分库规则是固定哈希,但是随后结合业务实际表现来看有部分用户(称为大户)访问量是小用户的n倍,和普通用户路由到一个db或redis中势必会影响到普通用户的读写,因此对于这些特殊的户单独做了一个规则路由到分片号为9999的特殊分片。
以上这种模式其实就是自定义计算方式。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-08-01
本文作者:ackpotDC
本文来自:“掘金”,了解相关信息可以关注“掘金”
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
容器相对于虚拟机在存储方面的优势
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 现代企业的成功取决于以数据为中心的规划速度和效率。数据提供了一种战略优势,为开发人员提供正确的工具和数据对于满足业务需求至关重要。 因此,企业正在迅速认识到容器相对于虚拟机的优势,以实现ITOps和DevOps实践的现代化。在对IT存储管理员最近的一项调查中,Enterprise Storage Group(ESG)公司发现,41%的受访者表示将容器用于生产应用程序,另外33%的受访者表示将容器用于测试/开发活动。 人们通常将容器与虚拟机进行比较,尽管容器规模更小并且需要的开销更少。这两种应用程序可以采用相同的基础设施,这一点很诱人。实际上,容器与虚拟机有很大不同。如果目标是使基于容器的应用程序环境的价值最大化,那么了解这些差异如何影响IT基础设施设计是至关重要的。 容器与虚拟机之间的主要区别 与虚拟机不同,容器持续的时间是短暂的,它们会自动启动和关闭。但是像虚拟机一样,容器需要访问持久性存储,以在生产环境中发挥其全部潜力。如果没有持久性存储,则在容器关闭时数据会“死亡”。基于容器的应用...
- 下一篇
物联网和人工智能在疫苗研发中的作用
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 出于显而易见的原因,研发疫苗是人们目前的首要考虑目标。寻找安全有效的冠状病毒疫苗是成千上万甚至数百万人的生命以及全球经济健康的基础。 在疫苗研发过程中,物联网和人工智能技术将发挥重要作用。 这是因为疫苗研发需要收集和分析大量数据,而物联网和人工智能可以帮助解决这两个问题。物联网可以促进快速且经济高效的数据收集,而人工智能可以使数据分析比人类更快、更全面。 数据收集 数据收集贯穿整个药物研发过程。在过程开始时,它可能涉及收集有关多种不同现有药物和分子的数据——几万甚至几十万种。物联网可以在促进从多个不同实验室和研究中心收集数据的过程中发挥作用 然后,当新的分子和药物被开发出来的时候,很明显在整个测试过程中存在无数不同的数据收集层。在实验室环境中,物联网技术可以再次通过智能传感器和连网的实验室设备自动收集相关数据。关键信息可以直接输入计算机进行分析,而无需手动收集。 再然后,当疫苗准备好进行人体试验时,需要对这些人体受试者进行非常仔细的监测。必须严格观察和测量无数不同的生命体征,以了解药物如...
相关文章
文章评论
共有0条评论来说两句吧...