首先我们来了解负载均衡的概念:英文名称为Load Balance,其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
其实负载均衡也是一个很庞大的知识体系。我也不是学习得很完善,这里就是把我自己学过的自我总结一下。分为一下几个方面:
(1)基于DNS的负载均衡
学过网络的都知道,DNS的作用主要是将域名映射为IP地址。我们可以采取多个A记录的方式来让别人访问这个网站是解析到一个IP地址来实现RR调度策略。当然对于DNS来说,比较重要的也是DNS缓存,可以让请求直接到对应的服务器上面而不需要解析。
也可以通过搭建BIND9 DNS服务器来了解DNS。
基于DNS的负载均衡的优势:1.简便 2.配置简单 3.易于调试(dig,ping,nslookup) 4.容易扩展
也有对应相关的问题:1.粘性,因为HTTP是一种无状态协议,无法将会话星系从一个请求保留到下一个请求。为了解决这个问题,你可以和每个请求一起,发送一个唯一的标识。收集你跟网站当前交互的信息,但这种做法并不完全保证你一定能回到有之前连接信息的那台服务器上。
2.处理方式,当所有高强度请求可能都跑到一台服务器上的时候就会出现很大的问题,得加以避免。
3.容错性,当有一台web服务器宕机了,基于DNS的负载均衡器是无法判别的。
(2)内容分发CDN
它采取了分布式网络缓存结构(即国际上流行的web cache技术),通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的cache服务器内,通过DNS负载均衡的技术,判断用户来源就近访问cache服务器取得所需的内容,解决Internet网络拥塞状况,提高用户访问网站的响应速度,如同提供了多个分布在各地的加速器,以达到快速、可冗余的为多个网站加速的目的。
CDN服务最初用于确保快速可靠地分发静态内容,这些内容可以缓存,最适合在网速庞大的网络中存储和分发,该网络在几十多个国家的十几个网络中的覆盖CDN网络服务器。
由于动态内容必须通过互联网来传输,因此要提供快速的网络体验,以满足当今用户的要求,只能通过对互联网流量的独特视角来达到。必须使用先进技术来了解通过互联网的最佳路由,充分利用这些最佳路由,加速通过互联网协议的数据通讯,以改善用户的网络体验。
这个的实现一般是采用代理服务器来进行,下面就进行描述。
(3)使用Nginx(代理服务器)进行负载均衡
使用代理服务器转发请求,在这一层面来说,Nginx是比较优秀的,因为它可以自己处理一些静态页面缓存等功能,而且配置还是比较简单,这里给出一个例子nginx的简单配置
http
{
#设定负载均衡列表
upstream www.zyan.cc {
server 192.168.1.2:80;
server 192.168.1.3:80;
server 192.168.1.4:80;
server 192.168.1.5:80;
}
}
server{
#对 / 所有做负载均衡 (本机nginx采用完全转发,所有请求都转发到后端的tomcat集群)
location / {
root /var/www ;
index index.jsp index.htm index.html;
proxy_redirect off;
#保留用户真实信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend;
}
}
Nginx主要有以下几种负载均衡算法:
静态负载均衡算法包括:轮询,比率,优先权
动态负载均衡算法包括: 最少连接数,最快响应速度,观察方法,预测法,动态性能分配,动态服务器补充,服务质量,服务类型,规则模式。
静态负载均衡算法
◆轮询(Round Robin):顺序循环将请求一次顺序循环地连接每个服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从顺序循环队列中拿出,不参加下一次的轮询,直到其恢复正常。
◆比率(Ratio):给每个服务器分配一个加权值为比例,根椐这个比例,把用户的请求分配到每个服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配, 直到其恢复正常。
◆优先权(Priority):给所有服务器分组,给每个组定义优先权,BIG-IP 用户的请求,分配给优先级最高的服务器组(在同一组内,采用轮询或比率算法,分配用户的请求);当最高优先级中所有服务器出现故障,BIG-IP 才将请求送给次优先级的服务器组。这种方式,实际为用户提供一种热备份的方式。
动态负载均衡算法
◆最少的连接方式(Least Connection):传递新的连接给那些进行最少连接处理的服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配, 直到其恢复正常。
◆最快模式(Fastest):传递连接给那些响应最快的服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
◆观察模式(Observed):连接数目和响应时间以这两项的最佳平衡为依据为新的请求选择服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
◆预测模式(Predictive):BIG-IP利用收集到的服务器当前的性能指标,进行预测分析,选择一台服务器在下一个时间片内,其性能将达到最佳的服务器相应用户的请求。(被BIG-IP 进行检测)
◆动态性能分配(Dynamic Ratio-APM):BIG-IP 收集到的应用程序和应用服务器的各项性能参数,动态调整流量分配。
◆动态服务器补充(Dynamic Server Act.):当主服务器群中因故障导致数量减少时,动态地将备份服务器补充至主服务器群。
◆服务质量(QoS):按不同的优先级对数据流进行分配。
◆服务类型(ToS): 按不同的服务类型(在Type of Field中标识)负载均衡对数据流进行分配。
◆规则模式:针对不同的数据流设置导向规则,用户可自行。
这里还想提一些加速的手段:比如说Gzip压缩传送数据前对数据进行压缩。第一篇提到的多线程模型,异步选择等。
(4)对数据库进行负载均衡
在之前也说过Mysql的分布式集群的一些概念,比如说Mysql Cluster。
(5)对网络进行负载均衡
在TCP/IP上,比如数据传送过程中的数据分片和路由器的分组交换
负载均衡器:IPVS
单点故障:这里我简单的说一下Memcached单点故障的解决方法,因为在集群中,一个节点失效,可能会引发大量缓存的大量重建,这是一个比较难以接收的后果。
解决方案1:本地备份缓存
在本地放一份缓存,同时也在分布式Memcached上放一份缓存,如果当其中一台节点当机了,客户端程序直接读取本地的缓存,本地客户端维护一个HashMap即可,这样的方案虽然很简陋,但是可以满足一部分场景的需要,当你很急需的时候可以作为临时方案暂时替代一下。
解决方案2:采用缓存代理服务器
采用 Magent 缓存代理,防止单点现象,缓存代理也可以做备份,通过客户端连接到缓存代理服务器,缓存代理服务器连接缓存服务器,缓存代理服务器可以连接多台Memcached机器可以将每台Memcached机器进行数据同步。这样的架构比较完善了,如果其中一台缓存代理服务器down机,系统依然可以继续工作,如果其中一台Memcached机器down掉,数据不会丢失并且可以保证数据的完整性,以上描述的系统架构如图所示:
在看《大规模分布式存储系统:原理解析与架构实战》中看到了虚拟节点的方案也挺值得学习。