博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一致性哈希与负载均衡与分布式
阅读量:2294 次
发布时间:2019-05-09

本文共 1640 字,大约阅读时间需要 5 分钟。

  项目在完成C/S的架构后,为了突破服务器瓶颈,我采用了服务器集群的设计思路。既然采用到集群必然就要涉及到负载均衡,于是我就去网上找了一些关于负载均衡的资料,随即映入眼帘的便是用一致性哈希算法去平衡负载。再通读理解之后我甚为满意,觉得这个算法解决我目前的问题实在是再合适不过了。但是,没错我要说但是了。当我再完成后回过头再看时发现了许多问题,今天就是为当时一时冲动做忏悔的。

一、我回顾后发现的问题


  (1).对一致性哈希未理解透彻,对其滥用造成了”负载均衡“代码的冗余。也使得一致性哈希大材小用。

  (2).对分布式的负载均衡与集群式的负载均衡的理解不到位。


二、分析


(1).第一个问题

  既然提到了未把一致性哈希理解透彻的问题,就有必要提一下一致性哈希了。对于其本质上的算法到底是什么,网上的资料其实挺多的,我这里就不提了。就给大家抛个一个我觉得挺不错的文章吧。

  这里肯定有朋友就有疑问了,你这都没理解透彻咋还不说一下这个算法到底是啥。哈哈,其实我未把理解一致性哈希理解透彻指的并不是算法本身,而是一致性哈希究竟解决的是什么问题,负载均衡?什么的负载均衡?用在我这种C/S架构下合适吗?这才是我今天要总结的东西。也是我要反思的东西。
  这里肯定有朋友又会有疑问了,难道一致性哈希不是去平衡负载的么?它难道不是去分散访问压力的么。没错是分散访问压力的,可是它是分散什么压力到什么上的呢?集群式的服务器?不。是分散到分布式的服务器上的。例如 memcached,redis。(我之后会写一篇关于分布式缓存的博客,这里就略过了)你在回头看下我将其应用到了那里,没错,是服务器。所以说完全是很蠢,瞎用。差距这么大,都能用错。可能有的同学还不是很能明白我说的,那就上图。
在这里插入图片描述

如图,这算是一个简单的web框架,因为这里我主要想说明一下分散到集群式服务器和分散到分布式服务器的差别。

  ①分散到集群式服务器(这里用后台服务器来举例):只需要给请求连接的客户端分配一个客户端即可,无需考虑客户端和服务器的对应(注意我这里的服务器集群访问的是一台数据库,数据是一体的并非独立的,也就是并非分布式)。负载均衡大可使用轮询表依次分配给客户端服务器的IP和端口,当某台服务器宕机或是再增添新服务器时,更新负载均衡上的信息表即可。

  ②分散到分布式服务器(这里用缓存服务器来举例):因为是分布式所以每个缓存服务器相当于都是独立的,所以就需要考虑映射关系了。
  每当客户端发出get (图片或是文件或是页面)后,前端的服务器都会先去从缓存服务器中去查找数据,找不到再去数据库中找。而缓存服务器本身的意义就是去提高数据访问的效率。而如何提高呢,就是通过哈希映射。举个例子取模算法:

假设有三台缓存服务器,那么数据的映射关系应该是这样的。

数据 % 3 = 服务的编号(假设结果为1)
数据 -------------->1号服务器
当有这样的一个映射关系后,数据的查找就会相当方便了,无需遍历3台服务器上的所有数据,直接通过取模得到服务器编号,然后到相应的缓存服务器上查找就好了。这样才能体现出缓存以及分布式的意义。

  在这种情况下就不能使用第一种的分配方式了,因为倘若某台缓存服务器宕机或是增添新的服务器时就会造成缓存雪崩了(本质就是哈希扩容造成的,而一致性哈希就巧妙的解决了这个问题),所以这种情况下才是一致性哈希的用武之地。

(2).第二个问题

  说到这里其实分布式的负载均衡与集群式的负载均衡的区别已经很明显了,我再上张图将二者放到一起,以便大家理解。

  如图:
在这里插入图片描述

这里的后台服务器采用的是集群式的负载均衡,而缓存服务器就是分布式的负载均衡,大家体会一下。


三、总结


  因为集群不牵扯到映射,少了或多了对整体是没有影响并不是很大,分布式因为数据是独立的牵扯到哈希映射,所以在增加或减少时会引起整个系统的崩塌,所以针对前者负载均衡可采用轮询,针对后者则必须采用一致性哈希了。

转载地址:http://aisnb.baihongyu.com/

你可能感兴趣的文章
php读取二进制流
查看>>
Golang热重启
查看>>
热重启golang服务器(graceful restart golang http server)
查看>>
echo框架使用:获取与配置
查看>>
PHP模拟多进程并发将内容写入文件
查看>>
nginx.conf配置说明
查看>>
Eclipse设定和修改文件字符编码格式和换行符
查看>>
git常用操作以及快速入门教程
查看>>
MongoDB 3.0 常见集群的搭建(主从复制,副本集,分片....)
查看>>
在notepad++中 “tab转为空格”、“按tab插入空格”、“文档格式转换”
查看>>
Zend Framework 常用组件概述
查看>>
Zend_Db -> Zend_Db_Adapter
查看>>
Zend_Db -> Zend_Db_Select
查看>>
Zend_Db -> Zend_Db_Table
查看>>
PHP漏洞全解(三)-客户端脚本植入
查看>>
Java学习日记 求最值 排序 选择 冒泡 交换
查看>>
IO流输出系统信息
查看>>
File类常见方法
查看>>
File对象功能-文件列表
查看>>
IO流列出目录下所有内容,带层次
查看>>