有没有好奇过redis、memcache等是怎么实现集群负载均衡的呢?

其实他们都是通过一致性hash算法实现节点调度的。

讲一致性hash算法前,先简述一下求余hash算法:

hash(object)%N
  • 一个缓存服务器宕机了,这样所有映射到这台服务器的对象都会失效,我们需要把属于该服务器中的缓存移除,这时候缓存服务器是 N-1 台,映射公式变成了 hash(object)%(N-1) ;

  • 由于QPS升高,我们需要添加多一台服务器,这时候服务器是 N+1 台,映射公式变成了 hash(object)%(N+1) 。

1 和 2 的改变都会出现所有服务器需要进行数据迁移。

一致性HASH算法

一致性HASH算法的出现有效的解决了上面普通求余算法在节点变动后面临全部缓存失效的问题:

type Consistent struct {numOfVirtualNode inthashSortedNodes []uint32circle map[uint32]stringnodes map[string]bool}

简单地说,一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某空间哈希函数H的值空间是0-2^32-1(即哈希值是一个32位无符号整形),整个哈希空间如下:

下一步将各个服务器使用哈希算法计算出每台机器的位置,具体可以使用服务器的IP地址或者主机名作为关键字,并且是按照顺时针排列:

//这里我选择crc32,具体情况具体安排func hashKey(host string) uint32 { scratch := []byte(host)return crc32.ChecksumIEEE(scratch)}

这里我们假设三台节点memcache经计算后位置如下:

//add the nodec.Add("Memcache_server01")c.Add("Memcache_server02")c.Add("Memcache_server03")func (c *Consistent) Add(node string) error {if _, ok := c.nodes[node]; ok {return errors.New("host already existed")}c.nodes[node] = true// add virtual nodefor i := 0; i < c.numOfVirtualNode; i++ {virtualKey := getVirtualKey(i, node)c.circle[virtualKey] = nodec.hashSortedNodes = append(c.hashSortedNodes, virtualKey)}sort.Slice(c.hashSortedNodes, func(i, j int) bool {return c.hashSortedNodes[i] < c.hashSortedNodes[j]})return nil}

接下来使用相同算法计算出数据的哈希值,并由此确定数据在此哈希环上的位置

假如我们有数据A、B、C和D,经过哈希计算后位置如下:

根据一致性哈希算法,数据A就被绑定到了server01上,D被绑定到了server02上,B、C在server03上,是按照顺时针找最近服务节点方法

这样得到的哈希环调度方法,有很高的容错性和可扩展性:

假设server03宕机

可以看到此时A、C、B不会受到影响,只是将B、C节点被重定位到Server 1。一般的,在一致性哈希算法中,如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中前一台服务器(即顺着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响。

考虑另外一种情况,如果我们在系统中增加一台服务器Memcached Server 04:

此时A、D、C不受影响,只有B需要重定位到新的Server 4。一般的,在一致性哈希算法中,如果增加一台服务器,则受影响的数据仅仅是新服务器到其环空间中前一台服务器(即顺着逆时针方向行走遇到的第一台服务器)之间数据,其它不会受到影响。

来源:https://www.cnblogs.com/starluke/p/11997694.html

·END·

PHP开源社区进阶·提升·涨薪

crc32算法_一致性hash算法负载均衡相关推荐

  1. 详解【负载均衡】(负载均衡算法、一致性hash、负载均衡架构分析)

    作者:duktig 博客:https://duktig.cn 优秀还努力.愿你付出甘之如饴,所得归于欢喜. 本文源码参看:https://github.com/duktig666/distribute ...

  2. hash算法_一致性hash算法简介

    一致性hash算法有什么用?我们为什么需要一致性hash算法?这两个问题的答案可以看这篇文章 分布式系统路由算法简介. 了解了一致性hash算法出现的背景,我们来看看什么是一致性hash算法.一致性h ...

  3. hash地址_一致性Hash在负载均衡中的应用

    作者:marklux 原文:http://marklux.cn/blog/90 简介 一致性Hash是一种特殊的Hash算法,由于其均衡性.持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和 ...

  4. 压力测试过负载均衡_一致性 Hash 在负载均衡中的应用

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 If you concentrate on the ONE thing in ...

  5. hash oracle 分表_一致性Hash算法在数据库分表中的实践

    最近有一个项目,其中某个功能单表数据在可预估的未来达到了亿级,初步估算在90亿左右.与同事详细讨论后,决定采用一致性Hash算法来完成数据库的自动扩容和数据迁移.整个程序细节由我同事完成,我只是将其理 ...

  6. java的hash算法实现_一致性Hash算法的Java实现详解

    package com.baijob.commonTools; import java.util.Collection; import java.util.SortedMap; import java ...

  7. 一致性hash算法虚拟节点_一致性 Hash 算法

    一致性哈希算法在1997年由麻省理工学院提出,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P ...

  8. 一致性hash算法虚拟节点_一致性Hash算法原理详解

    数据分片 先让我们看一个例子吧: 我们经常会用 Redis 做缓存,把一些数据放在上面,以减少数据的压力. 当数据量少,访问压力不大的时候,通常一台Redis就能搞定,为了高可用,弄个主从也就足够了: ...

  9. 一致性 Hash 在负载均衡中的应用

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:干掉 Navicat:这个 IDEA 的兄弟真香!个人原创100W+访问量博客:点击前往,查看更多 转自:Mar ...

最新文章

  1. java 线程池 初始大小,Java线程池ThreadPoolExecutor的实现和参数
  2. python3精要(7)-集合,集合运算,集合解析
  3. mask rcnn实例分割_使用Mask-RCNN的实例分割
  4. 比尔盖茨的30条经典语录
  5. Ubuntu Core 给物联网提供更多安全支持
  6. 信息学奥赛一本通 1035:等差数列末项计算 | OpenJudge NOI 1.3 18
  7. 源码分析参考:Dupefilter
  8. 2020年进入倒计时:一波前端资源送给你~这一年,谢谢自己!
  9. 阿里巴巴MySQL DBA面试题答案(欢迎进来讨论)
  10. go语言--竞争、原子函数、互斥锁
  11. c++ opencv图像中选择点显示点的坐标_如何使用OpenCV进行Delaunay三角剖分和Voronoi图...
  12. c2c网站开店的流程图_C2C电子商务网站的交易流程
  13. Cgroup 资源配置方法
  14. Android Studio Entry name *.xml collided解决方案
  15. EXCEL图表 横坐标日期格式无法修改问题
  16. 大数据研究,不能“忽悠”
  17. 深度学习day01-深度学习环境、conda、创建第一张画布
  18. 倒计时代码(用户输入秒数直接转换为时分秒)
  19. C语言中itoa和atoi函数的用法
  20. 数组数据结构的使用与代码编写(一)

热门文章

  1. 城市大脑标准体系层次结构
  2. PtCMS采集,PtCMS采集插件,PtCMS全自动采集无需采集规则详解(图文)
  3. 豌豆淘讲分析会员制,企业为何要做会员营销?
  4. matlab在高等数学中的,matlab在高等数学中的应用
  5. 基于DirectShow和FFmpeg的USB摄像头监控软件
  6. ofd格式文档和pdf的区别
  7. 服务器显示四个0,魔兽9.0来了,首日多个服务器爆满,玩家排了4小时也没登上...
  8. ORACLE 触发器 INSRETING,UPDATING,DELETING 函数
  9. 7000 字梳理 RocketMq
  10. LaTeX 图片和公式引用