分布式和集群
1.基本概念:分布式和集群是不一样的,分布式一定是集群,但是集群不一定是分布式。
2.分布式是一个大系统拆分成多个小模块,而集群是实例的复制。
一致性Hash算法
1.有多种形式:除留余数法,开放寻址法,直接寻址法,线性构造Hash算法。
2.Hash算法在很多分布式集群产品中都有应用,比如分布式集群架构Redis、
Hadoop、ElasticSearch,Mysql分库分表,Nginx负载均衡等
小结:一致性Hash算法主要的应用场景归纳起来两个:
1.请求的负载均衡(比如nginx的ip_hash策略)。
2.分布式存储
负载均衡(Hash算法应用)
1.普通Hash算法存在的问题:当服务器数量发生了变化(扩容/缩容),之前所有的求模都需要重新计算。
大量用户的请求会被路由到其他的目标服务器处理,用户在原来服务器中的会话都会丢失。
2.一致性Hash算法:首先有一条直线,直线开头和结尾分别定为为1和2的32次⽅减1,这相当于一个地址,
对于这样一条线,弯过来构成一个圆环形成闭环,这样的圆环称为hash环。我们把服务器的ip或者主机名求
hash值然后对应到hash环上,那么针对客户端用户,也根据它的ip进行hash求值,对应到环上某个位置,然后
以顺时针获取最近的服务器,从而达到大部分的请求可以落到同一个服务器。避免了大量请求迁移。
问题分析:有可能会存在请求倾斜的问题的,由于服务器数量较少分布不均匀导致的。
3.一致性Hash算法+虚拟节点:为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每个服务
节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。当客户端被路由到虚拟节点的时候其实是被
路由到该虚拟节点所对应的真实节点。
Nginx 配置一致性Hash负载均衡策略
1.ngx_http_upstream_consistent_hash 模块是个负载均衡器,使用一个内部一致性hash算法来选择合适的后端节点。
该模块可以根据配置参数采取不同的⽅式将请求均匀映射到后端机器,
consistent_hash $remote_addr:可以根据客户端ip映射
consistent_hash $request_uri:根据客户端请求的uri映射
consistent_hash $args:根据客户端携带的参数进⾏映
ngx_http_upstream_consistent_hash 模块是个第三方模块,需要我们下载安装后使用。
2.我们已经编译安装过nginx,此时进入当时nginx的源码目录,执行如下命令:
./configure —add-module=/root/ngx_http_consistent_hash-master; make; make install;
在nginx.conf文件负载均衡配置中添加:consistent_hash $request_uri