来自公众号:孤独烟

本文故事绝对真实,如有雷同,绝对不是巧合!

于是呢,烟哥提前十分钟在公司里头找了一个厕所的坑位,然后进去随手一锁门….(以下省略10000字)…

唉…

我竟然又带薪上厕所了,而且上了一小时!我有罪!

额,是这样的,大厂的厕所是有雅间的。所以环境还马马虎虎,鼻子还是正常的!

OK,交待完背景,然后开始我们的主题!

全局Session

当时的情形是这样的,先介绍一下自己的项目。然后介绍完项目背景以后,因为有一个登陆模块。于是乎有了如下问题

面试官:“先说说全局Session干嘛用的,你们那边全局session是怎么做的?”

这个问题还是很容易的。因为一个应用通常有多台服务器,在登陆成功后,Session只会在其中某一台存储。需要想办法让多台服务器都识别到这个Session,因此才有了这个全局Session的概念。我们用的是后端统一存储的策略,有专门的用户管理系统,上面存储着用户信息以及Session状态。

烟哥注:目前业内在解决全局Sesssion上无外乎四种方法

  • (1)服务端自己进行同步,例如早期的项目,大概是07年那会的(我司老古董项目啊),那会Tomcat的集群能力不行。用的是Weblogic服务器,使用的就是Weblogic的Session复制功能。

  • (2)客户端存储法,将session存储到浏览器cookie中,每次http请求都带session。这里摸着良心坦白说,该方案从没用过,安全性太差。

  • (3)反向代理hash一致性,不需要修改应用代码。修改nginx的配置,保证同一个ip的请求落在同一个web-server上即可。

  • (4)后端统一存储,后端统一找一个中间件将Session存起来即可,这个中间件是数据库或者缓存。

面试官:“那你知道这个平台里Session怎么管理的么?”

必须不知道啊!对我们来说该平台只是一个黑盒,会调接口即可。

于是乎,一个让我头疼的问题出现了!

面试官:“如果让你设计这样一个平台,管理这些Session,你会怎么设计?”

用redis来存储Session,用sessionId作为key,用session当value进行存储。

面试官:"如果redis挂了呢?"

咦,这个时候,我突然懵了。面试官到底想问我什么?难道挂了,不是redis从服务器顶上么?这个问题莫非有什么玄机?

然后我是这样答的。

cluster-require-full-coverage

当cluster-require-full-coverage为no时,表示当负责一个插槽的主库下线且没有相应的从库进行故障恢复时,集群仍然可用。但是该槽的相关命令不可用。

这个时候,可能出现了网络中断!

面试官:"你的意思是,redis挂了,整个集群数据就不可用了?"

我回答嗯嗯,是的!

这个时候,面试官

面试官:"你不知道一致性哈希算法么?回去了解一下!"

然后我突然懵了。原来是我想太多,他这样问完,我才get到他问的点。

烟哥注:所以我才说这个面试我有点失败,和面试官不在一个频道上。如果是现场面,可以现场画图,则不会出现这种问题!

面试官想到的架构应该是这样的

上图中,由于有4台服务器(排除从库),因此公式为hash(sessionId) % 4 = 2 ,可知定位到了第2号服务器。

但是呢,普通的如果4台缓存服务器已经不能满足我们的缓存需求,那么我们应该怎么做呢?很简单,多增加几台缓存服务器不就行了!

假设:我们增加了一台缓存服务器,那么缓存服务器的数量就由4台变成了5台。那么原本hash(sessionId) % 4 = 2 的公式就变成了hash(sessionId) % 5 = ?, 可想而知这个结果肯定不是2的,这种情况带来的结果就是当服务器数量变动时,所有缓存的位置都要发生改变!

于是乎,他才想引我去答一致性哈希算法!总之,该死的破网络!导致两边不在一个频道上!

一致性哈希

既然都提到了一致性哈希算法了,就当复习一下吧~~

我们将二的三十二次方想象成一个圆,这个圆上的数字就是即0~(2^32)-1。

这时候有三台缓存服务器A、B、C。hash(服务器A的IP地址) %  2^32

插播一下,写到这里,这里我又想起一道题了!

有哪些常见的hash算法啊?

OK,先继续我们的话题。经过上面的运算,我们算出的结果一定是一个0到2^32-1之间的一个整数,我们就用算出的这个整数,代表服务器A,既然这个整数肯定处于0到2^32-1之间,那么,上图中的hash环上必定有一个点与这个整数对应,我们使用这个整数代表服务器A,那么,服务器A就可以映射到这个环上。hash(服务器B的IP地址) %  2^32hash(服务器C的IP地址) %  2^32

于是,得到了下面这一张图

那么,我们要用服务器存储session,那么我们用sessionId做key,进行如下运算hash(sessionId) %  2^32

假设,我们现在有四个session,分别进行映射运算后得到如下的环

这么做的好处?

虚拟槽的应用?

为了解决这个问题,我们给A、B、C三台服务器引入虚拟节点。如下图所示(图中黄色节点为虚拟节点)

如图所示,2号session和3号session映射到了虚拟B节点,就会存储到真实的B节点上。通过引入虚拟节点的方式,实现数据的均匀分配!

最后,本文内容全当复习一次一致性哈希算法。希望大家有所收获。

长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢

一次失败的面试,复习一次一致性哈希算法相关推荐

  1. 面试时遇到一致性哈希算法这样回答会让面试官眼前一亮

    [CSDN 编者按]很多人都知道什么是哈希函数,在后端面试和开发中会遇到"一致性哈希",那什么是一致性哈希呢,当面试官问到你又该如何给出漂亮的回答. 作者 | 丁威       责 ...

  2. 面试官:怎么改进哈希算法实现负载均衡的扩展性和容错性?我:...

    面试官:怎么改进哈希算法实现负载均衡的扩展性和容错性? 什么是哈希算法 数据结构中我们学习过哈希表也称为散列表,我们来回顾下散列表的定义. 散列表,是根据键直接访问在指定储存位置数据的数据结构.通过计 ...

  3. 面试官让我利用哈希算法、布隆过滤器设计一个短链系统

    点击上方蓝字设为星标 下面开始今天的学习- 作者 | 码海 来源 | 码海 前言 今天,我们来谈谈如何设计一个高性能短链系统,短链系统设计看起来很简单,但每个点都能展开很多知识点,也是在面试中非常适合 ...

  4. 面试:说说啥是一致性哈希算法?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://urlify.cn/UZJf2 ...

  5. 哈希桶 entry_聊一聊面试常问的几大哈希算法问题,这些你都会了嘛??

    hashCode() 和equals() 方法的重要性体现在什么地方? Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方 ...

  6. 【BAT面试必备】一致性哈希算法原理 一文吊打面试官

    一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致 ...

  7. 计算机专业保研面试复习笔记——计算机网络

    计算机专业保研面试复习笔记: 计算机专业保研面试复习笔记--数据结构中的重要算法 计算机专业保研面试复习笔记--数据库 计算机专业保研面试复习笔记--操作系统 计算机专业保研面试复习笔记--计算机网络 ...

  8. 两万字深度讲解系统设计!超详细解析!面试复习必备!

    Table of Contents generated with DocToc 三高 高并发 高性能 高可用 网站统计IP PV UV实现原理 如何进行系统拆分? 场景题:设计判断论文抄袭的系统 设计 ...

  9. 剑指Offer -- 面试复习

    1.在浏览器地址栏键入url,按下回车之后经历的流程1)DNS解析2)TCP连接3)发送HTTP请求4)服务器处理请求并返回HTTP报文5)浏览器解析渲染页面6)连接结束 HTTP状态码1xx : 指 ...

最新文章

  1. centos安装及网络配置
  2. [置顶] C# 邮件发送方法【NetMail方式】
  3. 2020年全国压岁钱榜单出炉,今年小朋友压岁钱归谁?
  4. 将字符串转换为列显示
  5. Node.js Domain 模块
  6. python运行pyc文件_python中__pyc__文件的生成和作用
  7. 剑指offer——9.用两个栈实现队列
  8. MS SQL安装提示
  9. FFmpeg在Linux下安装编译过程
  10. 虚拟机队列实战虚拟化存储设计之LUN Sizing
  11. window 和虚拟机通过tftp实现文件传输
  12. Postgresql本地语言环境参数设置(LC_COLLATE,LC_CTYPE)
  13. 各种工业以太网技术浅析
  14. pr导入srt字幕显示因文件头错误而不能打开,或pr导入字幕乱码
  15. 【I.MX6ULL】6ull 加载 linux 驱动模块失败
  16. 微表情识别 · 读脸读心满分答案
  17. 千寻位置平台使用入门总结
  18. 基于u-net,cv2以及cnn的中文车牌定位,矫正和端到端识别软件
  19. 图像处理———图像的几何变换原理及实现
  20. jquery 将下拉框重置_select下拉框之默认选项清空

热门文章

  1. 关于全连接层梯度的链式法则
  2. PTA基础编程题目集-7-15 计算圆周率
  3. 教你用代码奏响天空之城! (C++中发声函数Beep详解)
  4. sqoop mysql parquet_sqoop一些语法的使用
  5. java如何重写_java中如何重写一个方法
  6. idea工具使用总结
  7. 使用 Blender* 重新拓扑 VR 和游戏素材
  8. 基于鲁棒图进行概念架构设计
  9. git 创建分支,更改并提交
  10. Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求