首页 > 其他分享 >深入浅出一致性哈希

深入浅出一致性哈希

时间:2023-12-29 10:56:50浏览次数:33  
标签:缓存 hash 深入浅出 哈希 一致性 数据 节点 圆环

哈希是什么

哈希又称散列,是一种计算数据指纹的方法。
哈希函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来

业务场景

常见的业务场景;网站用户请求后,为了性能一般都会加一层缓存。
image
缓存有多个节点,每个节点存储了不同数据。
获取数据,先根据数据取模(哈希)找到缓存节点,如果命中缓存则直接返回结果。否则,请求DB,再缓存,再返回结果。

取模算法:hash(data)=data mod nodeNum,比如请求数据是100,有3个节点,定位在哪个节点,使用 100%3=1 来定位到 index=1 的节点

image
问题:比如系统负载能力不足,再加个缓存节点,但是发现基本上所有数据取余的结果会发生变化
image
新增节点后,请求到缓存服务节点0,但是节点0没有缓存数据,又去请求DB。如果大量请求过来,大部分都去请求DB,造成DB的压力,这样也失去的增加缓存服务的意义了。

一致性哈希

摘自维基百科 https://zh.wikipedia.org/wiki/一致哈希

一致哈希将每个对象映射到圆环边上的一个点,系统再将可用的节点机器映射到圆环的不同位置。查找某个对象对应的机器时,需要用一致哈希算法计算得到对象对应圆环边上位置,沿着圆环边上查找直到遇到某个节点机器,这台机器即为对象应该保存的位置。 当删除一台节点机器时,这台机器上保存的所有对象都要移动到下一台机器。添加一台机器到圆环边上某个点时,这个点的下一台机器需要将这个节点前对应的对象移动到新机器上。 更改对象在节点机器上的分布可以通过调整节点机器的位置来实现

比如有3个节点,将节点信息hash后,找到圆环的位置
image

有请求数据时,对数据也做hash,找到圆环位置。那么从数据data位置开始,按顺时针寻址到的第一个节点就是要请求的节点
image

当有新节点 D 加进来后,D的位置如果在B前面,那么将B的数据迁移到D,相同的数据data计算节点是D。
这样的好处是,不用所有节点都做数据迁移,只需要迁移一个或少量数据
image

同样道理,当节点B下线时,将B的数据迁移到节点C
image

节点不均衡问题

一致性哈希可以解决数据大量移动的问题。但是可能存在这样的情况:大量请求的数据经过hash计算,都寻址到某一个节点,这样这个节点会面临很大压力,而其他节点很空闲资源浪费
image

这时候,又有人想出来了虚拟节点(不得不说,人类这个脑子是真的聪明)
将每个节点都分配多个虚拟节点,分布在圆环上,这样圆环上的节点就很均匀了
image

nginx中也有一致性hash的使用

https://www.nginx.com/resources/wiki/modules/consistent_hash/

upstream somestream {
  consistent_hash $request_uri;
  server 10.50.1.3:11211;
  server 10.50.1.4:11211;
  server 10.50.1.5:11211;
}

// ...
server {
  listen       80;
  server_name  localhost;

  location / {
    default_type text/html;
    set $memcached_key $request_uri;
    memcached_pass somestream;
    error_page      500 404 405 = @fallback;
  }
}

标签:缓存,hash,深入浅出,哈希,一致性,数据,节点,圆环
From: https://www.cnblogs.com/yangzhenlong/p/17934284.html

相关文章

  • 哈希集合、哈希表的拉链法实现
    哈希表705.设计哈希集合//拉链法structListNode{intval;structListNode*next;};typedefstruct{structListNode*data;}MyHashSet;//模constinthashSize=1009;MyHashSet*myHashSetCreate(){MyHashSet*myHashSet=(MyHashSet......
  • Java多线程:数据一致性问题及解决方案
    引言在面向对象的编程语言Java中,多线程编程是一个强大的工具,可以使我们能够构建高效率和高并发的应用程序。然而,多线程环境下的数据共享也带来了数据一致性的挑战。在本文中,我们将探讨Java多线程中的数据一致性问题,并提出几种解决方案。数据一致性问题当多个线程同时对共享资源进行......
  • IaaS--如何降低故障的影响(何恺铎《深入浅出云计算》笔记整理)
     【常见故障及解决方法】1、第一种故障是在宿主机的级别,这也是从概率上来说最常见的一种故障。宿主机出现问题,虚拟机肯定都会有问题。解决方法是,尽量做好集群,采用HA的方式,做好救场。集群也应该注意,虚拟机尽量放在不同虚拟机上,甚至对应的宿主机都最好避免在同一个机架上;2、第二......
  • 21 mysql 一致性的底层原理
    一致性的原理:个人理解,一致性就是事务执行前后,数据在逻辑上都符合正常情况。想要保持一致性,一般有下面3种手段:第一,就是前面提到的原子性、持久性和隔离性。第二,就是数据自身带的一些参数校验,比如数据长度校验、数据类型校验。第三,就是从应用层面保持一致了。比如在银行账目系统中,保......
  • C#深度理解:数组、集合、哈希、字典、堆、栈 优缺点
    一、数组1、Array固定数组优点:1).快速访问:数组通过索引来访问元素,访问速度非常快,因为可以通过索引进行直接定位。2).内存连续存储:数组在内存中以连续的方式存储元素,这样有助于提高数据的读取和写入效率。3).多维支持:C#中的数组支持多维(二维、三维等)数据结构,可以用于表示......
  • 关于密码哈希算法BCrypt的编码结果各部分意义分析及其他注意事项
    找到一个英文的解析:Thebcryptstandardmakesstoringsaltseasy-everythingitneedstocheckapasswordisstoredintheoutputstring.Theprefix"$2a$"or"2y"inahashstringinashadowpasswordfileindicatesthathashstringisabcr......
  • [转][译] 密码哈希的方法:PBKDF2,Scrypt,Bcrypt 和 ARGON2
    原文地址:PasswordHashing:PBKDF2,Scrypt,BcryptandARGON2原文作者:MichelePreziuso译文出自:掘金翻译计划本文永久链接:https://github.com/xitu/gold-miner/blob/master/TODO1/password-hashing-pbkdf2-scrypt-bcrypt-and-argon2.md译者:司徒公子校对者:xionglong58、GJX......
  • 缓存双写一致性之更新策略探讨
    缓存双写一致性之更新策略探讨面试题上面业务逻辑你用java代码如何写?你只要用缓存,就可能涉及到Redis缓存与数据库双存储双写,只要是双写就一定会有数据一致性的问题,那么如何解决?双写一致性,你先动缓存Redis还是数据库MySQL?Why?延时双删你做过吗?会有哪些问题?有这么一种情况,微服......
  • CSP-S 2023消消乐 字符串哈希做法and链表优化dp做法
    做完这题感觉整个人都升华了...打算说一下两种做法,字符串哈希和dp均可。dp则需要维护一个前向星去检索出第一个符合要求的位置。题解明天补,先写高数了。#include<bits/stdc++.h>#defineintlonglong#defineullunsignedlonglong#definerep(i,a,b)for(inti=(a);i<......
  • 后端架构师必知必会系列:高可用数据库与数据一致性
    作者:禅与计算机程序设计艺术1.背景介绍什么是数据库?数据库(Database)是一个建立在计算机存储设备上的文件,用来存储、组织、管理和保护敏感的数据,其中的数据包括结构化数据和非结构化数据。数据库通过控制数据访问权限、提供数据备份功能、实现数据共享、确保数据完整性等功能,从而帮助......