Linux运维学习笔记之二十九:LVS集群和Keepalived高可用实战

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

一、ARP协议

1、概念

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

2、功能

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

3、工作过程

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

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

当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:

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

第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缓存中。

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

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

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

4、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攻击

5、ARP欺骗原理

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

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

如何防止:

arp -s 192.168.0.11 mac

6、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

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

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

二、LVS基础概念

1、集群
(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、互联网商业集群硬件:F5、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服务器集群软件已经在很多大型的、关键性的站点得到很好的应用,所以它的可靠性在真实应用得到很好的证实。有很多调度器运行一年多,未作一次重启动。

2、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地址作为优先的网络接口

3、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

由于每个模式的功能不一样,所以具体的选择还是要根据公司业务的选择,实际环境来决定。

4、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调度算法主要是处理时间相对较长的网络服务。

实际适用中这些算法的适用范围很多,工作中最好参考内核中的连接调度算法的实现原理,然后根据具体的业务需求合理的选型。

5、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

三、LVS实战

1、演示环境

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

2、安装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模块加载到内核

3、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

4、手动配置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

5、删除节点和服务
(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

6、开发脚本配置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

7、ipvsadm生产常用命令组合

ipvsadm -Ln --stats

ipvsadm -Lnc

ipvsadm -Ln --thresholds

ipvsadm -Ln --timeout 

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

1、常用解决方案
(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(推荐,简单、易用、高效)
2、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、负载均衡以及反向代理集群的三角形排查理论:

五、Keepalived高可用集群

1、简介

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 {

     [email protected]          #设置报警邮件地址,每行一个,需开启本机sendmail服务

   }

   [email protected]  #设置邮件发送地址

   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 {

     [email protected]

   }

   [email protected]

   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 {

   [email protected]

   }

   [email protected]

   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 {

   [email protected]

   }

   [email protected]

   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

六、Keepalived管理LVS实战

1、演示环境

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

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

cat keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

   [email protected]

   }

   [email protected]

   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

}

4、在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 

        } 

}

5、在Master和Backup节点重启KeepAlivd

/etc/init.d/keepalived restart

6、查看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

7、测试主备切换
(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

8、在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

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

1、演示环境

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

2、在Master和Backup节点上安装KeepAlivd和Nginx
3、在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

    }

}

4、在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

    }

}

5、在Master和Backup上重启keepalived

/etc/init.d/keepalived restart

ip add | grep 1.169

6、检查RS节点

curl 192.168.1.218

http://www.abc.org218

curl 192.168.1.228

http://bbs.abc.org228

7、配置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;

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

/application/nginx/sbin/nginx

/etc/init.d/keepalived start

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

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

http://www.abc.org218

http://bbs.abc.org228

10、测试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

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

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

你可能感兴趣的:(Linux)