一、ARP技术概念介绍
为什么讲ARP技术,因为平常工作中有接触。还有就是LVS的dr模式是用到arp的技术和数据。
1、什么是ARP协议
ARP协议全程地址解析协议(AddressResolution Protocol,ARP)是在仅知道主机的IP地址时确定其物理地址的一种协议。因IPv4和以太网的广泛应用,其主要作用是通过已知IP地址,获取对应物理地址的一种协议。
2、什么是ARP代理(ARP proxy)
在网络中代理是非常常见的,所谓的代理就是我朝一个人要,另外一个人给。生活中一个比较实际的例子就是,房屋中介。
Arp协议要求通信的主机的双方必须是在物理的同一个网段。那如果发送主机和目标主机不是在同一个局域网里,而ARP广播包是不能够跨越网段进行传输的。所以此时就需要一个路由或ARP中继技术来转发ARP请求包。客户端获取到的MAC地址是路由器或者中继的MAC地址。那么之后这个客户端发给目的端的数据,都会先发给这个路由器或ARP中继,再进而转给目的端,这种情况就称为ARP代理。
3、arp协议工作原理
原理图:
当主机10.0.0.1要发送数据给10.0.0.2数据,会首先去查本地的arp缓存表,如果有此IP地址和此主机对应的MAC地址,如果有就可以直接传输数据。如果没有就主机10.0.0.1就会向局域网去广播,询问谁的IP地址是10.0.0.2.此时在本局域网中的所有主机都能够收到此广播包,但只有主机10.0.0.2才会回应这个广播包。会以单播的形式直接回复10.0.0.2说我的MAC地址为多少。此时10.0.0.1收到了此信息,那么两者之间就能够通过MAC地址进行通信了。并且将这个ARP和IP对应信息缓存到ARP缓存表里。
ARP欺骗工作原理:
ARP欺骗就是通过伪造IP地址和MAC地址对实现ARP欺骗的,它能够在网络中产生大量的ARP包,来让网络堵塞。攻击主机只要持续的发送假的ARP包,让网络中的主机缓存错误的IP-MAC对应信心,造成网络中断或中间人攻击。
ARP攻击主要是在局域网中的,因为ARP包是不会垮网络传播的。所以划分VLAN能够减少当受到ARP攻击后,网络受影响的范围。
ARP欺骗过程图及讲解:
ARP欺骗防御办法
1)进行MAC和IP地址进行绑定
2)杀毒软件开启arp防火墙
ARP病毒排查
1)使用arp –a命令查看本地arp缓存表,查看重复MAC地址或在交换机路由器上查看重复MAC地址。
2)使用ARP防御软件或检测软件(如:科莱,彩影arp防火墙分析流量,查找可以攻击源)
3)使用折半法排除网络出错范围。(如先断开一般的网络查看是否正常,如果正常就说明断开的那部分有问题。然后再接上剩下的那一半继续查看,依次类推最终找到问题点)
当然排查、预防ARP攻击的方法有很多,大家可以自己寻找。
------------------------------自我后续小结--------------------------------------
ARP协议的功能就是能够通过IP地址解析到MAC地址。而ARP欺骗的手段就是通过伪造IP-MAC信息,让网络上的主机受骗。误以为攻击主机就是他们要发送的目标主机(路由器)这样就将信息都发给了攻击者,攻击者就能获取网络其他主机的数据包。而且网络上的主机会出现网络中断等现象。如果攻击者在网络上大量的发送ARP信息,也会造成网络的堵塞。
---------------------------------------------------------------------------------
一、集群简介
什么是集群
计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多。
集群就是一组独立的计算机,通过网络连接组合成一个组合来共同完一个任务
LVS在企业架构中的位置:
以上的架构只是众多企业里面的一种而已。绿色的线就是用户访问请求的数据流向。用户-->LVS负载均衡服务器--->apahce服务器--->mysql服务器&memcache服务器&共享存储服务器。并且我们的mysql、共享存储也能够使用LVS再进行负载均衡。
---------------小结-------------------------
集群:就是一组相互独立的计算机,通过高速的网络组成一个计算机系统,每个集群节点都是运行其自己进程的一个独立服务器。对网络用户来讲,网站后端就是一个单一的系统,协同起来向用户提供系统资源,系统服务。
-------------------------------------------
为什么要使用集群
集群的特点
1)高性能performance。一些需要很强的运算处理能力比如天气预报,核试验等。这就不是几台计算机能够搞定的。这需要上千台一起来完成这个工作的。
2)价格有效性
通常一套系统集群架构,只需要几台或数十台服务器主机即可,与动则上百王的专用超级计算机具有更高的性价比。
3)可伸缩性
当服务器负载压力增长的时候,系统能够扩展来满足需求,且不降低服务质量。
4)高可用性
尽管部分硬件和软件发生故障,整个系统的服务必须是7*24小时运行的。
集群的优势
1)透明性
如果一部分服务器宕机了业务不受影响,一般耦合度没有那么高,依赖关系没有那么高。比如NFS服务器宕机了其他就挂载不了了,这样依赖性太强。
2)高性能
访问量增加,能够轻松扩展。
3)可管理性
整个系统可能在物理上很大,但很容易管理。
4)可编程性
在集群系统上,容易开发应用程序,门户网站会要求这个。
集群分类及不同分类的特点
计算机集群架构按照功能和结构一般分成以下几类:
1)负载均衡集群(Loadbalancingclusters)简称LBC
2)高可用性集群(High-availabilityclusters)简称HAC
3)高性能计算集群(High-perfomanceclusters)简称HPC
4)网格计算(Gridcomputing)
网络上面一般认为是有三个,负载均衡和高可用集群式我们互联网行业常用的集群架构。
(1)负载均衡集群
负载均衡集群为企业提供了更为实用,性价比更高的系统架构解决方案。负载均衡集群把很多客户集中访问的请求负载压力可能尽可能平均的分摊到计算机集群中处理。客户请求负载通常包括应用程度处理负载和网络流量负载。这样的系统非常适合向使用同一组应用程序为大量用户提供服务。每个节点都可以承担一定的访问请求负载压力,并且可以实现访问请求在各节点之间动态分配,以实现负载均衡。
负载均衡运行时,一般通过一个或多个前端负载均衡器将客户访问请求分发到后端一组服务器上,从而达到整个系统的高性能和高可用性。这样计算机集群有时也被称为服务器群。一般高可用性集群和负载均衡集群会使用类似的技术,或同时具有高可用性与负载均衡的特点。
负载均衡集群的作用
1)分担访问流量(负载均衡)
2)保持业务的连续性(高可用)
(2)高可用性集群
一般是指当集群中的任意一个节点失效的情况下,节点上的所有任务自动转移到其他正常的节点上,并且此过程不影响整个集群的运行,不影响业务的提供。
类似是集群中运行着两个或两个以上的一样的节点,当某个主节点出现故障的时候,那么其他作为从 节点的节点就会接替主节点上面的任务。从节点可以接管主节点的资源(IP地址,架构身份等),此时用户不会发现提供服务的对象从主节点转移到从节点。
高可用性集群的作用:当一个机器宕机另一台进行接管。比较常用的高可用集群开源软件有:keepalive,heardbeat。
(3)高性能计算集群
高性能计算集群采用将计算任务分配到集群的不同计算节点儿提高计算能力,因而主要应用在科学计算领域。比较流行的HPC采用Linux操作系统和其它一些免费软件来完成并行运算。这一集群配置通常被称为Beowulf集群。这类集群通常运行特定的程序以发挥HPCcluster的并行能力。这类程序一般应用特定的运行库, 比如专为科学计算设计的MPI库。
HPC集群特别适合于在计算中各计算节点之间发生大量数据通讯的计算作业,比如一个节点的中间结果或影响到其它节点计算结果的情况。
常用集群软硬件
常用开源集群软件有:lvs,keepalived,haproxy,nginx,apache,heartbeat
常用商业集群硬件有:F5,Netscaler,Radware,A10等
二、LVS负载均衡集群介绍
负载均衡集群的作用:提供一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载带宽、增加吞吐量,加强网络数据处理能力、提高网络的灵活性和可用性。
1)把单台计算机无法承受的大规模的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间,提升用户体验。
2)单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。
3)7*24小时的服务保证,任意一个或多个设备节点设备宕机,不能影响到业务。在负载均衡集群中,所有计算机节点都应该提供相同的服务,集群负载均衡获取所有对该服务的如站请求。
LVS介绍
LVS是linux virtual server的简写linux虚拟服务器,是一个虚拟的服务器集群系统,可以再unix/linux平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立。
以下是LVS官网提供的4篇文章:(非常详细,我觉得有兴趣还是看官方文档比较正宗吧!!)
http://www.linuxvirtualserver.org/zh/lvs1.html
http://www.linuxvirtualserver.org/zh/lvs2.html
http://www.linuxvirtualserver.org/zh/lvs3.html
http://www.linuxvirtualserver.org/zh/lvs4.html
IPVS发展史
早在2.2内核时,IPVS就已经以内核补丁的形式出现。
从2.4.23版本开始ipvs软件就是合并到linux内核的常用版本的内核补丁的集合。
从2.4.24以后IPVS已经成为linux官方标准内核的一部分
从上图可以看出lpvs是工作在内核层,我们不能够直接操作ipvs,vs负载均衡调度技术是在linux内核中实现的。因此,被称之为linux虚拟服务器。我们使用该软件配置lvs的时候,不能直接配置内核中的ipvs,而需要使用ipvs的管理工具ipvsadm进行管理。通过keepalived也可以管理LVS。
LVS体系结构与工作原理简单描述
LVS集群负载均衡器接受服务的所有入展客户端的请求,然后根据调度算法决定哪个集群节点来处理回复客户端的请求。
LVS虚拟服务器的体系如下图所示,一组服务器通过高速的局域网或者地理分布的广域网相互连接,在这组服务器之前有一个负载调度器(load balance)。负载调度器负责将客户的请求调度到真实服务器上。这样这组服务器集群的结构对用户来说就是透明的。客户访问集群系统就如只是访问一台高性能,高可用的服务器一样。客户程序不受服务器集群的影响,不做任何修改。
就比如说:我们去饭店吃饭点菜,客户只要跟服务员点菜就行。并不需要知道具体他们是怎么分配工作的,所以他们内部对于我们来说是透明的。此时这个服务员就会按照一定的规则把他手上的活,分配到其他人员上去。这个服务员就是负载均衡器(LB)而后面这些真正做事的就是服务器集群。
底下是官网提供的结构图:
LVS的基本工作过程
客户请发送向负载均衡服务器发送请求。负载均衡器接受客户的请求,然后先是根据LVS的调度算法(8种)来决定要将这个请求发送给哪个节点服务器。然后依据自己的工作模式(3种)来看应该如何把这些客户的请求如何发送给节点服务器,节点服务器又应该如何来把响应数据包发回给客户端。
恩,那这样我们就只要接下来搞懂LVS的3中工作模式,8种调度算法就可以了。
LVS的三种工作模式:
1)VS/NAT模式(Network address translation)
2)VS/TUN模式(tunneling)
3)DR模式(Direct routing)
1、NAT模式-网络地址转换
Virtualserver via Network address translation(VS/NAT)
这个是通过网络地址转换的方法来实现调度的。首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT模式下我们需要把RS的默认路由设置为LB服务器。)把响应后的数据包发送给LB,LB再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
调度过程IP包详细图:
原理图简述:
1)客户端请求数据,目标IP为VIP
2)请求数据到达LB服务器,LB根据调度算法将目的地址修改为RIP地址及对应端口(此RIP地址是根据调度算法得出的。)并在连接HASH表中记录下这个连接。
3)数据包从LB服务器到达RS服务器webserver,然后webserver进行响应。Webserver的网关必须是LB,然后将数据返回给LB服务器。
4)收到RS的返回后的数据,根据连接HASH表修改源地址VIP&目标地址CIP,及对应端口80.然后数据就从LB出发到达客户端。
5)客户端收到的就只能看到VIP\DIP信息。
NAT模式优缺点:
1、NAT技术将请求的报文和响应的报文都需要通过LB进行地址改写,因此网站访问量比较大的时候LB负载均衡调度器有比较大的瓶颈,一般要求最多之能10-20台节点
2、只需要在LB上配置一个公网IP地址就可以了。
3、每台内部的节点服务器的网关地址必须是调度器LB的内网地址。
4、NAT模式支持对IP地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。
2、TUN模式
virtual server via ip tunneling模式:采用NAT模式时,由于请求和响应的报文必须通过调度器地址重写,当客户请求越来越多时,调度器处理能力将成为瓶颈。为了解决这个问题,调度器把请求的报文通过IP隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文,由于一般网络服务应答数据比请求报文大很多,采用VS/TUN模式后,集群系统的最大吞吐量可以提高10倍。
VS/TUN的工作流程图如下所示,它和NAT模式不同的是,它在LB和RS之间的传输不用改写IP地址。而是把客户请求包封装在一个IP tunnel里面,然后发送给RS节点服务器,节点服务器接收到之后解开IP tunnel后,进行响应处理。并且直接把包通过自己的外网地址发送给客户不用经过LB服务器。
Tunnel原理流程图:
原理图过程简述:
1)客户请求数据包,目标地址VIP发送到LB上。
2)LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。
3)RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有LB和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。
4)响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。(RS节点服务器需要在本地回环接口配置VIP,后续会讲)
3、DR模式(直接路由模式)
Virtual server via direct routing (vs/dr)
DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。同TUN模式一样,DR模式可以极大的提高集群系统的伸缩性。而且DR模式没有IP隧道的开销,对集群中的真实服务器也没有必要必须支持IP隧道协议的要求。但是要求调度器LB与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。
DR模式是互联网使用比较多的一种模式。
DR模式原理图:
DR模式原理过程简述:
VS/DR模式的工作流程图如上图所示,它的连接调度和管理与NAT和TUN中的一样,它的报文转发方法和前两种不同。DR模式将报文直接路由给目标真实服务器。在DR模式中,调度器根据各个真实服务器的负载情况,连接数多少等,动态地选择一台服务器,不修改目标IP地址和目标端口,也不封装IP报文,而是将请求报文的数据帧的目标MAC地址改为真实服务器的MAC地址。然后再将修改的数据帧在服务器组的局域网上发送。因为数据帧的MAC地址是真实服务器的MAC地址,并且又在同一个局域网。那么根据局域网的通讯原理,真实复位是一定能够收到由LB发出的数据包。真实服务器接收到请求数据包的时候,解开IP包头查看到的目标IP是VIP。(此时只有自己的IP符合目标IP才会接收进来,所以我们需要在本地的回环借口上面配置VIP。另:由于网络接口都会进行ARP广播响应,但集群的其他机器都有这个VIP的lo接口,都响应就会冲突。所以我们需要把真实服务器的lo接口的ARP响应关闭掉。)然后真实服务器做成请求响应,之后根据自己的路由信息将这个响应数据包发送回给客户,并且源IP地址还是VIP。
DR模式小结:
1、通过在调度器LB上修改数据包的目的MAC地址实现转发。注意源地址仍然是CIP,目的地址仍然是VIP地址。
2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)
3、因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面
4、RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。
5、RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。
6、由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。
官方三种负载均衡技术比较总结表:
工作模式 | VS/NAT | VS/TUN | VS/DR |
Real server (节点服务器) | Config dr gw | Tunneling | Non-arp device/tie vip |
Server Network | Private | LAN/WAN | LAN |
Server number (节点数量) | Low 10-20 | High 100 | High 100 |
Real server gateway | Load balance | Own router | Own router |
优点 | 地址和端口转换 | Wan环境加密数据 | 性能最高 |
缺点 | 效率低 | 需要隧道支持 | 不能跨域LAN |
LVS调度算法
最好参考此文章:http://www.linuxvirtualserver.org/zh/lvs4.html
Lvs的调度算法决定了如何在集群节点之间分布工作负荷。当director调度器收到来自客户端访问VIP的上的集群服务的入站请求时,director调度器必须决定哪个集群节点应该处理请求。Director调度器用的调度方法基本分为两类:
固定调度算法:rr,wrr,dh,sh
动态调度算法:wlc,lc,lblc,lblcr
算法 | 说明 |
rr | 轮询算法,它将请求依次分配给不同的rs节点,也就是RS节点中均摊分配。这种算法简单,但只适合于RS节点处理性能差不多的情况 |
wrr | 加权轮训调度,它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值低的RS更多。相同权值的RS得到相同数目的连接数。 |
Wlc | 加权最小连接数调度,假设各台RS的全职依次为Wi,当前tcp连接数依次为Ti,依次去Ti/Wi为最小的RS作为下一个分配的RS |
Dh | 目的地址哈希调度(destination hashing)以目的地址为关键字查找一个静态hash表来获得需要的RS |
SH | 源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的RS |
Lc | 最小连接数调度(least-connection),IPVS表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS. |
Lblc | 基于地址的最小连接数调度(locality-based least-connection):将来自同一个目的地址的请求分配给同一台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。 |
LVS调度算法的生产环境选型:
1、一般的网络服务,如http,mail,mysql等常用的LVS调度算法为:
a.基本轮询调度rr
b.加权最小连接调度wlc
c.加权轮询调度wrc
2、基于局部性的最小连接lblc和带复制的给予局部性最小连接lblcr主要适用于web cache和DB cache
3、源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一。
实际适用中这些算法的适用范围很多,工作中最好参考内核中的连接调度算法的实现原理,然后根据具体的业务需求合理的选型。
以上两篇LVS文章已经介绍了LVS的理论知识,本篇博文就介绍如何手动的配置LVS,目录:
一、环境需求&安装LVS软件
二、手动配置LVS负载均衡器
三、RS节点服务器手动配置
四、测试LVS是否生效
五、部署成功后的另一些问题
一、环境需求&安装LVS软件
环境准备:三台虚拟机
1)此环境是针对内部服务的LVS架构,如数据库,缓存,共享存储等业务。
虚拟机角色 | IP地址 | 备注 |
LVS负载均衡器 | 192.168.41.181 | VIP地址:192.168.40.17 |
http服务器RS1 | 192.168.41.31 | |
http服务器RS2 | 192.168.41.33 |
安装LVS软件
1)在安装LVS软件之前,先确定两条HTTPserver是能够正常访问的。
2)下载软件
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
这里我们使用的2.4版本,并且注意内核是2.6版本的,如果你的版本是6.X版本的话,那么可以使用2.6版本
3)编译安装
需要创建一个软连接:ln -s /usr/src/kernels/2.6.18-238.el5-i686 /usr/src/linux
此处红色许根据自己的系统来进行定义,可以使用tab键来补齐。
tar -zxf ipvsadm-1.24.tar.gz
cd ipvsadm-1.24
make
make install
lsmod |grep ip_vs
ipvsadm --》因为此时系统还没有把ipvs模块加载进系统,需要我们执行ipvsadm命令才会加载进去
或者modprobe ip_vs。
[root@localhost ipvsadm-1.24]# lsmod |grep ip_vs ip_vs_rr 6081 1 ip_vs 78081 3 ip_vs_rr |
二、手动配置LVS负载均衡器
正常工作中是不会手动配置的,也不会使用脚本配置的。最终我们是通过配置文件生效的,结合keepalived来进行部署的。
1)负载均衡器上配置VIP地址
ifconfig eth0:1 192.168.40.17 netmask 255.255.254.0
route add -host 192.168.40.17 dev eth0
2)ipvsadm添加LVS服务
参数 | 参数说明 |
-A | -A --add-service 添加一个带选项的虚拟服务。 Add a virtual service. A serviceaddress is uniquely defined by a triplet: IP address, portnumber, and protocol. Alternatively a virtualservice may be defined by a firewall-mark. |
-t | 指定虚拟服务器的IP地址和端口 |
-s | -s,--scheduler scheduling-method 调度算法 |
-p | 会话保持按秒计算 |
-a | -a在对应的VIP下添加RS节点 |
-g | 指定此LVS的工作模式为-g -g为DR模式 |
-l | 指定LVS的工作模式为-l -l为tunnel模式 |
-m | 指定LVS的工作模式为NAT模式 |
-w | 指定RS节点的权重 |
-D | 删除虚拟服务 格式:ipvsadm-D -t|u|f service-address Delete a virtual service, alongwith any associated real servers. |
-C | -C, --clear Clear the virtual server table清空lvs原有的配置。 |
-set | 设置tcp tcpfn udp 的连接超时时间(一般来说高并发的时候小一点点。 |
ipvsadm -C #请用LVS原有的配置
ipvsadm -A -t 192.168.40.17:80 -s rr -p 20 #添加虚拟服务指定VIP
ipvsadm -a -t 192.168.40.17:80 -r 192.168.41.31:80 -g -w 10#针对虚拟服务添加RS节点
ipvsadm -a -t 192.168.40.17:80 -r 192.168.41.33:80 -g -w 10
ipvsadm -L -n #查看VIP和RS是否已经配置成功。
[root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.40.17:80 rr persistent 20 -> 192.168.41.33:80 Route 10 0 0 -> 192.168.41.31:80 Route 10 0 0 |
LB上删除虚拟服务
ipvsadm -D -t 192.168.40.17:80
三、RS节点服务器手动配置
1)添加lo端口的VIP&路由
ifconfig lo 192.168.40.17 netmask 255.255.255.255 (由于RS的VIP不是用来通讯,并且这里一定要设置24位掩码)
route add -host 192.168.40.17 dev lo
2)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_announce
echo "2">/proc/sys/net/ipv4/conf/all/arp_announce
四、测试LVS是否生效
在LB上面输入命令ipvsadm -L -n就能够查看LB上面的会话分配。在前面加上watch可以动态的查看ipvsadm的会话分配。watch ipvsadm -L -n.
1)测试RS节点是否正常访问
2)测试从LB能否正常访问RS
3)测试客户端能否正常访问VIP
在测试的时候可以先把防火墙关闭掉,一般按照这样配置就能够实现LVS的负载均衡了。
至此我们的LVS DR模式负载均衡已经配置完成了。至于不同的调度算法啊-s 不同的工作模式-g(DR) -l(TUNNEL) -m(NAT)服务器端基本上没有什么差别。只是在客户端上有一定的差别。
NAT模式:
客户端同样需要配置VIP,进行ARP抑制,并且要服务器端开启内核转发功能,配置LB的DIP(内网IP地址)作为默认网关。
开启内核转发功能:vi /etc/sysctl net.ipv4.ip_forword = 1
route add default gw 192.168.41.181
Tunnel模式:
客户端需要先开启Tunnel协议支持。
/sbin/modprobe ipip
/sbin/route add –host 192.168.40.17 devtun1
echo”1”>/proc/sys/net/ipv4/conf/tun1/arp-ignore
echo”2”>/proc/sys/net/ipv4/conf/tun1/arp_announce
echo”0” >/proc/sys/net/ipv4/conf/tun1/rp_filter
echo”1” >/proc/sys/net/ipv4/conf/tun1/forwarding
echo”1” >/proc/sys/net/ipv4/conf/all/arp_ignore
echo”2” >/proc/sys/net/ipv4/conf/all/ arp_announce
五、部署成功后的另一些问题
1)当我们的RS节点出现问题,LB如何知道。如果不知道是会把会话连接接续转发到RS上面。
2)如果LB出现故障,那么整个网络就出现故障。
针对上面的1问题,我们就需要一种RS节点健康检查机制。定时的去检测RS是否正常,如果出现不正常那么就把这个RS从VIP服务里面删除掉。如果恢复正常了,就再把RS添加进来。针对2问题,我们可以另外再架设一台LB服务器,作为备LB服务器。那么当主LB出现故障,备LB服务器就会启动接管主LB服务器的工作,接管它的资源(IP地址,在网络中的角色身份等)
而上面提到的这些我们就需要结合keepalived来完成。所以后续我们开始讲keepalived+lvs结合适用。完成RS节点健康检查和LVS的高可用性功能。
之前已经讲解LVS原理,并且介绍了如果手动部署LVS。但由于我们需要进行RS节点服务器的健康检查,还有要做LVS的HA。此文就主要介绍keepalived的原理,并且介绍如何部署keepalived做作为web服务器的HA。本文的目录如下:
一、keepalived原理介绍
二、部署keepalived作为web服务器的HA
三、脚本实现监控httpd服务
一、keepalived原理介绍
1)keepalived简介
Keepalived的功能有点像是两个人互相看着一个工作,如果一个人离开岗位另外一个人就会接替,这个keepalived就是他们之间保持这样“替换机制”的工具。keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
Keepalived服务主要有两大用途:heartbeat(高可用)&failover(健康检测)
Keepalived服务主要截图vrrp来完成这些工作的,以下我就来介绍下VRRP协议是怎样的工作的,那么基本上keepalived的工作原理就是如此。
2)VRRP协议(VRRP Virtual Router Redundancy Protocol,虚拟路由冗余协议)
VRRP协议过程简述:VRRP 将局域网的一组路由器(包括一个Master 即活动路由器和若干个Backup 即备份路由器)组织成一个虚拟路由器,称之为一个备份组。这个虚拟的路由器拥有自己的IP 地址10.100.10.1(这个IP 地址可以和备份组内的某个路由器的接口地址相同,相同的则称为ip拥有者),备份组内的路由器也有自己的IP 地址(如Master的IP 地址为10.100.10.2,Backup 的IP 地址为10.100.10.3)。局域网内的主机仅仅知道这个虚拟路由器的IP 地址10.100.10.1,而并不知道具体的Master 路由器的IP 地址10.100.10.2 以及Backup 路由器的IP 地址10.100.10.3。[1]它们将自己的缺省路由下一跳地址设置为该虚拟路由器的IP 地址10.100.10.1。于是,网络内的主机就通过这个虚拟的路由器来与其它网络进行通信。如果备份组内的Master 路由器坏掉,Backup 路由器将会通过选举策略选出一个新的Master 路由器,继续向网络内的主机提供路由服务。从而实现网络内的主机不间断地与外部网络进行通信。
VRRP原理:
在VRRP路由器组中,按优先级选举主控路由器,VRRP协议中优先级范围是0—255若VRRP路由器的IP地址和虚拟路由器的接口IP地址相同,则称该虚拟路由器作VRRP组中的IP地址所有者;IP地址所有者自动具有最高优先级:255优先级0一般用在IP地址所有者主动放弃主控者角色时使用可配置的优先级范围为1—254优先级的配置原则可以依据链路的速度和成本路由器性能和可靠性以及其它管理策略设定主控路由器的选举中,高优先级的虚拟路由器获胜,因此,如果在VRRP组中有IP地址所有者,则它总是作为主控路由的角色出现对于相同优先级的候选路由器,按照IP地址大小顺序选举VRRP还提供了优先级抢占策略,如果配置了该策略,高优先级的备份路由器便会剥夺当前低优先级的主控路由器而成为新的主控路由器[3]
为了保证VRRP协议的安全性,提供了两种安全认证措施:明文认证和IP头认证明文认证方式要求:在加入一个VRRP路由器组时,必须同时提供相同的VRID和明文密码适合于避免在局域网内的配置错误,但不能防止通过网络监听方式获得密码IP头认证的方式提供了更高的安全性,能够防止报文重放和修改等攻击。
二、部署keepalived作为web服务器的HA
1)部署两台apache web服务器
yum install httpd -y
/etc/init.d/httpd start
2)分别安装keepalived软件
#下载安装
wget http://www.keepalived.org/software/keepalived-1.2.8.tar.gz
tar -zxf keepalived-1.2.8.tar.gz
cd keepalived-1.2.8
ll
./configure --prefix=/usr/local/keepalived
make
make install
#配置keepalived的自启动&拷贝keepalived的执行程序
cp /usr/local/keepalive/sbin/keepalived/ /usr/sbin/
cp cp /usr/local/keepalived/sbin/keepalived /usr/sbin//usr/local/keepalived/sbin/keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
3)编辑主web和备web的keepalived配置文件
主web服务器的配置文件
[root@localhost keepalived-1.2.8]# cat /etc/keepalived.conf ! Configuration File for keepalived
global_defs { notification_email { #设置报警邮件地址,可多行每行一个。 752119102@qq.com } notification_email_from keepalived@localhost #设置邮件的发送地址 smtp_server 127.0.0.1 #设置SMTP server地址 smtp_connect_timeout 30 #设置SMTP 超时时间 router_id LVS_DEVEL #运行keepalived机器的一个标识 }
vrrp_instance VI_1 { #定义一个vrrp实例,不同实例的实例编号不一样。 state MASTER #定义在keepalived的角色MASTER表示为主服务器,BACKUP为备服务器。 interface eth0 #指定HA检测的网络接口 virtual_router_id 51 #虚拟路由标示,同一个实例里的路由标示相同,且唯一。MASTER和BACKUP的路由标识一样,且唯一。 priority 100 #定义此服务器在此虚拟路由器中的优先级,优先级大权限高 advert_int 1 #检测时间间隔 authentication { #设置验证类型和密码,主从的密码必须相同,要不两者不通讯。 auth_type PASS auth_pass 1111 } virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址。 192.168.41.249 } } |
备web服务器的配置文件
[root@localhost ~]# cat /etc/keepalived.conf ! Configuration File for keepalived
global_defs { notification_email { 752119102@qq.com } notification_email_from keepalive@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL }
vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.41.249 } } |
启动keepalived服务
/etc/init.d/keepalived start
/etc/init.d/keepalived stop
4)查看keepalived日志信息
主web服务器
Jan 14 20:27:41 localhost Keepalived_vrrp[20840]: Opening file '/etc/keepalived/keepalived.conf'. Jan 14 20:27:41 localhost Keepalived_vrrp[20840]: Configuration is using : 36304 Bytes Jan 14 20:27:41 localhost Keepalived_vrrp[20840]: Using LinkWatch kernel netlink reflector... Jan 14 20:27:41 localhost Keepalived[20837]: Starting VRRP child process, pid=20840 Jan 14 20:27:41 localhost Keepalived_vrrp[20840]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(11,12)] Jan 14 20:27:42 localhost Keepalived_vrrp[20840]: VRRP_Instance(VI_1) Transition to MASTER STATE Jan 14 20:27:43 localhost Keepalived_vrrp[20840]: VRRP_Instance(VI_1) Entering MASTER STATE Jan 14 20:27:43 localhost Keepalived_vrrp[20840]: VRRP_Instance(VI_1) setting protocol VIPs. Jan 14 20:27:43 localhost Keepalived_vrrp[20840]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.41.249 Jan 14 20:27:43 localhost Keepalived_vrrp[20840]: Netlink reflector reports IP 192.168.41.249 added Jan 14 20:27:43 localhost avahi-daemon[3207]: Registering new address record for 192.168.41.249 on eth0. Jan 14 20:27:43 localhost Keepalived_healthcheckers[20839]: Netlink reflector reports IP 192.168.41.249 added Jan 14 20:27:44 localhost avahi-daemon[3207]: Invalid query packet. Jan 14 20:27:46 localhost last message repeated 8 times Jan 14 20:27:48 localhost Keepalived_vrrp[20840]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.41.249 Jan 14 20:27:48 localhost avahi-daemon[3207]: Invalid query packet. |
备web服务器日志
Jan 14 19:55:26 localhost Keepalived_vrrp[19423]: Opening file '/etc/keepalived/keepalived.conf'. Jan 14 19:55:26 localhost Keepalived_vrrp[19423]: Configuration is using : 36302 Bytes Jan 14 19:55:26 localhost Keepalived_vrrp[19423]: Using LinkWatch kernel netlink reflector... Jan 14 19:55:26 localhost Keepalived[19420]: Starting VRRP child process, pid=19423 Jan 14 19:55:26 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Entering BACKUP STATE Jan 14 19:55:26 localhost Keepalived_vrrp[19423]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(11,12)] |
当主web服务器的keepalived停掉后,及主keepalived重新启动时的日志:
Jan 14 20:25:57 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Transition to MASTER STATE Jan 14 20:25:58 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Entering MASTER STATE Jan 14 20:25:58 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) setting protocol VIPs. Jan 14 20:25:58 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.41.249 Jan 14 20:25:58 localhost Keepalived_vrrp[19423]: Netlink reflector reports IP 192.168.41.249 added Jan 14 20:25:58 localhost Keepalived_healthcheckers[19422]: Netlink reflector reports IP 192.168.41.249 added Jan 14 20:26:03 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.41.249 ###主keepalived重新启动后 Jan 14 20:27:42 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Received higher prio advert Jan 14 20:27:42 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Entering BACKUP STATE Jan 14 20:27:42 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) removing protocol VIPs. |
并且通过tcpdump vrrp能够看到两者之间的通讯
[root@localhost ~]# tcpdump vrrp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 20:38:58.657600 IP 192.168.41.33 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20 20:38:59.658287 IP 192.168.41.33 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20 20:39:00.659280 IP 192.168.41.33 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20 20:39:01.660358 IP 192.168.41.33 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20 20:39:02.661203 IP 192.168.41.33 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20 20:39:03.662205 IP 192.168.41.33 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20 20:39:04.663129 IP 192.168.41.33 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s, length 20 |
三、脚本实现监控httpd服务
目前keepalived能够实现当我们的主web宕机或者网络出现故障时进行切换,但如果仅是httpd进程出现故障,所以我们就需要写一点实时监控httpd进程状态的脚本,即如果进程出现问题我们就进行切换。
脚本内容:
#!/bin/bash # QQ:752119102 while true do httpdpid=`ps -C httpd --no-heading |wc -l` if [ $httpdpid -eq 0 ];then /etc/init.d/httpd start sleep 5 httpdpid=`ps -C httpd --no-heading |wc -l` if [ $httpdpid -eq 0 ];then /etc/init.d/keepalive stop fi fi sleep 5 done |
即当我们的httpd进程被停止了,并且无法重启我们会将keepalived进行停止,让备web服务器进行接管,成为主WEB服务器提供服务。
到此我们已经能够轻松的部署keepalived让它作为web服务器的HA.
本文我们主要讲解的是LVS通过keepalived来实现负载均衡和高可用,而不是我们第三篇文章介绍的通过手动的方式来进行配置。通过脚本的方式来显示RS节点的健康检查和LVS的故障切换。此文会通过一个实例来讲解,本文目录如下:
一、实验环境需求&准备
二、配置keepalived实现负载均衡&高可用
一、实验环境需求&准备
我们这次实验要完成的一个架构如下图所示,我们通过LVS-DR-MASTER,LVS-DR-BACKUP作为LVS负载均衡调度器,并且两者之间通过keepalived来两者之间的HA。keepalived本身就是为了LVS为开发的,所以说我们通过keepalived来进行LVS的配置就显得十分的方便。而且keepalived是直接操作ip_vs不用通过ipvsadm,所以更加方便。
1)实验架构图&需求表:
角色 | IP地址 | 备注 |
主LVS调度器(MASTER) | 192.168.41.181 | 使用keepalived配置 |
备LVS调度器(BACKUP) | 192.168.41.251 | |
HTTP服务器(RS1) | 192.168.41.31 | apache服务器(一般生产环境需要外网IP地址,这里用内网IP地址替代) |
HTTP服务器(RS2) | 192.168.41.33 | |
虚拟IP地址(VIP) | 192.168.41.249 | 虚拟IP地址 |
2)部署http服务器,验证能正常访问
这里就不多费篇幅介绍了,就是要保证http能正常访问。
二、配置keepalived实现负载均衡&高可用
1)安装keepalived软件
wget http://www.keepalived.org/software/keepalived-1.2.8.tar.gz
tar -zxf keepalived-1.2.8.tar.gz
cd keepalived-1.2.8
./configure --prefix=/usr/local/keepalived
make
make install
#配置keepalived的自启动&拷贝keepalived的执行程序
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
#开启内核的转发功能
vi /etc/sysctl net.ipv4.ip_forword = 1
2)配置LVS-DR-MASK的keepalived.conf配置文件
! Configuration File for keepalived global_defs { notification_email { 752119102@qq.com #设置报警邮箱,一般不再这做,而是用其他方式报警。 } notification_email_from keepalived@localhost #设定发送邮件地址 smtp_server 127.0.0.1 #设定发送邮件服务器 smtp_connect_timeout 30 #设定SMTP连接超时时间 router_id LVS_DEVEL #查阅说明文档得知route_id配置是为了标识当前节点,我将其设置为NodeA。当然两个节点的此项设置可相同,也可不相同。 } vrrp_instance VI_1 { #定义虚拟路由实例,不同实例ID不同。 state MASTER #定义服务器在keepalived中的角色主服务器 interface eth0 #定义进行检测的端口eth0 virtual_router_id 51 #定义虚拟路由ID,同一个实例的主从一样。 priority 100 #定义在虚拟路由器组的权限,越大越高 advert_int 1 #定义检测时间间隔 authentication { #定义认证方式密码,主从必须一样 auth_type PASS auth_pass 1111 } virtual_ipaddress { #指定虚拟IP地址 192.168.41.249 } } virtual_server 192.168.41.249 80 { #定义虚拟服务,需指定IP地址和端口,空格隔开。 delay_loop 6 #定义RS运行情况监测时间间隔 lb_algo rr #定义负载调度算法 lb_kind DR #定义LVS的工作模式 nat_mask 255.255.255.0 #定义虚拟服务的mask persistence_timeout 50 #定义会话保持时间,S为单位 protocol TCP #指定转发协议 real_server 192.168.41.31 80 { #定义真实服务器IP地址和端口 weight 1 #定义RS的权重 TCP_CHECK{ #RS server健康检查部分 connect_timeout 10 #定义超出10s连接超时 nb_get_retry 3 #定义重试次数 delay_before_retry 3 #定义重试时间间隔 connect_port 80 #定义健康检查端口 } real_server 192.168.41.33 80 { weight 1 TCP_CHECK{ connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } |
3)配置LVS-DR-BACKUP的keepalived.conf配置文件
! Configuration File for keepalived global_defs { notification_email { 752119102@qq.com #设置报警邮箱,一般不再这做,而是用其他方式报警。 } notification_email_from keepalived@localhost #设定发送邮件地址 smtp_server 127.0.0.1 #设定发送邮件服务器 smtp_connect_timeout 30 #设定SMTP连接超时时间 router_id LVS_DEVEL #负载均衡器标示,在局域网内是唯一的 } vrrp_instance VI_1 { #定义虚拟路由实例,不同实例ID不同。 state BACKUP #定义服务器在keepalived中的角色 interface eth0 #定义进行检测的端口eth0 virtual_router_id 51 #定义虚拟路由ID,同一个实例的主从一样。 priority 50 #定义在虚拟路由器组的权限,越大越高 advert_int 1 #定义检测时间间隔 authentication { #定义认证方式密码,主从必须一样 auth_type PASS auth_pass 1111 } virtual_ipaddress { #指定虚拟IP地址 192.168.41.249 } } virtual_server 192.168.41.249 80 { #定义虚拟服务,需指定IP地址和端口,空格隔开。 delay_loop 6 #定义RS运行情况监测时间间隔 lb_algo rr #定义负载调度算法 lb_kind DR #定义LVS的工作模式 nat_mask 255.255.255.0 #定义虚拟服务的mask persistence_timeout 50 #定义会话保持时间,S为单位 protocol TCP #指定转发协议 real_server 192.168.41.31 80 { #定义真实服务器IP地址和端口 weight 1 #定义RS的权重 TCP_CHECK{ #RS server健康检查部分 connect_timeout 10 #定义超出10s连接超时 nb_get_retry 3 #定义重试次数 delay_before_retry 3 #定义重试时间间隔 connect_port 80 #定义健康检查端口 } real_server 192.168.41.33 80 { weight 1 TCP_CHECK{ connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } |
说明:这里主LVS-DR-MASTER和LVS-DR-BACKUP之间的配置的差别就只有红色部分:HA的角色(MASTER,BACKUP)和优先级不同,还有router_id。
4)客户端配置LVS参数
客户端需要做的工作就是绑定我们的VIP在lo口,并且进行ARP抑制,之前的文章已经提过此方法咯。现在我们就换成将配置写成脚本来执行。
脚本内容:
[root@RS2 ~]# cat lvs-client.sh #!/bin/bask # 752119102@qq.com # . /etc/rc.d/init.d/functions VIP=( 192.168.41.249 ) function start(){ for ((i=0;i<`echo ${#VIP[*]}`;i++)) do echo ${i} ${VIP[$i]} ifconfig lo:${i} ${VIP[$i]} netmask 255.255.255.255 up route add -host ${VIP[$i]} dev lo 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_announce echo "2">/proc/sys/net/ipv4/conf/all/arp_announce } function stop(){ for ((i=0;i<${#VIP[*]};i++)) do echo ${i} ${VIP[$i]} ifconfig lo:${i} ${VIP[$i]} netmask 255.255.255.255 up route del -host ${VIP[$i]} dev lo:${i} done } case "$1" in start) start exit ;; stop) stop exit ;; *) echo "You must use $0:stop|start" ;; esac |
5)测试实验结果
如果测试部成功可以按照三角的排查原理来进行排查,显示client到RS端是否能通讯,LB到RS能否通讯,client到LB是否能通讯,client到VIP是否能够通讯。并且查看LVS的运行状态。一定要确保keepalived.conf这个配置文件是正确的。