图片摘自:

  每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

一:背景

  - 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的。

  - 设计目标是为了解决因特网中的热点(Hot spot)问题。

  - 一致性哈希修正了使用的简单哈希算法带来的问题

二:简单哈希算法带来的问题?

  - 在简单哈希算法中

    - 我们会根据hash算法得出的数值和机器数取模计算,计算发到哪台机器上。

    - Hash(资源)% 机器数 = 落到哪台机器上

    - 这样的话就不会遍历所有的服务器,大大提升了性能!

  - 但是,在服务器数量变动的时候,所有缓存的位置都要发生改变!

    - 假设4台缓存中突然有一台缓存服务器出现了故障,无法进行缓存。

    - 那么我们则需要将故障机器移除,但是如果移除了一台缓存服务器,那么缓存服务器数量从4台变为3。

    - 如果想要访问资源,资源的缓存位置必定会发生改变,以前资源缓存也会失去缓存的作用与意义。

    - 同时由于大量缓存在同一时间失效,造成了缓存的雪崩,服务端也会承受巨大压力。

三:一致性哈希(hash)解决的问题

  - 解决增减服务器导致的大量数据震荡问题。

四:一致性哈希(hash)

  - 原理

    - 创造环形哈希(hash)空间,不同节点映射到环上的不同位置,通过和机器节点的匹配,完成hash一致。

  - 做法

    -  按照常用的hash算法来将对应的key哈希到一个具有2^32次方个桶的空间中,即0~(2^32)-1的数字空间中。 可以将这些数字头尾相连,想象成一个闭合的环形。

      - 

    -  现在我们将object1、object2、object3、object4四个对象通过特定的Hash函数计算出对应的key值,然后散列到Hash环上。

      - 

    - 在采用一致性哈希算法的分布式集群中将新的机器加入。

    - 其原理是通过使用与对象存储一样的Hash算法将机器也映射到环中,然后以顺时针的方向计算,将所有对象存储到离自己最近的机器中。 

      - 

    -  通过上图可以看出对象与机器处于同一哈希空间中,这样按顺时针转动object1存储到了节点1中

    - object3存储到了节点2中

    - object2、object4存储到了节点3中。

    - 在这样的部署环境中,hash环是不会变更的,因此,通过算出对象的hash值就能快速的定位到对应的机器中,这样就能找到对象真正的存储位置了。

五:问题解答

  - 如何解决单个节点压力过大的问题?

    - 在 一致哈希算法中,提出了虚拟节点的概念,既一个机器可以通过 哈希 算法,映射至多个节点。以解决单个节点的压力问题

《算法 - 一致性 (hash) 算法》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. ARDUNIO IMU processing姿态数据可视化

    https://www.arduino.cn/thread-42852-1-1.html 关键数据打包 float roll, pitch, heading; Serial.print("O ...

  2. Python 02 编写代码

    原文:https://www.cnblogs.com/jimmy-share/p/9784219.html 方式: 交互式编程:打开python.exe文件后,直接输入代码即可.文件的位置(我本地): ...

  3. Linux 重启 PHP-FPM 命令

    1. 停止命令 pkill php-fpm 2.重启或启动命令 php-fpm -R

  4. Hungry Canadian

    Hungry Canadian(简单dp) 具体见代码注释 #include <iostream> #include <cstdio> #include <cstring ...

  5. 安利一个github上面的一个神级库thefuck,Linux命令敲错了,没关系,自动纠正你的命令

    没错就是这么神奇,名字相当噶性,thefuck.当你命令输入错误不要怕,直接来一句fuck,自动纠正你输入的命令. 在你输入错误的命令的时候,忍俊不禁的想来一句fuck,没错你不仅可以嘴上说,命令里面 ...

  6. (8)Go Map

    Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现. Map map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用. map定义 G ...

  7. 让你的shell更体贴

    使用shell的时候很多,特别是拉幕式终端,使用时更加方便,同时可以利用 echo "Did you know that:" ;whatis $(ls /bin | shuf -n ...

  8. el-table里面的列需要对比两个返回参数

    需求是这样的--- 已发布时间超过30分钟,显示黄色,超过一个钟显示红色 现在后台返回的时间的格式是2018-10-22 11:23:23的格式 做法是: 第一步: 先将后台返回的格式转化为时间戳,然 ...

  9. MySQL索引和SQL调优手册

    MySQL索引 MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree ...

  10. Docker部署web项目-war包

    一.部署springmvc(war包)项目 1.手工方式 ①搜索tomcat镜像 docker search tomcat ②拉取tomcat基础镜像至本地仓库 docker pull tomcat ...