《运维--PlayBook》更新中.......!请访问: https://ops.cnmysql.com
PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下。
一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术。具体的应用需求还得具体分析,如果是中小型的Web应用,比如日PV小于1000万,用Nginx就完全可以了;如果机器不少,可以用DNS轮询,LVS所耗费的机器还是比较多的;大型网站或重要的服务,且服务器比较多时,可以考虑用LVS。
一种是通过硬件来进行进行,常见的硬件有比较昂贵的F5和Array等商用的负载均衡器,它的优点就是有专业的维护团队来对这些服务进行维护、缺点就是花销太大,所以对于规模较小的网络服务来说暂时还没有需要使用;另外一种就是类似于Nginx/LVS/HAProxy的基于Linux的开源免费的负载均衡软件,这些都是通过软件级别来实现,所以费用非常低廉。
目前关于网站架构一般比较合理流行的架构方案:Web前端采用Nginx/HAProxy+Keepalived作负载均衡器;后端采用MySQL数据库一主多从和读写分离,采用LVS+Keepalived的架构。当然要根据项目具体需求制定方案。
下面说说各自的特点和适用场合。
Nginx的优点是:
1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是它目前广泛流行的主要原因之一,Nginx单凭这点可利用的场合就远多于LVS了。
2、Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势之一;相反LVS对网络稳定性依赖比较大,这点本人深有体会;
3、Nginx安装和配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。
3、可以承担高负载压力且稳定,在硬件不差的情况下一般能支撑几万次的并发量,负载度比LVS相对小些。
4、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而不满。
5、Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP也是近几年非常流行的web架构,在高流量的环境中稳定性也很好。
6、Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,可以考虑用其作为反向代理加速器。
7、Nginx可作为中层反向代理使用,这一层面Nginx基本上无对手,唯一可以对比Nginx的就只有lighttpd了,不过lighttpd目前还没有做到Nginx完全的功能,配置也不那么清晰易读,社区资料也远远没Nginx活跃。
8、Nginx也可作为静态网页和图片服务器,这方面的性能也无对手。还有Nginx社区非常活跃,第三方模块也很多。
Nginx的缺点是:
1、Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些,这个是它的缺点。
2、对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。不支持Session的直接保持,但能通过ip_hash来解决。
LVS:使用Linux内核集群实现一个高性能、高可用的负载均衡服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。
LVS的优点是:
1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。
2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
3、工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如LVS+Keepalived,不过我们在项目实施中用得最多的还是LVS/DR+Keepalived。
4、无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会收到大流量的影响。
5、应用范围比较广,因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、在线聊天室等等。
LVS的缺点是:
1、软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。
2、如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了,特别后面有Windows Server的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了。
HAProxy的特点是:
1、HAProxy也是支持虚拟主机的。
2、HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。
3、HAProxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
4、HAProxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,大家可以用LVS+Keepalived对MySQL主从做负载均衡。
5、HAProxy负载均衡策略非常多,HAProxy的负载均衡算法现在具体有如下8种:
① roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
② static-rr,表示根据权重,建议关注;
③ leastconn,表示最少连接者先处理,建议关注;
④ source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;
⑤ ri,表示根据请求的URI;
⑥ rl_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name;
⑦ hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
⑧ rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
Nginx和LVS对比的总结:
1、Nginx工作在网络的7层,所以它可以针对http应用本身来做分流策略,比如针对域名、目录结构等,相比之下LVS并不具备这样的功能,所以Nginx单凭这点可利用的场合就远多于LVS了;但Nginx有用的这些功能使其可调整度要高于LVS,所以经常要去触碰触碰,触碰多了,人为出问题的几率也就会大。
2、Nginx对网络稳定性的依赖较小,理论上只要ping得通,网页访问正常,Nginx就能连得通,这是Nginx的一大优势!Nginx同时还能区分内外网,如果是同时拥有内外网的节点,就相当于单机拥有了备份线路;LVS就比较依赖于网络环境,目前来看服务器在同一网段内并且LVS使用direct方式分流,效果较能得到保证。另外注意,LVS需要向托管商至少申请多一个ip来做Visual IP,貌似是不能用本身的IP来做VIP的。要做好LVS管理员,确实得跟进学习很多有关网络通信方面的知识,就不再是一个HTTP那么简单了。
3、Nginx安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。LVS的安装和配置、测试就要花比较长的时间了;LVS对网络依赖比较大,很多时候不能配置成功都是因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦得多。
4、Nginx也同样能承受很高负载且稳定,但负载度和稳定度差LVS还有几个等级:Nginx处理所有流量所以受限于机器IO和配置;本身的bug也还是难以避免的。
5、Nginx可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。目前LVS中 ldirectd也能支持针对服务器内部的情况来监控,但LVS的原理使其不能重发请求。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,Nginx会把上传切到另一台服务器重新处理,而LVS就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而恼火。
6、Nginx对请求的异步处理可以帮助节点服务器减轻负载,假如使用apache直接对外服务,那么出现很多的窄带链接时apache服务器将会占用大 量内存而不能释放,使用多一个Nginx做apache代理的话,这些窄带链接会被Nginx挡住,apache上就不会堆积过多的请求,这样就减少了相当多的资源占用。这点使用squid也有相同的作用,即使squid本身配置为不缓存,对apache还是有很大帮助的。
7、Nginx能支持http、https和email(email的功能比较少用),LVS所支持的应用在这点上会比Nginx更多。在使用上,一般最前端所采取的策略应是LVS,也就是DNS的指向应为LVS均衡器,LVS的优点令它非常适合做这个任务。重要的ip地址,最好交由LVS托管,比如数据库的 ip、webservice服务器的ip等等,这些ip地址随着时间推移,使用面会越来越大,如果更换ip则故障会接踵而至。所以将这些重要ip交给 LVS托管是最为稳妥的,这样做的唯一缺点是需要的VIP数量会比较多。Nginx可作为LVS节点机器使用,一是可以利用Nginx的功能,二是可以利用Nginx的性能。当然这一层面也可以直接使用squid,squid的功能方面就比Nginx弱不少了,性能上也有所逊色于Nginx。Nginx也可作为中层代理使用,这一层面Nginx基本上无对手,唯一可以撼动Nginx的就只有lighttpd了,不过lighttpd目前还没有能做到 Nginx完全的功能,配置也不那么清晰易读。另外,中层代理的IP也是重要的,所以中层代理也拥有一个VIP和LVS是最完美的方案了。具体的应用还得具体分析,如果是比较小的网站(日PV小于1000万),用Nginx就完全可以了,如果机器也不少,可以用DNS轮询,LVS所耗费的机器还是比较多的;大型网站或者重要的服务,机器不发愁的时候,要多多考虑利用LVS。
现在对网络负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术:
第一阶段:利用Nginx或HAProxy进行单点的负载均衡,这一阶段服务器规模刚脱离开单服务器、单数据库的模式,需要一定的负载均衡,但是仍然规模较小没有专业的维护团队来进行维护,也没有需要进行大规模的网站部署。这样利用Nginx或HAproxy就是第一选择,此时这些东西上手快, 配置容易,在七层之上利用HTTP协议就可以。这时是第一选择。
第二阶段:随着网络服务进一步扩大,这时单点的Nginx已经不能满足,这时使用LVS或者商用Array就是首要选择,Nginx此时就作为LVS或者Array的节点来使用,具体LVS或Array的是选择是根据公司规模和预算来选择,Array的应用交付功能非常强大,本人在某项目中使用过,性价比也远高于F5,商用首选!但是一般来说这阶段相关人才跟不上业务的提升,所以购买商业负载均衡已经成为了必经之路。
第三阶段:这时网络服务已经成为主流产品,此时随着公司知名度也进一步扩展,相关人才的能力以及数量也随之提升,这时无论从开发适合自身产品的定制,以及降低成本来讲开源的LVS,已经成为首选,这时LVS会成为主流。
最终形成比较理想的基本架构为:Array/LVS — Nginx/Haproxy — Squid/Varnish — AppServer。
Cluster原理
集群的总类:
1.负载均衡集群(LB:Load Banlancing):实现将一个访问量或者任务量特别大的应用,给他
平均分配到不同的服务器上面,以提供高容量、大并发。
2.高可用集群(HA:High Avalibility):将多台计算机组合起来,避免一个服务因某台机器
出现故障,而导致服务中断的,在于保障服务的可持续性。
3.高性能集群(HP:High Performance)又叫科学运算集群:解决复杂的计算,组合起来的集群,一般要很大量
的计算机组成。suse用的比较多
集群分别代表的软件
LB:负载均衡集群(LB:Load Banlancing)
lvs(Linux Virtual Serverlinux虚拟服务器):提供更高的吞吐率、提供冗余、更灵活的实用性
lvs:ipvsadm(工作在用户空间)/(ipvs工作在内核空间)和iptables/netfilter类似
lvs的四个ip地址
1)Virtual IP address(VIP):面向用户提供服务的地址
2)Real IP address(RIP):real server的ip地址
3)Director’s IP address(DIP):director与real server连接的ip地址,DIP是配置在director上面
4)Client computer’s IP address(CIP): 客户端地址
拓扑图: (ip4)web server1
[LVS] /
user(ip1)—-(ip2)director(ip3)
\
(ip5)web server2
ip1表示CIP,ip2表示VIP,ip3表示DIP,ip4和ip5表示RIP
lvs的三个种类(或者三个模型)
1)NAT:Network address translation网络地址转换(LVS-NAT)—>目标地址转换
如何实现:
CIP–>VIP DIP–>RIP
Client————->Director————->Cluster node(server)
<————- <————-
CIP<–VIP DIP<–VIP
NAT模型一般承受5-6台server node
拓扑图:
(ip4)web server1
[LVS] /
user(ip1)—-(ip2)director(ip3)
\
(ip5)web server2
请求的过程:user[S(CIP)D(VIP)]——>director[S(CIP)D(RIP)]—–>web
涉及到目标地址转换(DNAT)
回复的过程:web—–>director[S(RIP)D(CIP)]—–>user[S(VIP)D(CIP)]
涉及到源地址转换(SNAT)
web server 的网关是指向director的DIP。
NAT模型的要求:集群节点必须在同一个网段当中,即DIP与RIP在同一个网段;RIP通常使用私有IP
地址,仅用于和DIP地址进行通信;director将处理在客户端与server之间的所有通信;server
必须把DIP设置为默认的网关;director可以实现端口映射,即VIP的端口和RIP的端口可以不一
样;server可以使用任意的操作系统;director所能支持的server的数量不多;
2)Direct routing:直接路由(LVS-DR)使用最多的模型,用于生产环境中
DR模式可以承受上百台server
拓扑图:
web server1
(RIP)—–> 虚拟一个VIP
/
user(CIP)——router——–switch—-(VIP/DIP)director
\
(RIP)—-> 虚拟一个VIP
web server2
请求的过程:user[S(CIP)D(VIP)]——>director[S(CIP)D(VIP)]—–>web
回复的过程web——->user[S(VIP)D(CIP)]
DR模型中web server和director都有两个IP,server是RIP和VIP,每个server的VIP都一样,但是RIP
不一样。
DR模型的要求:server必须和director在同一个物理网络上;RIP可以使用公网地址,使用公网地址的好处
如果director出现故障,可以用dns的A记录来指向server的RIP;director仅处理发来的请求,响应的请求
将不在通过director;通常server的网关一定不能指向director;director不能做端口映射,server可以
使用任意的操作系统;director能支持大量的server;
3)IP tunneling:IP隧道(LVS-TUN)
拓扑图:
(RIP)web server1
/
user(CIP)——router——–network cloud—-(VIP/DIP)director
\
(RIP)web server2
请求的过程:user[S(CIP)D(VIP)]——>director[S(DIP)D(RIP)]—–>web
把源[S(CIP)D(VIP)]进行了封装成DIP
回复的过程:web[S(VIP)D(CIP)]—–>user
把从director接受到的包解分装,发现源是director的VIP,目的是
user的CIP
TUN模型的要求:server和director在不同的网络上;RIP必须是公网IP地址;director只
需要处理传来的请求,同时响应的数据包一定不能经过director;director不能做端口映射;
只有支持IP隧道的操作系统才能是server
director的调度server的方法:
1)静态调度方法:fixed Scheduling Methods指director在选举server的时候不会考虑这个server当前
的连接的活动状态。
代表算法
RR(Round-robin)轮叫算法
WRR(Weighted round-robin)加权轮叫算法—>适合server的硬件不同和性能不同
DH(Destination hashing)目标地址哈希算法—->将同一个ip地址的请求发给同一个server,应 用的server为sqiud server 缓存服务器
SH(Source hashing)源地址哈希算法—->适合公司很多员工,然后自己上网的外接口有两个
2)动态调度方法:dynamic scheduling methods指director每选举server的时候会判断这个server当前连接
状态是不是很多,如果很多则排除在外,然后选择那些连接状态比较少的,如果连接状态都一样多,那就选择排在最上面的。
TCP连接 活动状态的标识是established并且有数据传输,非活动状态的标识是非established状态的连接,连接还没有断开,但是已经不在传输数据了。还有一种就是根本没有连接
代表算法
LC(Least-connection)最少连接数—->每当一个新的请求连接进来,director会查看每个 server上当前处于活动状态的个数和处于非活动状态的个数,计算方法 overhaed(当前的负载个数)=10(处于活动状态的个数)*256+10000(非活 动状态),首先那个server的overhead个数少就选那个server,如果 server的overhead相同,那就选择排列在server列表的最上方的一个server。
WLC(Weight Least-connection)是最优算法,也是默认的算法,计算方法overhead/weight(权重)
SED(Shortst Expected Delay)最少期望延迟—->是WLC的改进算法,在算overhaed值的时候不考 虑非活动状态的值,计算方法overhaed=(n+1)*256/weight,n表示 活动的个数,weight表示权重。
NQ(Never Queue)从不排队—->对SED的算法的改进,先不管overhaed是多少,只要有server的连 接状态为0,则会给你一个连接个数。
LBLC(Locality-Based Least-Connection)基于本地的最少连接,是DH算法的动态调度。
LBLCR(Locality-Based Least-Connection with Replication Scheduing)带复制的基于本地的最 少连接,时候director后面接cache服务器的,在接后面的server
LVS的实验:NAT模式
拓扑图:
(ip4)web server1
[LVS] / \
user(ip1)—-(ip2)director(ip3) ====nfs(来共享文件)
\ /
(ip5)web server2
ip地址规划
保证web server的数据一致—->1.rsync实现文件级别的同步,效率不高
2.drbd基于主机的磁盘镜像,高可用集群中用到
3.share storage共享存储 a.DAS直接附加存储 b.NAS(nfs、 samba)文件服务 c.SAN存储区域网络,本身具有冗余
1.看内核是否支持ipvs
grep -i ‘ip_vs’ /boot/config-2.6.32-71.el6.i686
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
CONFIG_IP_VS_FTP=m
2.拓扑规划ip
Client:
ip1(CIP)=192.168.1.1
Director:
ip2(VIP)=192.168.1.10 gw=192.168.1.1
ip3(DIP)=192.168.14.50
Web server1:
ip4(RIP)=192.168.14.51 gw=192.168.14.50
Web Server2:
ip5(RIP)=192.168.14.52 gw=192.168.14.50
3.Diretor的配置:
ifconfig eth0 192.168.1.10/24
ifconfig eth1 192.168.14.50
route add default gw 192.168.1.1
iptables -F
a)yum -y install ipvsadm
b)man ipvsadm
ipvsadm -D -t|u|f service-address 删除集群服务
ipvsadm -C 清空集群服务的
ipvsadm -R
ipvsadm -S [-n] 显示统计数据的
ipvsadm -d -t|u|f service-address -r server-address 从集群服务里面删除real server的
ipvsadm -L|l [options] 显示状态表或者查看
ipvsadm -Z [-t|u|f service-address] 清空计数器的
ipvsadm –set tcp tcpfin udp 设置超时时间
ipvsadm –start-daemon state [--mcast-interface interface]
[--syncid syncid]
ipvsadm –stop-daemon state
ipvsadm -h 帮助
1.定义一个集群服务:
ipvsadm -A|E -t|u|f service-address [-s scheduler]
[-p [timeout]] [-O] [-M netmask] 定义集群服务
解释:-A|E -A表示add,E表示修改
-t|u|f t(后面可接端口号)表示tcp协议,u(后面可接端口号)表示udp协议,f表示firewall-mark
service-address服务地址即director (VIP)
-s指明调度方法(默认是WLC)
eg:ipvsadm -A -t 192.168.1.112:80 -s rr
2.向此集群服务器添加RealServer
ipvsadm -a|e -t|u|f service-address -r server-address
[-g|i|m] [-w weight] [-x upper] [-y lower] 向集群服务添加real server的
解释:-a|e -A表示add,E表示修改
-t|u|f t(后面可接端口号)表示tcp协议,u(后面可接端口号)表示udp协议,f表示firewall-mark
service-address服务地址 director
-r 指明real server的地址 server-address
[-g|i|m] g表示直接路由模型 i隧道模型 m表示nat模型 默认是-g DR模型
-w 表示权重 可以省略,省略表示1,选择这个之前你的算法可以支持权重
-x 连接的个数的上限
-y 连接的个数的下限
eg:ipvsadm -a -t 192.168.1.112:80 -r 192.168.14.51 -m -w 1
ipvsadm -a -t 192.168.1.112:80 -r 192.168.14.52 -m -w 2
c)设置转发
sysctl -w net.ipv4.ip_forward=1
or
sed -i ‘/net.ipv4.ip_forward/s/0/1/’ /etc/sysctl.conf
sysctl -p
4.Web Server1的配置:
ifconfig eth0 192.168.14.51/24
route add default gw 192.168.14.50
a)yum -y install httpd
b)sed -i ‘$a ServerName 192.168.14.51:80′ /etc/httpd/conf/httpd.conf
c)echo “this is web1 server” >> /var/www/html/index.html
d)service httpd restart
5.Web Server 的配置
ifconfig eth0 192.168.14.52/24
route add default gw 192.168.14.50
a)yum -y install httpd
b)sed -i ‘$a ServerName 192.168.14.52:80′ /etc/httpd/conf/httpd.conf
c)echo “this is web2 server” >> /var/www/html/index.html
d)service httpd restart
LVS:DR模型
拓扑图:
web server1
(RIP)—–> 虚拟一个VIP
/
user(CIP)——router——–switch—-(VIP/DIP)director
\
(RIP)—-> 虚拟一个VIP
web server2
1.规划ip
Client:
CIP=172.16.1.1
director:
VIP=172.16.1.100—->eth0:1(虚拟的ip)
DIP=172.16.1.200—>eth0
web server1:
VIP=172.16.1.100(指向director的VIP) —> lo:1 (虚拟的ip) gw可以不配置 配置一定不能指向director的DIP上面
RIP=172.16.1.10—->eth0
web server2:
VIP=172.16.1.100—> lo:1 (虚拟的ip) gw可以不配置 配置一定不能指向director的DIP上面
RIP=172.16.1.20—->eth0
director的配置:
ifconfig eth0 172.16.1.200/24
ifconfig eth0:1 172.16.1.100 broadcast 172.16.1.100 netmask 255.255.255.255 up
route add -host 172.16.1.100 dev eth0:1
yum -y install ipvsadm
ipvsadm -A -t 172.16.1.100:80 -s wlc
ipvsadm -a -t 172.16.1.100:80 -r 172.16.1.10 -w 2 -g
ipvsadm -a -t 172.16.1.100:80 -r 172.16.1.20 -w 2 -g
web server1的配置:
ifconfig eth0 172.16.1.10/24
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:1 172.16.1.100 broadcast 172.16.1.100 netmask 255.255.255.255 up
route add -host 172.16.1.100 dev lo:1
yum -y install httpd
sed -i ‘$a ServerName 172.16.1.10:80′ /etc/httpd/conf/httpd.conf
echo “this is web1 server” >> /var/www/html/index.html
service httpd restart
web server2的配置:
ifconfig eth0 172.16.1.20/24
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:1 172.16.1.100 broadcast 172.16.1.100 netmask 255.255.255.255 up
route add -host 172.16.1.100 dev lo:1
yum -y install httpd
sed -i ‘$a ServerName 172.16.1.20:80′ /etc/httpd/conf/httpd.conf
echo “this is web2 server” >> /var/www/html/index.html
service httpd restart
DR模型的脚本
Real(web) server script
vim /etc/init.d/real
##################
#!/bin/bash
#script to start lvs-dr web server
. /etc/rc.d/init.d/functions
read -p “please input a ip for set up real server VIP:” VIP
case “$1″ in
start)
/sbin/ifconfig lo down
/sbin/ifconfig lo up
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
/sbin/ifconfig lo:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:1
;;
stop)
/sbin/ifconfig lo:1 down
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
islothere=`/sbin/ifconfig lo:1 | grep $VIP`
isrothere=`netstat -rn | grep “lo:1″ | grep $VIP`
if [ ! "islothere" -o ! "isrothere" ];then
echo “LVS-DR real server Stopped.”
else
echo “LVS-DR real server Running.”
fi
;;
*)
echo ” Usage: $0 (start|status|stop)”
exit 1
;;
esac
###########保存退出 +x
service real start|stop|status
director script
vim /etc/init.d/ipvs
######
#!/bin/bash
#script to start lvs-dr director server
. /etc/rc.d/init.d/functions
VIP=
RIP1=
RIP2=
PORT=80
case “$1″ in
start)
/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:1
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -F
/sbin/ipvsadm -C
ipvsadm -A -t $VIP:$PORT -s wlc
ipvsadm -a -t $VIP:$PORT -r $RIP1 -w 2 -g
ipvsadm -a -t $VIP:$PORT -r $RIP2 -w 2 -g
/bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;;
stop)
echo 0 > /proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth0:1 down
/sbin/route del $VIP
/bin/rm -f /var/lock/subsys/ipvsadm
echo “ipvs is stopped….”
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo “ipvsadm is stopped…”
else
echo “ipvsadm is running…”
ipvsadm -L -n
fi
;;
*)
echo “$0: Usage: $0 (start|status|stop)”
exit 1
;;
esac
######保存退出 +x
service ipvs start|stop|status
集群的总类:
1.负载均衡集群(LB:Load Banlancing):实现将一个访问量或者任务量特别大的应用,给他
平均分配到不同的服务器上面,以提供高容量、大并发。
2.高可用集群(HA:High Avalibility):将多台计算机组合起来,避免一个服务因某台机器
出现故障,而导致服务中断的,在于保障服务的可持续性。
3.高性能集群(HP:High Performance)又叫科学运算集群:解决复杂的计算,组合起来的集群,一般要很大量
的计算机组成。suse用的比较多
集群分别代表的软件
LB:负载均衡集群(LB:Load Banlancing)
lvs(Linux Virtual Serverlinux虚拟服务器):提供更高的吞吐率、提供冗余、更灵活的实用性
lvs:ipvsadm(工作在用户空间)/(ipvs工作在内核空间)和iptables/netfilter类似
lvs的四个ip地址
1)Virtual IP address(VIP):面向用户提供服务的地址
2)Real IP address(RIP):real server的ip地址
3)Director’s IP address(DIP):director与real server连接的ip地址,DIP是配置在director上面
4)Client computer’s IP address(CIP): 客户端地址
拓扑图: (ip4)web server1
[LVS] /
user(ip1)—-(ip2)director(ip3)
\
(ip5)web server2
ip1表示CIP,ip2表示VIP,ip3表示DIP,ip4和ip5表示RIP
lvs的三个种类(或者三个模型)
1)NAT:Network address translation网络地址转换(LVS-NAT)—>目标地址转换
如何实现:
CIP–>VIP DIP–>RIP
Client————->Director————->Cluster node(server)
<————- <————-
CIP<–VIP DIP<–VIP
NAT模型一般承受5-6台server node
拓扑图:
(ip4)web server1
[LVS] /
user(ip1)—-(ip2)director(ip3)
\
(ip5)web server2
请求的过程:user[S(CIP)D(VIP)]——>director[S(CIP)D(RIP)]—–>web
涉及到目标地址转换(DNAT)
回复的过程:web—–>director[S(RIP)D(CIP)]—–>user[S(VIP)D(CIP)]
涉及到源地址转换(SNAT)
web server 的网关是指向director的DIP。
NAT模型的要求:集群节点必须在同一个网段当中,即DIP与RIP在同一个网段;RIP通常使用私有IP
地址,仅用于和DIP地址进行通信;director将处理在客户端与server之间的所有通信;server
必须把DIP设置为默认的网关;director可以实现端口映射,即VIP的端口和RIP的端口可以不一
样;server可以使用任意的操作系统;director所能支持的server的数量不多;
2)Direct routing:直接路由(LVS-DR)使用最多的模型,用于生产环境中
DR模式可以承受上百台server
拓扑图:
web server1
(RIP)—–> 虚拟一个VIP
/
user(CIP)——router——–switch—-(VIP/DIP)director
\
(RIP)—-> 虚拟一个VIP
web server2
请求的过程:user[S(CIP)D(VIP)]——>director[S(CIP)D(VIP)]—–>web
回复的过程web——->user[S(VIP)D(CIP)]
DR模型中web server和director都有两个IP,server是RIP和VIP,每个server的VIP都一样,但是RIP
不一样。
DR模型的要求:server必须和director在同一个物理网络上;RIP可以使用公网地址,使用公网地址的好处
如果director出现故障,可以用dns的A记录来指向server的RIP;director仅处理发来的请求,响应的请求
将不在通过director;通常server的网关一定不能指向director;director不能做端口映射,server可以
使用任意的操作系统;director能支持大量的server;
3)IP tunneling:IP隧道(LVS-TUN)
拓扑图:
(RIP)web server1
/
user(CIP)——router——–network cloud—-(VIP/DIP)director
\
(RIP)web server2
请求的过程:user[S(CIP)D(VIP)]——>director[S(DIP)D(RIP)]—–>web
把源[S(CIP)D(VIP)]进行了封装成DIP
回复的过程:web[S(VIP)D(CIP)]—–>user
把从director接受到的包解分装,发现源是director的VIP,目的是
user的CIP
TUN模型的要求:server和director在不同的网络上;RIP必须是公网IP地址;director只
需要处理传来的请求,同时响应的数据包一定不能经过director;director不能做端口映射;
只有支持IP隧道的操作系统才能是server
director的调度server的方法:
1)静态调度方法:fixed Scheduling Methods指director在选举server的时候不会考虑这个server当前
的连接的活动状态。
代表算法
RR(Round-robin)轮叫算法
WRR(Weighted round-robin)加权轮叫算法—>适合server的硬件不同和性能不同
DH(Destination hashing)目标地址哈希算法—->将同一个ip地址的请求发给同一个server,应 用的server为sqiud server 缓存服务器
SH(Source hashing)源地址哈希算法—->适合公司很多员工,然后自己上网的外接口有两个
2)动态调度方法:dynamic scheduling methods指director每选举server的时候会判断这个server当前连接
状态是不是很多,如果很多则排除在外,然后选择那些连接状态比较少的,如果连接状态都一样多,那就选择排在最上面的。
TCP连接 活动状态的标识是established并且有数据传输,非活动状态的标识是非established状态的连接,连接还没有断开,但是已经不在传输数据了。还有一种就是根本没有连接
代表算法
LC(Least-connection)最少连接数—->每当一个新的请求连接进来,director会查看每个 server上当前处于活动状态的个数和处于非活动状态的个数,计算方法 overhaed(当前的负载个数)=10(处于活动状态的个数)*256+10000(非活 动状态),首先那个server的overhead个数少就选那个server,如果 server的overhead相同,那就选择排列在server列表的最上方的一个server。
WLC(Weight Least-connection)是最优算法,也是默认的算法,计算方法overhead/weight(权重)
SED(Shortst Expected Delay)最少期望延迟—->是WLC的改进算法,在算overhaed值的时候不考 虑非活动状态的值,计算方法overhaed=(n+1)*256/weight,n表示 活动的个数,weight表示权重。
NQ(Never Queue)从不排队—->对SED的算法的改进,先不管overhaed是多少,只要有server的连 接状态为0,则会给你一个连接个数。
LBLC(Locality-Based Least-Connection)基于本地的最少连接,是DH算法的动态调度。
LBLCR(Locality-Based Least-Connection with Replication Scheduing)带复制的基于本地的最 少连接,时候director后面接cache服务器的,在接后面的server
LVS的实验:NAT模式
拓扑图:
(ip4)web server1
[LVS] / \
user(ip1)—-(ip2)director(ip3) ====nfs(来共享文件)
\ /
(ip5)web server2
ip地址规划
保证web server的数据一致—->1.rsync实现文件级别的同步,效率不高
2.drbd基于主机的磁盘镜像,高可用集群中用到
3.share storage共享存储 a.DAS直接附加存储 b.NAS(nfs、 samba)文件服务 c.SAN存储区域网络,本身具有冗余
1.看内核是否支持ipvs
grep -i ‘ip_vs’ /boot/config-2.6.32-71.el6.i686
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
CONFIG_IP_VS_FTP=m
2.拓扑规划ip
Client:
ip1(CIP)=192.168.1.1
Director:
ip2(VIP)=192.168.1.10 gw=192.168.1.1
ip3(DIP)=192.168.14.50
Web server1:
ip4(RIP)=192.168.14.51 gw=192.168.14.50
Web Server2:
ip5(RIP)=192.168.14.52 gw=192.168.14.50
3.Diretor的配置:
ifconfig eth0 192.168.1.10/24
ifconfig eth1 192.168.14.50
route add default gw 192.168.1.1
iptables -F
a)yum -y install ipvsadm
b)man ipvsadm
ipvsadm -D -t|u|f service-address 删除集群服务
ipvsadm -C 清空集群服务的
ipvsadm -R
ipvsadm -S [-n] 显示统计数据的
ipvsadm -d -t|u|f service-address -r server-address 从集群服务里面删除real server的
ipvsadm -L|l [options] 显示状态表或者查看
ipvsadm -Z [-t|u|f service-address] 清空计数器的
ipvsadm –set tcp tcpfin udp 设置超时时间
ipvsadm –start-daemon state [--mcast-interface interface]
[--syncid syncid]
ipvsadm –stop-daemon state
ipvsadm -h 帮助
1.定义一个集群服务:
ipvsadm -A|E -t|u|f service-address [-s scheduler]
[-p [timeout]] [-O] [-M netmask] 定义集群服务
解释:-A|E -A表示add,E表示修改
-t|u|f t(后面可接端口号)表示tcp协议,u(后面可接端口号)表示udp协议,f表示firewall-mark
service-address服务地址即director (VIP)
-s指明调度方法(默认是WLC)
eg:ipvsadm -A -t 192.168.1.112:80 -s rr
2.向此集群服务器添加RealServer
ipvsadm -a|e -t|u|f service-address -r server-address
[-g|i|m] [-w weight] [-x upper] [-y lower] 向集群服务添加real server的
解释:-a|e -A表示add,E表示修改
-t|u|f t(后面可接端口号)表示tcp协议,u(后面可接端口号)表示udp协议,f表示firewall-mark
service-address服务地址 director
-r 指明real server的地址 server-address
[-g|i|m] g表示直接路由模型 i隧道模型 m表示nat模型 默认是-g DR模型
-w 表示权重 可以省略,省略表示1,选择这个之前你的算法可以支持权重
-x 连接的个数的上限
-y 连接的个数的下限
eg:ipvsadm -a -t 192.168.1.112:80 -r 192.168.14.51 -m -w 1
ipvsadm -a -t 192.168.1.112:80 -r 192.168.14.52 -m -w 2
c)设置转发
sysctl -w net.ipv4.ip_forward=1
or
sed -i ‘/net.ipv4.ip_forward/s/0/1/’ /etc/sysctl.conf
sysctl -p
4.Web Server1的配置:
ifconfig eth0 192.168.14.51/24
route add default gw 192.168.14.50
a)yum -y install httpd
b)sed -i ‘$a ServerName 192.168.14.51:80′ /etc/httpd/conf/httpd.conf
c)echo “this is web1 server” >> /var/www/html/index.html
d)service httpd restart
5.Web Server 的配置
ifconfig eth0 192.168.14.52/24
route add default gw 192.168.14.50
a)yum -y install httpd
b)sed -i ‘$a ServerName 192.168.14.52:80′ /etc/httpd/conf/httpd.conf
c)echo “this is web2 server” >> /var/www/html/index.html
d)service httpd restart
LVS:DR模型
拓扑图:
web server1
(RIP)—–> 虚拟一个VIP
/
user(CIP)——router——–switch—-(VIP/DIP)director
\
(RIP)—-> 虚拟一个VIP
web server2
1.规划ip
Client:
CIP=172.16.1.1
director:
VIP=172.16.1.100—->eth0:1(虚拟的ip)
DIP=172.16.1.200—>eth0
web server1:
VIP=172.16.1.100(指向director的VIP) —> lo:1 (虚拟的ip) gw可以不配置 配置一定不能指向director的DIP上面
RIP=172.16.1.10—->eth0
web server2:
VIP=172.16.1.100—> lo:1 (虚拟的ip) gw可以不配置 配置一定不能指向director的DIP上面
RIP=172.16.1.20—->eth0
director的配置:
ifconfig eth0 172.16.1.200/24
ifconfig eth0:1 172.16.1.100 broadcast 172.16.1.100 netmask 255.255.255.255 up
route add -host 172.16.1.100 dev eth0:1
yum -y install ipvsadm
ipvsadm -A -t 172.16.1.100:80 -s wlc
ipvsadm -a -t 172.16.1.100:80 -r 172.16.1.10 -w 2 -g
ipvsadm -a -t 172.16.1.100:80 -r 172.16.1.20 -w 2 -g
web server1的配置:
ifconfig eth0 172.16.1.10/24
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:1 172.16.1.100 broadcast 172.16.1.100 netmask 255.255.255.255 up
route add -host 172.16.1.100 dev lo:1
yum -y install httpd
sed -i ‘$a ServerName 172.16.1.10:80′ /etc/httpd/conf/httpd.conf
echo “this is web1 server” >> /var/www/html/index.html
service httpd restart
web server2的配置:
ifconfig eth0 172.16.1.20/24
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ifconfig lo:1 172.16.1.100 broadcast 172.16.1.100 netmask 255.255.255.255 up
route add -host 172.16.1.100 dev lo:1
yum -y install httpd
sed -i ‘$a ServerName 172.16.1.20:80′ /etc/httpd/conf/httpd.conf
echo “this is web2 server” >> /var/www/html/index.html
service httpd restart
DR模型的脚本
Real(web) server script
vim /etc/init.d/real
##################
#!/bin/bash
#script to start lvs-dr web server
. /etc/rc.d/init.d/functions
read -p “please input a ip for set up real server VIP:” VIP
case “$1″ in
start)
/sbin/ifconfig lo down
/sbin/ifconfig lo up
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
/sbin/ifconfig lo:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:1
;;
stop)
/sbin/ifconfig lo:1 down
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
islothere=`/sbin/ifconfig lo:1 | grep $VIP`
isrothere=`netstat -rn | grep “lo:1″ | grep $VIP`
if [ ! "islothere" -o ! "isrothere" ];then
echo “LVS-DR real server Stopped.”
else
echo “LVS-DR real server Running.”
fi
;;
*)
echo ” Usage: $0 (start|status|stop)”
exit 1
;;
esac
###########保存退出 +x
service real start|stop|status
director script
vim /etc/init.d/ipvs
######
#!/bin/bash
#script to start lvs-dr director server
. /etc/rc.d/init.d/functions
VIP=
RIP1=
RIP2=
PORT=80
case “$1″ in
start)
/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:1
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -F
/sbin/ipvsadm -C
ipvsadm -A -t $VIP:$PORT -s wlc
ipvsadm -a -t $VIP:$PORT -r $RIP1 -w 2 -g
ipvsadm -a -t $VIP:$PORT -r $RIP2 -w 2 -g
/bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;;
stop)
echo 0 > /proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth0:1 down
/sbin/route del $VIP
/bin/rm -f /var/lock/subsys/ipvsadm
echo “ipvs is stopped….”
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo “ipvsadm is stopped…”
else
echo “ipvsadm is running…”
ipvsadm -L -n
fi
;;
*)
echo “$0: Usage: $0 (start|status|stop)”
exit 1
;;
esac
######保存退出 +x
service ipvs start|stop|status