当前位置: 首页 > news >正文

公司网站空间申请天娇易业网站建设公司

公司网站空间申请,天娇易业网站建设公司,南京网站优化步骤,重庆学校网站建设摘要#xff1a;一致性哈希是什么#xff0c;使用场景#xff0c;解决了什么问题#xff1f; 本文分享自华为云社区《16 张图解 #xff5c; 一致性哈希算法》#xff0c;作者#xff1a;小林coding。 如何分配请求#xff1f; 大多数网站背后肯定不是只有一台服务器… 摘要一致性哈希是什么使用场景解决了什么问题 本文分享自华为云社区《16 张图解 一致性哈希算法》作者小林coding。 如何分配请求 大多数网站背后肯定不是只有一台服务器提供服务因为单机的并发量和数据量都是有限的所以都会用多台服务器构成集群来对外提供服务。 但是问题来了现在有那么多个节点后面统称服务器为节点因为少一个字要如何分配客户端的请求呢 其实这个问题就是「负载均衡问题」。解决负载均衡问题的算法很多不同的负载均衡算法对应的就是不同的分配策略适应的业务场景也不同。 最简单的方式引入一个中间的负载均衡层让它将外界的请求「轮流」的转发给内部的集群。比如集群有 3 个节点外界请求有 3 个那么每个节点都会处理 1 个请求达到了分配请求的目的。 考虑到每个节点的硬件配置有所区别我们可以引入权重值将硬件配置更好的节点的权重值设高然后根据各个节点的权重值按照一定比重分配在不同的节点上让硬件配置更好的节点承担更多的请求这种算法叫做加权轮询。 加权轮询算法使用场景是建立在每个节点存储的数据都是相同的前提。所以每次读数据的请求访问任意一个节点都能得到结果。 但是加权轮询算法是无法应对「分布式系统」的因为分布式系统中每个节点存储的数据是不同的。 当我们想提高系统的容量就会将数据水平切分到不同的节点来存储也就是将数据分布到了不同的节点。比如一个分布式 KVkey-valu 缓存系统某个 key 应该到哪个或者哪些节点上获得应该是确定的不是说任意访问一个节点都可以得到缓存结果的。 因此我们要想一个能应对分布式系统的负载均衡算法。 使用哈希算法有什么问题 有的同学可能很快就想到了哈希算法。因为对同一个关键字进行哈希计算每次计算都是相同的值这样就可以将某个 key 确定到一个节点了可以满足分布式系统的负载均衡需求。 哈希算法最简单的做法就是进行取模运算比如分布式系统中有 3 个节点基于 hash(key) % 3 公式对数据进行了映射。 如果客户端要获取指定 key 的数据通过下面的公式可以定位节点 hash(key) % 3复制 如果经过上面这个公式计算后得到的值是 0就说明该 key 需要去第一个节点获取。 但是有一个很致命的问题如果节点数量发生了变化也就是在对系统做扩容或者缩容时必须迁移改变了映射关系的数据否则会出现查询不到数据的问题。 举个例子假设我们有一个由 A、B、C 三个节点组成分布式 KV 缓存系统基于计算公式 hash(key) % 3 将数据进行了映射每个节点存储了不同的数据 现在有 3 个查询 key 的请求分别查询 key-01key-02key-03 的数据这三个 key 分别经过 hash() 函数计算后的值为 hash( key-01) 6、hash( key-02) 7、hash(key-03) 8然后再对这些值进行取模运算。 通过这样的哈希算法每个 key 都可以定位到对应的节点。 当 3 个节点不能满足业务需求了这时我们增加了一个节点节点的数量从 3 变化为 4意味取模哈希函数中基数的变化这样会导致大部分映射关系改变如下图 比如之前的 hash(key-01) % 3  0就变成了 hash(key-01) % 4  2查询 key-01 数据时寻址到了节点 C而 key-01 的数据是存储在节点 A 上的不是在节点 C所以会查询不到数据。 同样的道理如果我们对分布式系统进行缩容比如移除一个节点也会因为取模哈希函数中基数的变化可能出现查询不到数据的问题。 要解决这个问题的办法就需要我们进行迁移数据比如节点的数量从 3 变化为 4 时要基于新的计算公式 hash(key) % 4 重新对数据和节点做映射。 假设总数据条数为 M哈希算法在面对节点数量变化时最坏情况下所有数据都需要迁移所以它的数据迁移规模是 O(M)这样数据的迁移成本太高了。 所以我们应该要重新想一个新的算法来避免分布式系统在扩容或者缩容时发生过多的数据迁移。 使用一致性哈希算法有什么问题 一致性哈希算法就很好地解决了分布式系统在扩容或者缩容时发生过多的数据迁移的问题。 一致哈希算法也用了取模运算但与哈希算法不同的是哈希算法是对节点的数量进行取模运算而一致哈希算法是对 2^32 进行取模运算是一个固定的值。 我们可以把一致哈希算法是对 2^32 进行取模运算的结果值组织成一个圆环就像钟表一样钟表的圆可以理解成由 60 个点组成的圆而此处我们把这个圆想象成由 2^32 个点组成的圆这个圆环被称为哈希环如下图 一致性哈希要进行两步哈希 第一步对存储节点进行哈希计算也就是对存储节点做哈希映射比如根据节点的 IP 地址进行哈希第二步当对数据进行存储或访问时对数据进行哈希映射 所以一致性哈希是指将「存储节点」和「数据」都映射到一个首尾相连的哈希环上。 问题来了对「数据」进行哈希映射得到一个结果要怎么找到存储该数据的节点呢 答案是映射的结果值往顺时针的方向的找到第一个节点就是存储该数据的节点。 举个例子有 3 个节点经过哈希计算映射到了如下图的位置 接着对要查询的 key-01 进行哈希计算确定此 key-01 映射在哈希环的位置然后从这个位置往顺时针的方向找到第一个节点就是存储该 key-01 数据的节点。 比如下图中的 key-01 映射的位置往顺时针的方向找到第一个节点就是节点 A。 所以当需要对指定 key 的值进行读写的时候要通过下面 2 步进行寻址 首先对 key 进行哈希计算确定此 key 在环上的位置然后从这个位置沿着顺时针方向走遇到的第一节点就是存储 key 的节点。 知道了一致哈希寻址的方式我们来看看如果增加一个节点或者减少一个节点会发生大量的数据迁移吗 假设节点数量从 3 增加到了 4新的节点 D 经过哈希计算后映射到了下图中的位置 你可以看到key-01、key-03 都不受影响只有 key-02 需要被迁移节点 D。 假设节点数量从 3 减少到了 2比如将节点 A 移除 你可以看到key-02 和 key-03 不会受到影响只有 key-01 需要被迁移节点 B。 因此在一致哈希算法中如果增加或者移除一个节点仅影响该节点在哈希环上顺时针相邻的后继节点其它数据也不会受到影响。 上面这些图中 3 个节点映射在哈希环还是比较分散的所以看起来请求都会「均衡」到每个节点。 但是一致性哈希算法并不保证节点能够在哈希环上分布均匀这样就会带来一个问题会有大量的请求集中在一个节点上。 比如下图中 3 个节点的映射位置都在哈希环的右半边 这时候有一半以上的数据的寻址都会找节点 A也就是访问请求主要集中的节点 A 上这肯定不行的呀说好的负载均衡呢这种情况一点都不均衡。 另外在这种节点分布不均匀的情况下进行容灾与扩容时哈希环上的相邻节点容易受到过大影响容易发生雪崩式的连锁反应。 比如上图中如果节点 A 被移除了当节点 A 宕机后根据一致性哈希算法的规则其上数据应该全部迁移到相邻的节点 B 上这样节点 B 的数据量、访问量都会迅速增加很多倍一旦新增的压力超过了节点 B 的处理能力上限就会导致节点 B 崩溃进而形成雪崩式的连锁反应。 所以一致性哈希算法虽然减少了数据迁移量但是存在节点分布不均匀的问题。 如何通过虚拟节点提高均衡度 要想解决节点能在哈希环上分配不均匀的问题就是要有大量的节点节点数越多哈希环上的节点分布的就越均匀。 但问题是实际中我们没有那么多节点。所以这个时候我们就加入虚拟节点也就是对一个真实节点做多个副本。 具体做法是不再将真实节点映射到哈希环上而是将虚拟节点映射到哈希环上并将虚拟节点映射到实际节点所以这里有「两层」映射关系。 比如对每个节点分别设置 3 个虚拟节点 对节点 A 加上编号来作为虚拟节点A-01、A-02、A-03对节点 B 加上编号来作为虚拟节点B-01、B-02、B-03对节点 C 加上编号来作为虚拟节点C-01、C-02、C-03 引入虚拟节点后原本哈希环上只有 3 个节点的情况就会变成有 9 个虚拟节点映射到哈希环上哈希环上的节点数量多了 3 倍。 你可以看到节点数量多了后节点在哈希环上的分布就相对均匀了。这时候如果有访问请求寻址到「A-01」这个虚拟节点接着再通过「A-01」虚拟节点找到真实节点 A这样请求就能访问到真实节点 A 了。 上面为了方便你理解每个真实节点仅包含 3 个虚拟节点这样能起到的均衡效果其实很有限。而在实际的工程中虚拟节点的数量会大很多比如 Nginx 的一致性哈希算法每个权重为 1 的真实节点就含有160 个虚拟节点。 另外虚拟节点除了会提高节点的均衡度还会提高系统的稳定性。当节点变化时会有不同的节点共同分担系统的变化因此稳定性更高。 比如当某个节点被移除时对应该节点的多个虚拟节点均会移除而这些虚拟节点按顺时针方向的下一个虚拟节点可能会对应不同的真实节点即这些不同的真实节点共同分担了节点变化导致的压力。 而且有了虚拟节点后还可以为硬件配置更好的节点增加权重比如对权重更高的节点增加更多的虚拟机节点即可。 因此带虚拟节点的一致性哈希方法不仅适合硬件配置不同的节点的场景而且适合节点规模会发生变化的场景。 总结 不同的负载均衡算法适用的业务场景也不同的。 轮训这类的策略只能适用与每个节点的数据都是相同的场景访问任意节点都能请求到数据。但是不适用分布式系统因为分布式系统意味着数据水平切分到了不同的节点上访问数据的时候一定要寻址存储该数据的节点。 哈希算法虽然能建立数据和节点的映射关系但是每次在节点数量发生变化的时候最坏情况下所有数据都需要迁移这样太麻烦了所以不适用节点数量变化的场景。 为了减少迁移的数据量就出现了一致性哈希算法。 一致性哈希是指将「存储节点」和「数据」都映射到一个首尾相连的哈希环上如果增加或者移除一个节点仅影响该节点在哈希环上顺时针相邻的后继节点其它数据也不会受到影响。 但是一致性哈希算法不能够均匀的分布节点会出现大量请求都集中在一个节点的情况在这种情况下进行容灾与扩容时容易出现雪崩的连锁反应。 为了解决一致性哈希算法不能够均匀的分布节点的问题就需要引入虚拟节点对一个真实节点做多个副本。不再将真实节点映射到哈希环上而是将虚拟节点映射到哈希环上并将虚拟节点映射到实际节点所以这里有「两层」映射关系。 引入虚拟节点后可以会提高节点的均衡度还会提高系统的稳定性。所以带虚拟节点的一致性哈希方法不仅适合硬件配置不同的节点的场景而且适合节点规模会发生变化的场景。
http://www.zqtcl.cn/news/484849/

相关文章:

  • 做微网站是订阅号还是服务号号网站建设叫什么软件
  • 美团初期是怎么建网站特效视频素材网站
  • 网站建设行业市场分析刚创业 建网站
  • 网站推广昔年下拉wordpress 首页添加链接地址
  • 网站年费推荐专业做网站公司
  • 邵东微网站建设设计网页图片
  • 沈阳高端做网站建设应用软件商店
  • 05网站首页设计说明
  • 给企业做网站运营手机做简单的网站
  • 做网站卖广告国家公示企业信息查询系统
  • 西安网站建设公司找哪家如何做平台推广赚钱
  • 网站优化个人工作室怎么找网站开发公司
  • 如何把网站一个栏目做301跳转推广途径
  • 房山做网站北京本地网络推广平台
  • 网站建设 麓谷政法网站建设有哪些不足
  • 湖北网站建设路建设工程安全事故在哪个网站查
  • 建筑公司查询网站网站开发 系统需求文档
  • 温州做网站的公司有哪些宝塔搭建wordpress主机地址
  • 重庆商务网站建设南昌新力中心 nanchang sinic center
  • 潍坊建设厅官方网站店铺网络营销策划方案
  • 东营聊城网站建设博客论坛用wordpress
  • 哈尔滨中国建设银行网站首页seo快速入门教程
  • 网站建设项目环境影响评价目录南宁网站建设索王道下拉
  • 广州富邦物流网站建设南宁住房和城乡建设部网站
  • asp.net 公司网站全面的移动网站建设
  • 中国空间站官网app下载平台有哪些
  • 做外贸网站报价单做网站需要什么证件吗
  • 网站可以做视频链接东红物流网站建设规划书
  • 自己的网站网站免费部署
  • 广州专业的网站建设公司镇海seo关键词优化费用