LVS集群和Keepalived高可用实战

第四十章LVS集群和Keepalived高可用实战

1、ARP协议

一、概念

地址解析协议,即ARP(AddressResolutionProtocol),是根据IP地址获取物理MAC地址的一个TCP/IP协议主机发送信息时将包含目标IP地址的ARP请求广播到网络上的全部主机,并接收返回消息,以此肯定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留必定时间,下次请求时直接查询ARP缓存以节约资源。html

二、功能

OSI模型把网络工做分为七层,IP地址在OSI模型的第三层,MAC地址在第二层,彼此不直接打交道。在经过以太网发送IP数据包时,须要先封装第三层(32位IP地址)、第二层(48位MAC地址)的报头,但因为发送时只知道目标IP地址,不知道其MAC地址,又不能跨第2、三层,因此须要使用地址解析协议。使用地址解析协议,可根据网络层IP数据包包头中的IP地址信息解析出目标硬件地址(MAC地址)信息,以保证通讯的顺利进行。ARP是三层协议,可是工做在二层前端

三、工做过程

主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;mysql

主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;linux

当主机A要与主机B通讯时,地址解析协议能够将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,如下为工做流程:nginx

第1步:根据主机A上的路由表内容,IP肯定用于访问主机B的转发IP地址是192.168.1.2。而后A主机在本身的本地ARP缓存中检查主机B的匹配MAC地址。web

第2步:若是主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的全部主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求而且检查是否与本身的IP地址匹配。若是主机发现请求的IP地址与本身的IP地址不匹配,它将丢弃ARP请求。算法

第3步:主机B肯定ARP请求中的IP地址与本身的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。sql

第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。数据库

第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦肯定,主机A就能向主机B发送IP通讯了。apache

ARP协议要求通讯的主机双方必须在同一网段(即局域网环境)

四、ARP缓存

ARP缓存是个用来储存IP地址和MAC地址的缓冲区,其本质就是一个IP地址-->MAC地址的对应表,表中每个条目分别记录了网络上其余主机的IP地址和对应的MAC地址。每个以太网或令牌环网络适配器都有本身单独的表。当地址解析协议被询问一个已知IP地址节点的MAC地址时,先在ARP缓存中查看,若存在,就直接返回与之对应的MAC地址,若不存在,才发送ARP请求向局域网查询。

为使广播量最小,ARP维护IP地址到MAC地址映射的缓存以便未来使用。ARP缓存能够包含动态和静态项目。动态项目随时间推移自动添加和删除。每一个动态ARP缓存项的潜在生命周期是10分钟。新加到缓存中的项目带有时间戳,若是某个项目添加后2分钟内没有再使用,则此项目过时并从ARP缓存中删除;若是某个项目已在使用,则又收到2分钟的生命周期;若是某个项目始终在使用,则会另外收到2分钟的生命周期,一直到10分钟的最长生命周期。静态项目一直保留在缓存中,直到从新启动计算机为止。

arp缓存表是把双刃剑

(1)有arp缓存表能够加快arp的解析速度

(2)也给黑客带来了攻击服务器的风险,俗称arp欺骗和arp攻击

五、ARP欺骗原理

arp攻击就是经过伪造ip地址和mac地址对实现arp欺骗。地址解析协议是创建在网络中各个主机互相信任的基础上的,它的诞生使得网络可以更加高效的运行,但其自己也存在缺陷:

ARP地址转换表是依赖于计算机中高速缓冲存储器动态更新的,而高速缓冲存储器的更新是受到更新周期的限制的,只保存最近使用的地址的映射关系表项,这使得攻击者有了可乘之机,能够在高速缓冲存储器更新表项以前修改地址转换表,实现攻击。ARP请求为广播形式发送的,网络上的主机能够自主发送ARP应答消息,而且当其余主机收到应答报文时不会检测该报文的真实性就将其记录在本地的MAC地址转换表,这样攻击者就能够向目标主机发送伪ARP应答报文,从而篡改本地的MAC地址表。ARP欺骗能够致使目标计算机与网关通讯失败,更会致使通讯重定向,全部的数据都会经过攻击者的机器,所以存在极大的安全隐患。

如何防止:

arp -s 192.168.0.11 mac

六、ARP命令
(1)arp -a或arp –g

用于查看缓存中的全部项目。-a和-g参数的结果是同样的,多年来-g一直是UNIX平台上用来显示ARP缓存中全部项目的选项,而Windows用的是arp-a(-a可被视为all,即所有的意思),但它也能够接受比较传统的-g选项。

(2)arp -a ip

若是有多个网卡,那么使用arp-a加上接口的IP地址,就能够只显示与该接口相关的ARP缓存项目。

(3)arp -s ip mac地址

能够向ARP缓存中人工输入一个静态项目。该项目在计算机引导过程当中将保持有效状态,或者在出现错误时,人工配置的物理地址将自动更新该项目。

(4)arp -d ip

使用该命令可以人工删除一个静态项目。

七、ARP在生产环境产生的问题和解决办法
(1)ARP病毒和ARP欺骗
(2)高可用服务器对切换时要考虑ARP缓存的问题
(3)路由器等设备无缝迁移时要考虑ARP缓存的问题

2、LVS基础概念

一、集群
(1)定义

一组计算机依靠网络协同工做就是集群

(2)做用(性能,可用性,伸缩性,扩展性,安全)

a、高性能(performance)评价一个网站好坏的直接感触

b、价格有效性,小型机(IBM)特贵

c、高可用性:7*24运行availability

d、可伸缩性:可动态添加新机器scalability数据库的伸缩很困难

(3)优点

a、透明性(Transparency)

如何高效地使得由多个独立计算机组成的松藕合的集群系统构成一个虚拟服务器;客户端应用程序与集群系统交互时,就像与一台高性能、高可用的服务器交互同样,客户端无须做任何修改。部分服务器的切入和切出不会中断服务,这对用户也是透明的。

b、性能(Performance)

性能要接近线性加速,这须要设计很好的软硬件的体系结构,消除系统可能存在的瓶颈。将负载较均衡地调度到各台服务器上。

c、高可用性(Availability)

须要设计和实现很好的系统资源和故障的监测和处理系统。当发现一个模块失败时,要这模块上提供的服务迁移到其余模块上。在理想情况下,这种迁移是即时的、自动的。

d、可管理性(Manageability)

要使集群系统变得易管理,就像管理一个单一映像系统同样。在理想情况下,软硬件模块的插入能作到即插即用(Plug&Play)。

e、可编程性(Programmability)

在集群系统上,容易开发应用程序。

(4)分类

a、LB:负载均衡集群

b、HA:高可用性集群

c、高性能计算

d、网格计算

(5)负载均衡的做用

a、分担请求和数据流量,从而增长吞吐量,并发量

b、保证集群的7*24小时服务

c、用于web服务器,数据库的从库

(6)集群软件

a、典型负载均衡软件:lvs、F5(4osi) 、nginx(7osi) 、haproxy(4+7osi)

b、典型的高可用软件:keepalived、heratbeat

c、互联网商业集群硬件:F五、netscaler、redware、A10

(7)LVS集群的特色

a、功能

有实现3种IP负载均衡技术和10种链接调度算法的IPVS软件。在IPVS内部实现上,采用了高效的Hash函数和垃圾回收机制,能正确处理所调度报文相 关的ICMP消息(有些商品化的系统反而不能)。虚拟服务的设置数目没有限制,每一个虚拟服务有本身的服务器集。它支持持久的虚拟服务(如HTTP Cookie和HTTPS等须要该功能的支持),并提供详尽的统计数据,如链接的处理速率和报文的流量等。针对大规模拒绝服务(Deny of Service)攻击,实现了三种防卫策略。有基于内容请求分发的应用层交换软件KTCPVS,它也是在Linux内核中实现。有相关的集群管理软件对资源进行监测,能及时将故障屏蔽,实现系统的高可用性。主、从调度器能周期性地进行状态同步,从而实现更高的可用性。

b、适用性

后端服务器可运行任何支持TCP/IP的操做系统,包括Linux,各类Unix(如FreeBSD、SunSolaris、HP Unix等),Mac/OS和Windows NT/2000等。负载调度器可以支持绝大多数的TCP和UDP协议:TCP包含HTTP,FTP,PROXY,SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等,UDP包含DNS,NTP,ICP,视频、音频流播放协议等无需对客户机和服务器做任何修改,可适用大多数Internet服务。

c、性能

LVS服务器集群系统具备良好的伸缩性,可支持几百万个并发链接。配置100M网卡,采用VS/TUN或VS/DR调度技术,集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。

d、可靠性

LVS服务器集群软件已经在不少大型的、关键性的站点获得很好的应用,因此它的可靠性在真实应用获得很好的证明。有不少调度器运行一年多,未做一次重启动。

二、LVS负载均衡软件
(1)简介

LVS是Linux虚拟服务器(LinuxVirtualServers),使用负载均衡技术将多台服务器组成一个虚拟服务器。它为适应快速增加的网络访问需求提供了一个负载能力易于扩展,而价格低廉的解决方案。LVS实际上是一种集群(Cluster)技术,采用IP负载均衡技术(LVS的IP负载均衡技术是经过IPVS模块来实现的,linux内核2.6版本以上是默认安装IPVS的)和基于内容请求分发技术。调度器具备很好的吞吐率,将请求均衡地转移到不一样的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,并且无需修改客户端和服务器端的程序。

 

LVS负载均衡调度技术是在LINUX内核中实现的,所以被称之为LINUX虚拟服务器。咱们使用该软件配置LVS时候,不能直接配置内核中的IPVS,而须要使用IPVS的管理工具ipvsadm进行管理,固然咱们也能够经过keepalived软件直接管理IPVS,并非经过ipvsadm来管理ipvs。

(2)LVS技术点

a、真正实现调度的工具是IPVS,工做在LINUX内核层面。

b、LVS自带的IPVS管理工具是ipvsadm。

c、keepalived实现管理IPVS及负载均衡器的高可用。

d、Redhat工具PiranhaWEB管理实现调度的工具IPVS(不经常使用)

(3)LVS专业术语:

 

a、VIP:虚拟ip地址virturalipaddress用于给客户端计算机提供服务的ip地址

b、RIP:realip,集群下面节点使用的ip地址,物理ip地址

c、DIP:directorip用于链接内外网络的ip,物理网卡上的ip地址,他是负载均衡器上的ip

d、CIP:clientip客户端用户计算机请求集群服务器的ip地址,该地址用做发送给集群的请求的源ip地址

(4)ARP抑制

a、为何要抑制RS服务器上的ARP

为了让RS服务器可以处理目标地址为vip的IP包,首先必需要让RS能接收到这个包,这就需将VIP绑定到RS服务器的lo接口上,让RS服务器可以完成接收包并将结果返回client。不能够将VIP设置在出口网卡上,不然会响应客户端的arprequest,形成client/gatewayarp table紊乱,以致于整个loadbalance都不能正常工做。抑制ARP是为了防止RS和LVS调度服务器上的VIP冲突,由于RS和LVS调度服务器上的VIP是一个IP,抑制RS服务器的ARP响应,可让RS服务器不响应ARP请求,有效解决同一VIP冲突

b、抑制ARP的命令

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

c、抑制ARP命令详解

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce

这两条是能够不用的,由于arp对逻辑接口没有意义。

若是你的RS的外部网络接口是eth0,那么

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

其实真正要执行的是:

echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce

我的建议把上面两条也加到你的脚本里去,由于万一系统里上面两条默认的值不是0,那有多是会出问题。

arp_ignore:定义对目标地址为本地IPARP询问不一样的应答模式

0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求

1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求

2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内

3 - 不回应该网络界面的arp请求,而只对设置的惟一和链接地址作出回应

4-7 - 保留未使用

8 -不回应全部(本地地址)的arp查询

arp_announce- INTEGER对网络接口上,本地IP地址的发出的,ARP回应,做出相应级别的限制:肯定不一样程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址

1 -尽可能避免不在该网络接口子网段的本地地址作出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候颇有用.此时会检查来访IP是否为全部接口上的子网段内ip之一.若是改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.

2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通讯的本地地址.首要是选择全部的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 若是没有合适的地址被发现,将选择当前的发送网络接口或其余的有可能接受到该ARP回应的网络接口来进行发送. 限制了使用本地的vip地址做为优先的网络接口

三、LVS的工做模式
(1)NAT模型

a、原理图

①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。

②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改成了后端服务器的RIP地址并将报文根据算法发送出去。

③.报文送到RealServer后,因为报文的目标地址是本身,因此会响应该请求,并将响应报文返还给LVS。

④.而后lvs将此报文的源地址修改成本机并发送给客户端。

注意:在NAT模式中,RealServer的网关必须指向LVS,不然报文没法送达客户端。

b、IP包调度过程图

c、小结

(i)NAT技术将请求的报文和响应的报文都须要经过LB进行地址改写,所以网站访问量比较大的时候LB负载均衡调度器有比较大的瓶颈,通常要求最多之能10-20台节点

(ii)须要在LB上配置一个公网IP地址就能够了。

(iii)每台内部的realserver服务器的网关地址必须是调度器LB的内网地址。

(v)NAT模式支持对IP地址和端口进行转换。即用户请求的端口和真实服务器的端口能够不一致。

d、优缺点

(i)优势

集群中的物理服务器可使用任何支持TCP/IP操做系统,只有负载均衡器须要一个合法的IP地址。

(ii)缺点

扩展性有限。当服务器节点(普通PC服务器)增加过多时,负载均衡器将成为整个系统的瓶颈,由于全部的请求包和应答包的流向都通过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!

(2)DR模型

a、原理图

.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP

.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改成本身DIPMAC地址,目标MAC改成了RIPMAC地址,并将此包发送给RS

.RS发现请求报文中的目的MAC是本身,就会将次报文接收下来,处理完请求报文后,将响应报文经过lo接口送给eth0网卡直接发送给客户端。

注意:须要设置lo接口的VIP不能响应本地网络内的arp请求(也叫ARP抑制)。

b、IP包调度过程图

c、小结

(i)经过在调度器LB上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。

(ii)请求的报文通过调度器,而RS响应处理后的报文无需通过调度器LB,所以并发访问量大时使用效率很高(和NAT模式比)

(iii)由于DR模式是经过MAC地址改写机制实现转发,所以全部RS节点和调度器LB只能在一个局域网里面

(v)RS主机须要绑定VIP地址在LO接口(掩码32位)上,而且须要配置ARP抑制。

(vi)RS节点的默认网关不须要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就能够。

(vii)因为DR模式的调度器仅作MAC地址的改写,因此调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。

(viii)直接对外的业务好比WEB等,RS的IP最好是使用公网IP。对外的服务,好比数据库等最好使用内网IP。

d、优缺点

(i)优势

TUN(隧道模式)同样,负载均衡器也只是分发请求,应答包经过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不须要隧道结构,所以可使用大多数操做系统作为物理服务器。

DR模式的效率很高,可是配置稍微复杂一点,所以对于访问量不是特别大的公司能够用haproxy/nginx取代。日1000-2000WPV或者并发请求1万一下均可以考虑用haproxy/nginx

(ii)缺点

全部RS节点和调度器LB只能在一个局域网里面。

(3)TUN模型

a、原理图

.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP

.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改成DIP,目标地址改成RIP,并将此包发送给RS

.RS收到请求报文后,会首先拆开第一层封装,而后发现里面还有一层IP首部的目标地址是本身lo接口上的VIP,因此会处理次请求报文,并将响应报文经过lo接口送给eth0网卡直接发送给客户端。

注意:须要设置lo接口的VIP不能在共网上出现。

b、IP包调度过程图

c、小结

(i)TUNNEL模式必须在全部的realserver机器上面绑定VIP的IP地址

(ii)TUNNEL模式的vip------>realserver的包通讯经过TUNNEL模式,无论是内网和外网都能通讯,因此不须要lvsvip跟realserver在同一个网段内

(iii)TUNNEL模式realserver会把packet直接发给client不会给lvs了

(v)TUNNEL模式走的隧道模式,因此运维起来比较难,因此通常不用。

d、优缺点

(i)优势

负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。因此,减小了负载均衡器的大量数据流动,负载均衡器再也不是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器可以为不少RS进行分发。并且跑在公网上就能进行不一样地域的分发。

(ii)缺点

隧道模式的RS节点须要合法IP,这种方式须要全部的服务器支持”IPTunneling(IPEncapsulation)协议,服务器可能只局限在部分Linux系统上。

(4)FULLNAT模型FullNetworkAddressTranslation

a、原理图

不管是DR仍是NAT模式,不可避免的都有一个问题:LVSRS必须在同一个VLAN下,不然LVS没法做为RS的网关。

这引起的两个问题是:

.同一个VLAN的限制致使运维不方便,跨VLANRS没法接入。

.LVS的水平扩展受到制约。当RS水平扩容时,总有一天其上的单点LVS会成为瓶颈。

Full-NAT由此而生,解决的是LVSRSVLAN的问题,而跨VLAN问题解决后,LVSRS再也不存在VLAN上的从属关系,能够作到多个LVS对应多个RS,解决水平扩容的问题。

Full-NAT相比NAT的主要改进是,在SNAT/DNAT的基础上,加上另外一种转换,转换过程以下:

在包从LVS转到RS的过程当中,源地址从客户端IP被替换成了LVS的内网IP

内网IP之间能够经过多个交换机跨VLAN通讯。

RS处理完接受到的包,返回时,会将这个包返回给LVS的内网IP,这一步也不受限于VLAN

LVS收到包后,在NAT模式修改源地址的基础上,再把RS发来的包中的目标地址从LVS内网IP改成客户端的IP

Full-NAT主要的思想是把网关和其下机器的通讯,改成了普通的网络通讯,从而解决了跨VLAN的问题。采用这种方式,LVSRS的部署在VLAN上将再也不有任何限制,大大提升了运维部署的便利性。

b、IP包调度过程图

c、小结

(i)FULLNAT模式也不须要LBIP和realserverip在同一个网段;fullnat跟nat相比的优势是:保证RS回包必定可以回到LVS;由于源地址就是LVS-->不肯定

(ii)fullnat由于要更新sorceip因此性能正常比nat模式降低10%

(5)四种模式对比总结

性能:DR>TUN>NAT>FULLNAT

因为每一个模式的功能不同,因此具体的选择仍是要根据公司业务的选择,实际环境来决定。

四、LVS调度算法
(1)IPVS调度器实现了以下十种负载调度算法

固定调度算法:rr,wrr,dh,sh

动态调度算法:wlc,lc,lblc,lblcr,SED,NQ.

最经常使用的三种:RR WRR WLC

(2)固定调度算法

a、rr:轮询调度(Round Robin)

将请求依次分配不一样的RS节点,RS服务器均摊请求,这种算法比较简单,可是只适合RS节点相差性能不大的状况

b、wrr:加权轮询调度(Weighted Round Robin)

它将依据不一样RS节点的权值分配任务,权值高的RS将优先得到任务,而且分配的链接数比权值低的RS节点更多。相同权值的RS获得相同数目的链接数

c、dh:目标地址散列(destination hashing)

以目的地址为关键字查找一个静态hash表来获取须要的RS

d、sh:源地址散列(source hashing)

 以源地址为关键字查找一个静态hash表来获取须要的RS

(3)动态调度算法:

a、wlc:加权最小链接数调度(weighted least-connection)

假设各台RS的权值依次为Wi(i=1...n) 。当前的tcp链接数依次为Ti(i=1..n),依次取TI/WI为最小的RS做为下一个分配的RS

b、LC:最少连接(Least Connections)

调度器经过"最少链接"调度算法动态地将网络请求调度到已创建的连接数最少的服务器上。若是集群系统的真实服务器具备相近的系统性能,采用"最小链接"调度算法能够较好地均衡负载。

c、LBLC:基于局部性的最少连接(Locality-Based LeastConnections)

"基于局部性的最少连接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工做负载,则用"最少连接"的原则选出一个可用的服务器,将请求发送到该服务器。

d、LBLCR:带复制的基于局部性最少连接(Locality-Based LeastConnections with Replication)

"带复制的基于局部性最少连接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不一样之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小链接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小链接"原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以下降复制的程度。

e、SED:最短时间望延迟(ShortestExpected Delay)

基于wlc算法,简单算法:(active+1)*256/weight 【(活动的链接数+1)*256/除以权重】

f、NQ:永不排队(never queue)

无需队列(改进的sed),若是有台realserver的链接数=0就直接分配过去,不须要在进行sed运算。

(4)LVS调度算法的生产环境选型

a、通常的网络服务,如http,mail,mysql等经常使用的LVS调度算法为:基本轮询调度RR、加权最小链接调度WLC、加权轮询调度WRR

b、基于局部性的最小链接LBLC和带复制的给予局部性最小链接LBLCR主要适用于web cache和DB cache

c、源地址散列调度SH和目标地址散列调度DH能够结合使用在防火墙集群中,能够保证整个系统的出入口惟一。

d、最短时间望延迟SED和永不排队NQ调度算法主要是处理时间相对较长的网络服务。

实际适用中这些算法的适用范围不少,工做中最好参考内核中的链接调度算法的实现原理,而后根据具体的业务需求合理的选型。

五、LVS软件许可证和官方资料
(1)软件许可证

LVS集群软件是按GPL(GNU Public License)许可证发行的自由软件,这意味着你能够获得软件的源代码,有权对其进行修改,但必须保证你的修改也是以GPL方式发行。

(2)官方资料

LVS项目介绍:http://www.linuxvirtualserver.org/zh/lvs1.html

LVS集群的体系结构http://www.linuxvirtualserver.org/zh/lvs2.html

LVS集群中ip负载均衡技术http://www.linuxvirtualserver.org/zh/lvs3.html

LVS负载调度http://www.linuxvirtualserver.org/zh/lvs4.html

3、LVS实战

一、演示环境

Host

OS

role

remask

192.168.1.168

CentOS6.5_32

LVS调度器(1.26)

VIP:192.168.1.169

192.168.1.158

CentOS6.5_32

RS1

LAMP

192.168.1.218

CentOS6.8_32

RS2

LNMP

二、安装lvs软件
(1)下载相关软件包

ipvsadm-1.26版本适用于ContOS6.x,ipvsadm-1.24版本适用于ContOS5.x

cd /tools

wgethttp://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

(2)查看内核模块是否加载/安装了ip_vs

lsmod | grep ip_vs  #无结果,ip_vs没有安装

(3)加载/安装ip_vs

a、建立内核的软连接

ln -s /usr/src/kernels/2.6.32-431.el6.i686/ /usr/src/linux

ll /usr/src/

drwxr-xr-x. 2 root root 4096 Sep 23 2011 debug

drwxr-xr-x. 3 root root 4096 Jan 1 23:39 kernels

lrwxrwxrwx  1 root root   37 Jun 11 16:07 linux ->/usr/src/kernels/2.6.32-431.el6.i686/

注:若是没有/usr/src/kernels/2.6.32-431.el6.i686/路径,通常是没有安装kernel-devel软件包,能够经过yum install kerner-devel -y安装。

若若是/usr/src/kernels/下有多个版本路径,则以uname -r显示的为准。因此软连接也能够这样:ln -s /usr/src/kernels/`uname-r`/ /usr/src/linux

也可能不用软连接,直接指定内核参数进行编译。

b、安装ipvsadm-1.26(会在make时报错)

cd tools

tar zxf ipvsadm-1.26.tar.gz

cd ipvsadm-1.26

make     #不须要configure

make install

c、make阶段报错处理

(i)报错内容

make[1]: *** [libipvs.o] Error 1

make[1]: Leaving directory `/wddg-data/tools/ipvsadm-1.26/libipvs'

make: *** [libs] Error 2

(ii)解决方法

yum install libnl* popt* -y

(iii)解决过程

yum install libnl* popt* -y

。。。

Running Transaction

  Installing :popt-static-1.13-7.el6.i686      1/6

  Installing :libnl-devel-1.1.4-2.el6.i686     2/6

  Installing :libnl3-3.2.21-8.el6.i686         3/6

  Installing :libnl3-cli-3.2.21-8.el6.i686     4/6

  Installing :libnl3-devel-3.2.21-8.el6.i686   5/6

  Installing :libnl3-doc-3.2.21-8.el6.i686     6/6

Unable to connect to dbus

  Verifying  : libnl-devel-1.1.4-2.el6.i686     1/6

  Verifying  : libnl3-devel-3.2.21-8.el6.i686   2/6

  Verifying  : libnl3-doc-3.2.21-8.el6.i686     3/6

  Verifying  : popt-static-1.13-7.el6.i686      4/6

  Verifying  : libnl3-3.2.21-8.el6.i686         5/6

  Verifying  : libnl3-cli-3.2.21-8.el6.i686     6/6

Installed:

  libnl-devel.i6860:1.1.4-2.el6

  libnl3.i686 0:3.2.21-8.el6

  libnl3-cli.i6860:3.2.21-8.el6

  libnl3-devel.i6860:3.2.21-8.el6

  libnl3-doc.i6860:3.2.21-8.el6

  popt-static.i6860:1.13-7.el6

(v)再次make

(4)再次查看内核模块是否加载了ip_vs

lsmod | grep ip_vs  #仍是无结果,

(5)手动加载ip_vs

a、方法一

modprobe ip_vs

b、方法二(本例使用)

/sbin/ipvsadm

(6)查看内核模块是否加载了ip_vs

lsmod | grep ip_vs

ip_vs                102058  0

libcrc32c            841  1 ip_vs

ipv6                 261089  13 ip_vs

(7)LVS安装小结

a、centos 5.x 安装lvs,使用1.24版本,不要用1.2.6

b、centos6.x  安装1.26版本,而且先安装 yuminstall libnl*  popt* -y

c、安装LVS后,要执行ipvsadm把ip_vs模块加载到内核

三、ipvsadm经常使用参数

ipvsadm --help

ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)

Usage:

  ipvsadm -A|E -t|u|fservice-address [-s scheduler] [-p [timeout]] [-M netmask] [--pepersistence_engine]

  ipvsadm -D -t|u|fservice-address

  ipvsadm -C

  ipvsadm -R

  ipvsadm -S [-n]

  ipvsadm -a|e -t|u|fservice-address -r server-address [options]

  ipvsadm -d -t|u|fservice-address -r server-address

  ipvsadm -L|l [options]

  ipvsadm -Z [-t|u|fservice-address]

  ipvsadm --set tcp tcpfin udp

  ipvsadm --start-daemon state[--mcast-interface interface] [--syncid sid]

  ipvsadm --stop-daemon state

  ipvsadm -h

 

Commands:

Either long or short options are allowed.

  --add-service     -A       add virtual service with options

  --edit-service    -E       edit virtual service with options

  --delete-service  -D       delete virtual service

  --clear             -C       clear the whole table

  --restore          -R       restore rules from stdin

  --save              -S       save rules to stdout

  --add-server       -a       add real server with options

  --edit-server      -e       edit real server with options

  --delete-server    -d       delete real server

  --list              -L|-l    list the table

  --zero               -Z       zero counters in a service or all services

  --set tcp tcpfin udp        set connection timeout values

  --start-daemon              start connection sync daemon

  --stop-daemon               stop connection sync daemon

  --help                -h       display this help message

Options:

  --tcp-service  -t service-address   service-address is host[:port]

  --udp-service -u service-address  service-address is host[:port]

  --fwmark-service  -f fwmark         fwmark is an integer greater than zero

  --ipv6         -6                   fwmark entry uses IPv6

  --scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,

                                     the default scheduler is wlc.

  --pe            engine              alternate persistence engine maybe sip,

                                     not set by default.

  --persistent   -p [timeout]         persistent service

  --netmask      -M netmask           persistent granularity mask

  --real-server  -r server-address    server-address is host (and port)

  --gatewaying   -g                   gatewaying (direct routing)(default)

  --ipip         -i                   ipip encapsulation(tunneling)

  --masquerading -m                   masquerading (NAT)

  --weight       -w weight            capacity of real server

  --u-threshold  -x uthreshold        upper threshold of connections

  --l-threshold -y lthreshold        lowerthreshold of connections

  --mcast-interfaceinterface         multicast interface forconnection sync

  --syncid sid                        syncid for connectionsync (default=255)

  --connection   -c                  output of current IPVSconnections

  --timeout                           output of timeout(tcp tcpfin udp)

  --daemon                            output of daemoninformation

  --stats                             output ofstatistics information

  --rate                              output of rateinformation

  --exact                             expand numbers(display exact values)

  --thresholds                        output of thresholdsinformation

  --persistent-conn                   output of persistentconnection info

  --nosort                            disable sortingoutput of service/server entries

  --sort                              does nothing, forbackwards compatibility

  --ops          -o                   one-packet scheduling

  --numeric      -n                   numeric output of addressesand ports

四、手动配置lvs服务
(1)在lvs调度节点上配置vip

ifconfig eth0:1 192.168.1.169/24 up

ifconfig

eth0      inetaddr:192.168.1.168 Bcast:192.168.1.255 Mask:255.255.255.0

eth0:1    inet addr:192.168.1.169  Bcast:192.168.1.255  Mask:255.255.255.0

lo         inet addr:127.0.0.1  Mask:255.0.0.0

ping 192.168.1.169

来自 192.168.1.169 的回复: 字节=32 时间<1ms TTL=64

(2)在lvs调度节点上配置LVS服务并增长2台节点服务器

#清空lvs配置

ipvsadm -C

#设置链接超进时间  set tcp tcpfin udp

ipvsadm --set 30 5 60

#-A:新增lvs服务,-t:指定服务器和端口192.168.1.169:80,-s:指定算法rr,-p:会话保持20秒

#至关于新增一台虚拟服务器,ip必定使用配置的vip

ipvsadm -A -t 192.168.1.169:80 -s rr -p 20

#在vip上指定实际服务器ip和模式(-g:DR  -i:TUN  -m:NAT)

#-a:在vip上新增实际服务,-t:指定vip:port  -r:指定真实节点ip  -w:权重

ipvsadm -a -t 192.168.1.169:80 -r 192.168.1.158 -g -w 1

ipvsadm -a -t 192.168.1.169:80 -r 192.168.1.218 -g -w 1

#查看配置好的lvs

ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

TCP  192.168.1.169:80 rrpersistent 20

  -> 192.168.1.158:80           Route   1     0          0        

  -> 192.168.1.218:80           Route   1     0          0

(3)在RS节点的lo接口(网卡的回环接口)上配置vip(192.168.1.169,掩码特殊必须为32位)

RS1上:ifconfig lo:1192.168.1.169/32up

RS2上:ifconfig lo:1192.168.1.169/32up

ifconfig

lo:1      Link encap:LocalLoopback 

          inetaddr:192.168.1.169  Mask:0.0.0.0

(4)在RS节点上抑制ARP响应 (RS1和RS2上分别执行)

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 "1" >/proc/sys/net/ipv4/conf/all/arp_announce

(5)测试LVS调度

a、在LVS调度节点上打开监控

watch -n 1 ipvsadm -L -n  #每秒刷新一次

Every 2.0s: ipvsadm -L -n                                                                                                                                                         SunJun 11 22:48:47 2017

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

TCP  192.168.1.169:80 rrpersistent 20

  -> 192.168.1.218:80           Route   1     6          6

  -> 192.168.1.158:80           Route   1     2          0

b、在其它机器上打开http://192.168.1.169(正常访问)

c、也可使用--status参数查看LVS状态

ipvsadm -L -n --stats

五、删除节点和服务
(1)删除节点

ipvsadm -d -t 192.168.1.169:80 -r 192.168.1.218

ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

TCP  192.168.1.169:80 rrpersistent 20

  -> 192.168.1.158:80           Route   1     0          0           

(2)删除服务

ipvsadm -D -t 192.168.1.169:80  #此时还没法经过vip访问到web

ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

六、开发脚本配置LVS(设置为开机启动,确保长期生效)
(1)Server端脚本

vi /scripts/ipvs_server.sh

#!/bin/sh

. /etc/init.d/functions

VIP=192.168.1.169

PORT=80

RIP=(

   192.168.1.218

   192.168.1.158

)

start(){

ifconfig eth0:1 $VIP/24 up

route add -host $VIP dev eth0

ipvsadm -C

ipvsadm --set 30 5 60

ipvsadm -A -t $VIP:$PORT -s rr -p 20

for ((i=0;i<${#RIP[*]};i++))

do

ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]} -g -w 1

done

echo "ipvs is started"

}

stop(){

ipvsadm -C

ifconfig eth0:1  down

route del -host $VIP dev eth0

echo "ipvs is stopped"

}

case "$1" in

    start)

        start

        ;;

    stop)

        stop

        ;;

    restart)

        stop

        start

        ;;

    *)

        echo "UASGE:$0  {start|stop|restart}"

esac

cp /scripts/ipvs_server.sh /usr/local/sbin/ipvs

cd /usr/local/sbin/

chmod +x ipvs

(2)Client端脚本

vi /scripts/ipvs_client.sh

#!/bin/sh

. /etc/init.d/functions

VIP=(

    192.168.1.169

    192.168.1.170

)

 

case "$1" in

    start)

        echo "start LVSof RealServer IP"

        for ((i=0;i<`echo${#VIP[*]}`;i++))

        do

           interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"

            /sbin/ifconfig$interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up

            route add -host${VIP[$i]} dev $interface

        done

        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 "1">/proc/sys/net/ipv4/conf/all/arp_announce

        ;;

    stop)

        for ((i=0;i<`echo${#VIP[*]}`;i++))

        do

           interface="lo:`echo ${VIP[$i]}|awk -F . '{print $4}'`"

            /sbin/ifconfig$interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 down

            route del -host${VIP[$i]} dev $interface

        done

        echo "stOP LVS ofRealServer IP"

        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

        ;;               

    *)

        echo "Usage: $0{start | stop}"

        exit 1

esac

七、ipvsadm生产经常使用命令组合

ipvsadm -Ln --stats

ipvsadm -Lnc

ipvsadm -Ln --thresholds

ipvsadm -Ln --timeout 

4、LVS负载均衡高可用解决方案

一、经常使用解决方案
(1)自已开发上面的脚本解决(不推荐,繁琐、麻烦)

含server、client、健康检查、高可用4类脚本

(2)heartbeart + lvs + ldirectord(不推荐,麻烦、不易控制)

heartbeart:负责VIP的切换以及资源的启动中止

lvs:负责调度

ldirectord:负责RS节点的健康检查

(3)Piranha配置lvs(不推荐,不经常使用)

Piranha是redhat提供的一个基于web的lvs配置软件,可省去手工配置lvs的繁琐工做,并人急提供cluter功能。

(4)keepalived + lvs(推荐,简单、易用、高效)
二、LVS集群分发请求不均衡解决方案
(1)不均衡的缘由

a、LVS会话保持

设置了LVS自身的会话保持参数(lvs:-p 300/keepalived:persistent 300)。

优化:大公司尽可能用cookies替代sesson,或用集中式session

b、LVS调度算法。rr、wrr、wlc、lc算法

c、后端RS节点的会话保持。如apache的keealive参数

d、访问量较少的时候,不均衡比较明显。

e、用户发送的请求时间长短,和请求资源多少大小

(2)LVS排错理论

排错大致的思路就是,要熟悉LVS的工做原理过程,而后根据原理过程来排重,例如:

a、调度器上LVS调度规则及IP的正确性。

b、RS节点上VIP绑定和arp抑制的检查。

生产处理思路:

对RS绑定的VIP作实时监控,出问题报警或者自动处理后报警。

把RS绑定的VIP作成配置文件,例如:vi/etc/sysconfig/network-scripts/lo:0

ARP抑制的配置思路:

若是是单个VIP,就能够用stop传参设置0

当RS端有多个VIP绑定,即便中止了一个VIP也不要修改ARP抑制。

c、RS节点上自身提供服务的检查。

d、辅助排查工具备tepdump,ping等。

e、负载均衡以及反向代理集群的三角形排查理论:

 

5、Keepalived高可用集群

一、简介

Heartbeat、Corosync、Keepalived这三个集群组件咱们到底选哪一个好,首先我想说明的是,Heartbeat、Corosync是属于同一类型,Keepalived与Heartbeat、Corosync,根本不是同一类型的。Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router RedundancyProtocol,简称VRRP);Heartbeat或Corosync是基于主机或网络服务的高可用方式;简单的说就是,Keepalived的目的是模拟路由器的高可用,Heartbeat或Corosync的目的是实现Service的高可用。因此通常Keepalived是实现前端高可用,经常使用的前端高可用的组合有,就是咱们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。而Heartbeat或Corosync是实现服务的高可用,常见的组合有Heartbeat v3(Corosync)+Pacemaker+NFS+Httpd 实现Web服务器的高可用、Heartbeat v3(Corosync)+Pacemaker+NFS+MySQL 实现MySQL服务器的高可用。总结一下,Keepalived中实现轻量级的高可用,通常用于前端高可用,且不须要共享存储,通常经常使用于两个节点的高可用。而Heartbeat(或Corosync)通常用于服务的高可用,且须要共享存储,通常用于多节点的高可用。那heartbaet与corosync咱们又应该选择哪一个好啊,通常用corosync,由于corosync的运行机制更优于heartbeat,就连从heartbeat分离出来的pacemaker都说在之后的开发当中更倾向于corosync,因此如今corosync+pacemaker是最佳组合。

Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,能够利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),可是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。Keepalived是VRRP的完美实现,所以在介绍keepalived以前,先介绍一下VRRP的原理。

2.VRRP 协议
(1)简介

在现实的网络环境中,两台须要通讯的主机大多数状况下并无直接的物理链接。对于这样的状况,它们之间路由怎样选择?主机如何选定到达目的主机的下一跳路由,这个问题一般的解决方法有二种:

在主机上使用动态路由协议(RIP、OSPF等)

在主机上配置静态路由

很明显,在主机上配置动态路由是很是不切实际的,由于管理、维护成本以及是否支持等诸多问题。配置静态路由就变得十分流行,但路由器(或者说默认网关default gateway)却常常成为单点故障。VRRP的目的就是为了解决静态路由单点故障问题,VRRP经过一竞选(election)协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。

(2)工做机制

在一个VRRP虚拟路由器中,有多台物理的VRRP路由器,可是这多台的物理的机器并不能同时工做,而是由一台称为MASTER的负责路由工做,其它的都是BACKUP,MASTER并不是一成不变,VRRP让每一个VRRP路由器参与竞选,最终获胜的就是MASTER。MASTER拥有一些特权,好比,拥有虚拟路由器的IP地址,咱们的主机就是用这个IP地址做为静态路由的。拥有特权的MASTER要负责转发发送给网关地址的包和响应ARP请求。

VRRP经过竞选协议来实现虚拟路由器的功能,全部的协议报文都是经过IP多播(multicast)包(多播地址224.0.0.18)形式发送的。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址。因此,在一个虚拟路由 器中,无论谁是MASTER,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不须要由于MASTER的改变而修改本身的路由配置,对客户端来讲,这种主从的切换是透明的。

在一个虚拟路由器中,只有做为MASTER的VRRP路由器会一直发送VRRP通告信息(VRRPAdvertisement message),BACKUP不会抢占MASTER,除非它的优先级(priority)更高。当MASTER不可用时(BACKUP收不到通告信息), 多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占是很是快速的(<1s),以保证服务的连续性。因为安全性考虑,VRRP包使用了加密协议进行加密。

(3)工做流程

a、初始化

路由器启动时,若是路由器的优先级是255(最高优先级,路由器拥有路由器地址),要发送VRRP通告信息,并发送广播ARP信息通告路由器IP地址对应的MAC地址为路由虚拟MAC,设置通告信息定时器准备定时发送VRRP通告信息,转为MASTER状态;不然进入BACKUP状态,设置定时器检查定时检查是否收到MASTER的通告信息。

b、Master

设置定时通告定时器;

用VRRP虚拟MAC地址响应路由器IP地址的ARP请求;

转发目的MAC是VRRP虚拟MAC的数据包;

若是是虚拟路由器IP的拥有者,将接受目的地址是虚拟路由器IP的数据包,不然丢弃;

当收到shutdown的事件时删除定时通告定时器,发送优先权级为0的通告包,转初始化状态;

若是定时通告定时器超时时,发送VRRP通告信息;

收到VRRP通告信息时,若是优先权为0,发送VRRP通告信息;不然判断数据的优先级是否高于本机,或相等并且实际IP地址大于本地实际IP,设置定时通告定时器,复位主机超时定时器,转BACKUP状态;不然的话,丢弃该通告包;

c、Backup

设置主机超时定时器;

不能响应针对虚拟路由器IP的ARP请求信息;

丢弃全部目的MAC地址是虚拟路由器MAC地址的数据包;

不接受目的是虚拟路由器IP的全部数据包;

当收到shutdown的事件时删除主机超时定时器,转初始化状态;

主机超时定时器超时的时候,发送VRRP通告信息,广播ARP地址信息,转MASTER状态;

收到VRRP通告信息时,若是优先权为0,表示进入MASTER选举;不然判断数据的优先级是否高于本机,若是高的话认可MASTER有效,复位主机超时定时器;不然的话,丢弃该通告包;

(4)ARP查询处理

当内部主机经过ARP查询虚拟路由器IP地址对应的MAC地址时,MASTER路由器回复的MAC地址为虚拟的VRRP的MAC地址,而不是实际网卡的 MAC地址,这样在路由器切换时让内网机器觉察不到;而在路由器从新启动时,不能主动发送本机网卡的实际MAC地址。若是虚拟路由器开启的ARP代理 (proxy_arp)功能,代理的ARP回应也回应VRRP虚拟MAC地址;

3.KeepAlived安装
(1)下载

cd /tools

wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz

(2)安装

a、检查kernel环境是否配置

ls -l /usr/src/

drwxr-xr-x. 2 root root 4096 Sep 23 2011 debug

drwxr-xr-x. 3 root root 4096 Jan 1 23:39 kernels

lrwxrwxrwx  1 root root   37 Jun 11 16:07 linux ->/usr/src/kernels/2.6.32-431.el6.i686/

b、安装

tar zxf keepalived-1.1.19.tar.gz

cd keepalived-1.1.19

./configure

。。。

Keepalived configuration

------------------------

Keepalived version       :1.1.19

Compiler                 : gcc

Compiler flags           : -g-O2

Extra Lib                :-lpopt -lssl -lcrypto

Use IPVSFramework       : Yes

IPVSsync daemon support : Yes

Use VRRPFramework       : Yes

Use Debug flags          : No

make

make install

c、说明

也可能不提早配置kernel,能够在./configure时指定--with-kernel-dir参数。如:

./configure --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.i686/

d、配置

/bin/cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/

/bin/cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

mkdir /etc/keepalived -p

/bin/cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

/bin/cp /usr/local/sbin/keepalived /usr/sbin/

e、测试

/etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

ps -ef | grep keep   #3keepalived-D表示成功

root      2994     1  019:31 ?        00:00:00 keepalived -D

root      2996  2994  219:31 ?        00:00:00 keepalived -D

root      3108  2994  019:31 ?        00:00:00 keepalived -D

root      3111  1222  019:31 pts/0    00:00:00 grep keep

/etc/init.d/keepalived stop

Stopping keepalived:                                       [  OK  ]

(3)keepalived.conf控制文件说明

a、master节点配置

! Configuration File for keepalived

# 全局定义部分

global_defs {

   notification_email {

     huang@gmail.com          #设置报警邮件地址,每行一个,需开启本机sendmail服务

   }

   notification_email_fromAlexandre.Cassen@firewall.loc  #设置邮件发送地址

   smtp_server192.168.1.3  #设置smtp server 地址

   smtp_connect_timeout30    #设置链接 smtp server超时时间

   router_id LVS_7        #Keepalived服务器的ID,至关于mysql的server_id,邮件主题中显示

}

# vrrp实例定义部分

vrrp_instance VI_1 {

    state MASTER          #指定keepalived的角色,MASTER表示是主服务,BACKUP表示是备用服务器

    interface eth0            #指定HA监测网络的接口

    virtual_router_id 55    #虚拟路由IDe,同一个vrrp实例使用一个惟一,MASTER和BACKUP一致

    priority 150              #优先级,数字越大优先级越高,MASTER必须大于BACKUP,建议相差50

    advert_int 1              #MASTER和BACKUP同步检查间隔,秒

    authentication {          #设定验证类型和密码

        auth_type PASS        #验证类型,PASS和HA

        auth_pass 1111        #验证密码,MASTER和BACKUP密码相同才能进行通讯,官方建议明文

    }

    virtual_ipaddress {       #虚拟ip地址

        192.168.1.16/24        #最好加上掩码,不然容易出错,指定为32位了

    }

}

b、backup节点配置

! Configuration File for keepalived

# 全局定义部分

global_defs {

   notification_email {

     huang@gmail.com

   }

   notification_email_fromAlexandre.Cassen@firewall.loc

   smtp_server 192.168.1.3

   smtp_connect_timeout 30

   router_id LVS_2

}

# vrrp实例定义部分

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 55

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.16/24

    }

}

4.KeepAlived单实例实战
(1)演示环境

Host

OS

role

remask

192.168.1.168

CentOS6.5_32

Master

VIP:192.168.1.169

192.168.1.158

CentOS6.5_32

Backup

VIP:192.168.1.169

(2)安装KeepAlived和LVS

a、Master节点

(i)安装KeepAlived

ln -s /usr/src/kernels/2.6.32-431.el6.i686/ /usr/src/linux

tar zxf keepalived-1.1.19.tar.gz

cd keepalived-1.1.19

./configure

make

make install

/bin/cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/

/bin/cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

mkdir /etc/keepalived -p

/bin/cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

/bin/cp /usr/local/sbin/keepalived /usr/sbin/

/etc/init.d/keepalived start

ps -ef | grep keep

/etc/init.d/keepalived stop

(ii)安装LVS

lsmod | grep ip_vs  #检查环境

tar zxf ipvsadm-1.26.tar.gz

cd ipvsadm-1.26

make     #不须要configure

make install

(iii)清空原配置的vip(vip应由keepalived自动配置)

ifconfig eth0:0 down

(v)配置keepalived配置文件

cd /etc/keepalived/

mv keepalived.conf keepalived.conf.bak  #备份系统默认的配置文件

mv /tools/keepalived.conf.master-single  keepalived.conf

cat keepalived.conf

! Configuration File for keepalived

 

global_defs {

   router_id LVS_7

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

    }

}

b、Backup节点

(i)安装KeepAlived

(ii)安装LVS

(iii)清空原配置的vip(vip应由keepalived自动配置)

(v)配置keepalived配置文件

cd /etc/keepalived/

mv keepalived.conf keepalived.conf.bak  #备份系统默认的配置文件

mv /tools/keepalived.conf.backup-single  keepalived.conf

cat keepalived.conf

! Configuration File for keepalived

 

global_defs {

   router_id LVS_2

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

    }

}

(3)测试

a、中止Master和Backup上的FireWall和SELinux

/etc/init.d/iptables stop

setenforce 0

b、启动Master和Backup上的keepalived

/etc/init.d/keepalived start

c、查看Master和Backup上的vip

(i)Master节点

ifconfig    #看不到eth0:0keepalived启的vip,用ifconfig是看不到的,要用ip add来看

eth0      inetaddr:192.168.1.168 Bcast:192.168.1.255 Mask:255.255.255.0

ip add

eth0      inetaddr:192.168.1.168 Bcast:192.168.1.255 Mask:255.255.255.0

inet addr:192.168.1.169/24 scopeglobal secondary eth0

(ii)Backup节点(此时是没有vip的,若是有,则是裂脑了)

ifconfig

eth0      inetaddr:192.168.1.158 Bcast:192.168.1.255 Mask:255.255.255.0

ip add

eth0      inetaddr:192.168.1.158 Bcast:192.168.1.255 Mask:255.255.255.0

d、测试主备切换

(i)中止Master上的keepalived

/etc/init.d/keepalived stop

(ii)查看Master上的vip

ip add | grep 1.169

       #<--为空,说明vipdown

(iii)查看Backup上的vip

ip add | grep 1.169

inet addr:192.168.1.169/24 scope global secondary eth0  #说明Backup节点已接管vip

e、测试主备切换延时时间

(i)长ping vip

ping 192.168.1.169 -t

(ii)启动Master上的keepalived

/etc/init.d/keepalived start

(iii)vip从Backup切换到了Master上

(v)发现ping命令丢了一个包

5.KeepAlived多实例实战

多实例与单实例的区别主要是keepalived.conf配置文件中有多个vrrp_instance。

(1)Master节点的keepalived.conf

cat /etc/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

   abc8@qq.com

   }

   notification_email_fromAlexandre.Cassen@firewall.loc

   smtp_server 192.168.1.168

   smtp_connect_timeout 30

   router_id LVS_1

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

        192.168.1.170/24

        192.168.1.171/24

    }

}

 

vrrp_instance VI_2 {

    state BACKUP

    interface eth0

    virtual_router_id 52

    priority 50

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.174/24

        192.168.1.175/24

    }

}

(2)Backup节点的keepalived.conf

cat /etc/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

   abc@qq.com

   }

   notification_email_fromAlexandre.Cassen@firewall.loc

   smtp_server 192.168.1.168

   smtp_connect_timeout 30

   router_id LVS_2

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

        192.168.1.170/24

        192.168.1.171/24

    }

}

 

vrrp_instance VI_2 {

    state MASTER

    interface eth0

    virtual_router_id 52

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.174/24

        192.168.1.175/24

    }

}

6.指定KeepAlived输出日志

默认状况下,KeepAlived的日志会输出到/var/log/messages文件中,若是想让keepAlived的日志输出到指定文件,则需修改2个配置文件:/etc/sysconfig/keepalived和/etc/rsyslog.conf后重启rsyslog和 keepalived服务。

vi /etc/sysconfig/keepalived

#修改前

KEEPALIVED_OPTIONS="-D"

#修改后

#KEEPALIVED_OPTIONS="-D"

KEEPALIVED_OPTIONS="-D-d -S 0"

vi /etc/syslog.conf

#keepalived

local0.*      /var/log/keepalived.log     #新增长一行

/etc/in.d/rsyslog restart

/etc/init.d/keepalived restart

6、Keepalived管理LVS实战

一、演示环境

Host

OS

role

remask

192.168.1.168

CentOS6.5_32

KeepAlived Master

VIP:192.168.1.169

192.168.1.158

CentOS6.5_32

KeepAlived Backup

VIP:192.168.1.169

192.168.1.218

CentOS6.5_32

LNMP

RS1

192.168.1.228

CentOS6.5_32

LNMP

RS2

二、在Master和Backup节点上安装KeepAlivd和LVS
三、在Mastet节点上配置KeepAlived管理LVS

cat keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

   abc8@qq.com

   }

   notification_email_fromAlexandre.Cassen@firewall.loc

   smtp_server 192.168.1.168

   smtp_connect_timeout 30

   router_id LVS_1

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

    }

}

 

virtual_server 192.168.1.169 80 { 

    delay_loop 6                 #每隔多少秒keepalived监测rs的状态 

    lb_algo wrr                  #设置分发的算法 

lb_kind DR                    #设置分发的模式,这里使用DR模式演示 

nat_mask 255.255.255.0     #掩码

    persistence_timeout20     #会话保持

    protocol TCP 

#上面这一段至关于ipvsadm -A-t 192.168.1.169:80 -s wrr -p 20

 

real_server 192.168.1.21880 {    #第一台rs服务器的配置,注意IP和端口 

        weight 100            #权重 

        TCP_CHECK {           #健康检查

        connect_timeout10    #10秒无响应超时 

        nb_get_retry 3 

        delay_before_retry3 

        connect_port 80 

        } 

     } 

real_server 192.168.1.22880 {    #第二台rs服务器 

        weight 100 

        TCP_CHECK { 

        connect_timeout10 

        nb_get_retry 3 

        delay_before_retry3 

        connect_port 80 

        } 

#上面这2段真实服务器配置至关于下面2行

#ipvsadm -a -t 192.168.1.169:80 -r 192.168.1.218:80 -g -w 1

#ipvsadm -a -t 192.168.1.169:80 -r 192.168.1.228:80 -g -w 1

}

四、在Backup节点上配置KeepAlived管理LVS

cat keepalived.conf

! Configuration File for keepalived

 

global_defs {

   router_id LVS_2

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

    }

}

 

virtual_server 192.168.1.169 80 { 

    delay_loop 6

    lb_algo wrr

lb_kind DR

nat_mask 255.255.255.0

    persistence_timeout 20

protocol TCP 

 

real_server 192.168.1.21880 {

        weight 100

        TCP_CHECK {

        connect_timeout 10

        nb_get_retry 3 

        delay_before_retry3 

        connect_port 80 

        } 

     } 

real_server 192.168.1.22880 {

        weight 100 

        TCP_CHECK { 

        connect_timeout10 

        nb_get_retry 3 

        delay_before_retry3 

        connect_port 80 

        } 

}

五、在Master和Backup节点重启KeepAlivd

/etc/init.d/keepalived restart

六、查看Master节点状态(需等几秒)

ip add

eth0      inetaddr:192.168.1.168 Bcast:192.168.1.255 Mask:255.255.255.0

inet addr:192.168.1.169/24 scopeglobal secondary eth0

ipvs -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

TCP  192.168.1.169:80 rrpersistent 20

  -> 192.168.1.218:80           Route   1     0          0

  -> 192.168.1.228:80           Route   1     0          0

七、测试主备切换
(1)中止Master上的keepalived

/etc/init.d/keepalived stop

(2)查看Master上的vip

ip add | grep 1.169

ipvs -L -n

       #<--均为空,说明viplvs均已down

(3)查看Backup上的vip

ip add | grep 1.169

inet addr:192.168.1.169/24 scope global secondary eth0  #说明Backup节点已接管vip

ipvs -L -n   #实际上在keepalived.conf配置好之后,自动启起来了,只不过没有vip,不对外提供服务

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn

TCP  192.168.1.169:80 rrpersistent 20

  -> 192.168.1.218:80           Route   1     0          0

  -> 192.168.1.228:80           Route   1     0          0

八、在RS节点上抑制ARP响应(RS1和RS2上分别执行)

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 "1" >/proc/sys/net/ipv4/conf/all/arp_announce

7、Keepalived管理Nginx反向代理实战

一、演示环境

Host

OS

role

remask

192.168.1.168

CentOS6.5_32

KeepAlived Master + Nginx

VIP:192.168.1.169

192.168.1.158

CentOS6.5_32

KeepAlived Backup + Nginx

VIP:192.168.1.169

192.168.1.218

CentOS6.5_32

LNMP

RS1

192.168.1.228

CentOS6.5_32

LNMP

RS2

二、在Master和Backup节点上安装KeepAlivd和Nginx
三、在Master节点上配置keepalived.conf

cd /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   router_id LVS_7

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 150

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

    }

}

四、在Backup节点上配置keepalived.conf

cd /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   router_id LVS_2

}

 

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 55

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.1.169/24

    }

}

五、在Master和Backup上重启keepalived

/etc/init.d/keepalived restart

ip add | grep 1.169

六、检查RS节点

curl 192.168.1.218

http://www.abc.org218

curl 192.168.1.228

http://bbs.abc.org228

七、配置Nginx负载均衡
(1)配置Master和Backup节点的负载均衡配置文件upstream01.conf

cd /application/nginx/conf/extra

vi upstream01.conf

upstream www_real_servers {

server 192.168.1.218:80 weight=5;

    server 192.168.1.228:80weight=5;

}

server {

listen 80;

server_name  192.168.1.169

location / {

   proxy_pass http://www_real_servers

}

}

(2)将负载均衡配置文件upstream01.conf加入nginx.conf

vi /application/nginx/conf/nginx.conf

#include extra/www.conf;

#include extra/bbs.conf;

#include extra/blog.conf;

include extra/upstream01.conf;

八、启动nginx和keepalived(Master和Backup节点)

/application/nginx/sbin/nginx

/etc/init.d/keepalived start

九、测试1:负载均衡测试

在IE页面访问http://192.168.1.169,并刷新

http://www.abc.org218

http://bbs.abc.org228

十、测试2:故障测试
(1)中止192.168.1.228

pkill -9 nginx

(2)在IE页面访问http://192.168.1.169,并刷新

http://www.abc.org218

http://www.abc.org218

(3)接着中止192.168.1.218

pkill -9 nginx

(4)在IE页面访问http://192.168.1.169

报502错误:502 Bad Gateway

十一、生产场景选用方案
(1)大并发,且简单的4层转发用LVS
(2)大并发,且功能要求复杂,URI转发用LVS + Nginx
(3)并发不大,用Nginx/HAProxy

通常大公司,会根据业务进行选择,3个场景都会用到

相关文章
相关标签/搜索