㈠ 负载均衡:F5,Haproxy,lvs, nginx
阅读本文前,需熟悉OSI七层参考模型。
常见的负载均衡设备,有F5,Haproxy,lvs, nginx等。
F5是商用硬件负载均衡,性能很好,但是价格昂贵,除了负载均衡,还有应用交换、会话交换、状态监控等众多功能。
F5一般做四层负载均衡,但也支持七层负载均衡。
Haproxy(以下简称ha)是软哗唯岁件负载均衡,开源,一般做七层负载均衡,但也支持四层负载均衡。
linux Virtual Server(以下简称lvs)是软件负载均衡,开源,二层或四层负载均衡,已集成到linux内核,自身有完备的热备方案(keepalived+lvs),稳定性极强。
nginx也是软件负载均衡,开源,通过反向代理实现负载均衡,是七层负载均衡,性能不如上面的几个。
tips1
有些公司,测试环境用ha/lvs/nginx,生产环境用F5。
tips2
nginx做web服务器时,一般做静态资源服务器和php的web服务器,所以很多公司,会采用F5+nginx或者ha+nginx的架构
tips3
微服务中的ribbon属于客户端负载均衡,上面的几种都是服务端负载均衡
二层负载均衡
在数据链路层通过修改mac地址实现,如lvs的DR模式(直接路由模式)
三层负载均衡
在网络层通过DNAT协议修改目标地址实现
四层负载均衡
用ip+端口实现请求转发
备注:tcp报文里并没有ip,但是四层负载均衡可以用ip+端口,是因为server可以拿到ip
七层负载均衡
通过重新发起http请求实现,即client把请求发给lb,lb把请求代发给server,再把server的响应返回给client,因此七层负载均衡也经常被称为代理,七层负载均衡设备也被称为代理设备。
七层负载均衡常用于内网与外网的通信,比如内网无法直接访问外网,需要通过代理设备代发http请求,这种情况下,代理设备需要配置双网卡,以同时与内外网络通信。
由于山宽需要重发http请求,七层负载均衡性能较差,但是更智能和安全,因为应用层可以获取甚至修改请求的真实内容(即应用数据),比如cookie、url等,可以做一些智能的操作,比如根据cookie/url转发请求,也可以做一些安全操作,比如过滤特定报文、防止SYN Flood攻击等。
使用七层负载均衡时,服务的性能受限于代理设备的网卡带宽。
常见的负载均衡策略,有轮询、加权轮询、ip_hash、cookie、url_hash,根据服务器响应时间转发、根据最少连接转发等等。
备注:nginx可以安装第三方插件,使用第三方实现的策略
轮询:按服务器列表顺序转发请求,轮询是nginx默认的策略,本策略适合服务器配置相当、请求无状态(即不依赖session)的场景
加权轮询:如果不同服务器配置不同,可以为配乱睁置高的服务器增加权重
ip_hash:根据ip哈希结果转发,可以实现同一用户持续请求同一服务器(即会话保持),适合有状态(即依赖session)的场景,对png、jpg、js、css等静态资源的请求,不适合使用本策略
cookie:根据特定cookie转发请求,一般也是用于实现会话保持,比如为服务器A、B分别增加service-flag=a、service-flag=b的cookie,后续请求根据cookie转发
可以参考 haproxy实现会话保持
url_hash:根据url哈希结果转发,同一个接口始终请求同一台服务器,一般配合缓存使用,缓存接口返回结果
根据服务器响应时间转发:优先转发到响应时间较快的服务器
根据最少连接转发:优先转发到连接数较少的服务器
F5有一些特有的负载均衡策略:利用从应用程序和服务器收集到的各项性能指标,分析并转发
负载均衡有两个步骤:
1.根据什么算法选择真实服务端,即负载均衡策略,如轮询、加权轮询、ip_hash、cookie、url_hash等;
2.把请求转发到真实服务器,转发方式有二层到七层负载均衡
keepalived软件一开始是专为lvs设计的,后来加入了可以实现高可用的VRRP (Virtual Router Rendancy Protocol ,虚拟路由器冗余协议)功能,因此,keepalived还可以作为nginx、haproxy、mysql等服务的高可用解决方案。
以nginx为例,为了防止nginx本身由于宕机等原因导致网站不可用,一般会搭两套nginx反向代理,用keepalived提供一个VIP。
一般情况下,VIP只在nginx主节点上工作,如果nginx主节点不可用了,VIP会自动漂移到从节点,自动漂移的原理即VRRP协议。
VIP漂移到从节点后,如果主节点恢复正常了,VIP是否漂移回主节点,取决于当前模式是抢占模式还是非抢占模式。
下图是一张简单的架构图,解释如下:
以上观点纯属个人意见,如果错误,欢迎指出,有些地方写的很简单,是因为我也不懂~
㈡ nginx负载均衡策略是什么
当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,通过负载均衡的方式来分担服务器压力。
建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,将该访问请求引入该服务器。
如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
nginx实现反向代理负载均衡
a、本地使用Windows系统,然后使用VirutalBox安装一个虚拟的Linux系统。
在本地的Windows系统上分别安装nginx(侦听8080端口)和apache(侦听80端口)。在虚拟的Linux系统上安装apache(侦听80端口)。这样相当于拥有了1台nginx在前端作为反向代理服务器;后面有2台apache作为应用程序服务器,可以看作是小型的server cluster。
b、nginx用来作为反向代理服务器,放置到两台apache之前,作为用户访问的入口。
㈢ nginx负载均衡怎么访问数据库
nginx 是一个轻量级的、高性能的 web server 主要可以干两件事情:
1、直接作为http server(代替apache,对PHP需要FastCGI处理器支持);
2、作为反向代理服务器实现负载均衡
以下我们就来举例说明如何使用 nginx 实现负载均衡。因为nginx在处理并发方面的优势,现在这个应用非常常见。当然了Apache的 mod_proxy和mod_cache结合使用也可以实现对多台app server的反向代理和负载均衡,但是在并发处理方面apache还是没有 nginx擅长。
方法/步骤
1
一、环境:
a. 我们本地是Windows系统,然后使用VirutalBox安装一个虚拟的Linux系统。
在本地的Windows系统上分别安装nginx(侦听8080端口)和apache(侦听80端口)。在虚拟的Linux系统上安装apache(侦听80端口)。
这样我们相当于拥有了1台nginx在前端作为反向代理服务器;后面有2台apache作为应用程序服务器(可以看作是小型的server cluster。;-) );
b. nginx用来作为反向代理服务器,放置到两台apache之前,作为用户访问的入口;
nginx仅仅处理静态页面,动态的页面(php请求)统统都交付给后台的两台apache来处理。
也就是说,可以把我们网站的静态页面或者文件放置到nginx的目录下;动态的页面和数据库访问都保留到后台的apache服务器上。
c. 如下介绍两种方法实现server cluster的负载均衡。
我们假设前端nginx(为127.0.0.1:80)仅仅包含一个静态页面index.html;
后台的两个apache服务器(分别为localhost:80和158.37.70.143:80),一台根目录放置phpMyAdmin文件夹和test.php(里面测试代码为print “server1“;),另一台根目录仅仅放置一个test.php(里面测试代码为 print “server2“;)。
2
二、针对不同请求 的负载均衡:
a. 在最简单地构建反向代理的时候 (nginx仅仅处理静态不处理动态内容,动态内容交给后台的apache server来处理),我们具体的设置为:在nginx.conf中修改:
复制代码 代码如下:
location ~ \.php$ {
proxy_pass 158.37.70.143:80 ;
}
这样当客户端访问localhost:8080/index.html的时候,前端的nginx会自动进行响应;
当用户访问localhost:8080/test.php的时候(这个时候nginx目录下根本就没有该文件),但是通过上面的设置 location ~ \.php$(表示正则表达式匹配以.php结尾的文件,详情参看location是如何定义和匹配的) ,nginx服务器会自动pass给 158.37.70.143的apache服务器了。该服务器下的test.php就会被自动解析,然后将html的结果页面返回给nginx,然后 nginx进行显示(如果nginx使用memcached模块或者squid还可以支持缓存),输出结果为打印server2。
如上是最为简单的使用nginx做为反向代理服务器的例子;
b. 我们现在对如上例子进行扩展,使其支持如上的两台服务器。
我们设置nginx.conf的server模块部分,将对应部分修改为:
复制代码 代码如下:
location ^~ /phpMyAdmin/ {
proxy_pass 127.0.0.1:80 ;
}
location ~ \.php$ {
proxy_pass 158.37.70.143:80 ;
}
上面第一个部分location ^~ /phpMyAdmin/,表示不使用正则表达式匹配(^~),而是直接匹配,也就是如果客户端访问的 URL是以http://localhost:8080/phpMyAdmin/ 开头的话(本地的nginx目录下根本没有phpMyAdmin目录),nginx会自动pass到127.0.0.1:80 的Apache服务器,该服务器对phpMyAdmin目录下的页面进行解析,然后将结果发送给nginx,后者显示;
如果客户端访问URL是http://localhost/test.php 的话,则会被pass到158.37.70.143:80 的apache进行处理。
因此综上,我们实现了针对不同请求的负载均衡。
如果用户访问静态页面index.html,最前端的nginx直接进行响应;
如果用户访问test.php页面的话,158.37.70.143:80 的Apache进行响应;
如果用户访问目录phpMyAdmin下的页面的话,127.0.0.1:80 的Apache进行响应;
3
三、 访问同一页面 的负载均衡:
即用户访问http://localhost:8080/test.php 这个同一页面的时候,我们实现两台服务器的负载均衡 (实际情况中,这两个服务器上的数据要求同步一致,这里我们分别定义了打印server1和server2是为了进行辨认区别)。
a. 现在我们的情况是在windows下nginx是localhost侦听8080端口;
两台apache,一台是127.0.0.1:80(包含test.php页面但是打印server1),另一台是虚拟机的158.37.70.143:80(包含test.php页面但是打印server2)。
b. 因此重新配置nginx.conf为:
首先在nginx的配置文件nginx.conf的http模块中添加,服务器集群server cluster(我们这里是两台)的定义:
复制代码 代码如下:
upstream myCluster {
server 127.0.0.1:80 ;
server 158.37.70.143:80 ;
}
表示这个server cluster包含2台服务器
〉然后在server模块中定义,负载均衡:
复制代码 代码如下:
location ~ \.php$ {
proxy_pass http://myCluster ; #这里的名字和上面的cluster的名字相同
proxy_ www.gzlij.comredirect 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;
}
这样的话,如果访问http://localhost:8080/test.php 页面的话,nginx目录下根本没有该文件,但是它会自动将其pass到myCluster定义的服务区机群中,分别由127.0.0.1:80;或者158.37.70.143:80;来做处理。
上面在定义upstream的时候每个server之后没有定义权重,表示两者均衡;如果希望某个更多响应的话例如:
复制代码 代码如下:
upstream myCluster {
server 127.0.0.1:80 weight=5;
server 158.37.70.143:80 ;
}
4
综上,我们使用nginx的反向代理服务器reverse proxy server的功能,将其布置到多台apache server的前端。
nginx仅仅用来处理静态页面响应和动态请求的代理pass,后台的apache server作为app server来对前台pass过来的动态页面进行处理并返回给nginx。
通过以上的架构,我们可以实现nginx和多台apache构成的机群cluster的负载均衡。
两种均衡:
1)可以在nginx中定义访问不同的内容,代理到不同的后台server; 如上例子中的访问phpMyAdmin目录代理到第一台server上;访问test.php代理到第二台server上;
2)可以在nginx中定义访问同一页面,均衡 (当然如果服务器性能不同可以定义权重来均衡)地代理到不同的后台server上。 如上的例子访问test.php页面,会均衡地代理到server1或者server2上。
实际应用中,server1和server2上分别保留相同的app程序和数据,需要考虑两者的数据同步。