lvs+keepalived集群架构服务

一,LVS功能详解html

1.1 LVS(Linux Virtual Server)介绍前端

LVS是Linux Virtual Server 的简写(也叫作IPVS),意即Linux虚拟服务器,是一个虚拟的服务器集群系统,能够在UNIX/LINUX平台下实现负载均衡集群功能。linux

1.2 企业网站LVS集群架构图nginx

1.3 IPVS软件工做层次图web

从上图咱们看出,LVS负载均衡调度技术是在Linux内核中实现的,所以,被称之为Linux虚拟服务器(Linux Virtual Server)。咱们使用该软件配置LVS时候,不能直接配置内核中的ipbs,而须要使用ipvs管理工具ipvsadm进行管理,或者经过Keepalived软件直接管理ipvs。算法

1.4 LVS体系结构与工做原理简单描述数据库

  • LVS集群负载均衡器接受服务的全部入站客户端计算机请求,并根据调度算法决定哪一个集群节点应该处理回复请求。负载均衡器(简称LB)有时也被称为LVS Director(简称Director)。

 

  • LVS虚拟服务器的体系结构以下图所示,一组服务器经过高速的局域网或者地理分布的广域网相互链接,在他们的前端有一个负载调度器(Load Balancer)。 负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访问一台高性能,高可用的服务器同样。客户程序不受服务器集群的影响不须要做任何修改。系统的伸缩性经过在服务集群中透明地加入和删除一个节点来达到,经过检测节点或服务进程故障和正确地重置系统达到高可用性。因为咱们的负载调度技术是在Linux内核中实现的,咱们称之为Linux虚拟服务器(Linux Virtual Server)。

 

1.5 LVS 基本工做过程图apache

LVS基本工做过程以下图所示:vim

为了方便你们探讨LVS技术,LVS社区提供了一个命名的约定,内容以下表:windows

 

名称

缩写

说明

虚拟IP

VIP

VIP为Director用于向客户端计算机提供服务的IP地址。好比:www.yunjisuan.com域名就要解析到vip上提供服务

真实IP地址

RIP

在集群下面节点上使用的IP地址,物理IP地址

Dirctor的IP地址

DIP

Director用于链接内外网络的IP地址,物理网卡上的IP地址。是负载均衡器上的IP

客户端主机IP地址

CIP

客户端用户计算机请求集群服务器的IP地址,该地址用做发送给集群的请求的源IP地址

LVS集群内部的节点称为真实服务器(Real Server),也叫作集群节点。请求集群服务的计算机称为客户端计算机。 
与计算机一般在网上交换数据包的方式相同,客户端计算机,Director和真实服务器使用IP地址彼此进行通讯。 
不一样架构角色命名状况以下图:

 

1.6 LVS集群的3种常见工做模式介绍与原理讲解

 

IP虚拟服务器软件IPVS

  • 在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有经过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的,高可用的虚拟服务器,咱们称之为VS/NAT技术(Virtual Server via Network Address Translation),大多数商业化的IP负载均衡调度器产品都是使用NAT的方法,如Cisco的额LocalDirector,F5,Netscaler的Big/IP和Alteon的ACEDirector。
  • 在分析VS/NAT 的缺点和网络服务的非对称性的基础上,咱们提出经过IP隧道实现虚拟服务器的方法VS/TUN(Virtual Server via IP Tunneling)和经过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),他们能够极大地提升系统的伸缩性。因此,IPVS软件实现了这三种IP负载均衡技术。淘宝开源的模式FULLNAT.

LVS的四种工做模式

  1. NAT(Network Address Translation)
  2. TUN(Tunneling)
  3. DR(Direct Routing)
  4. FULLNAT(Full Network Address Translation)

1.6.1 NAT模式-网络地址转换<==收费站模式(了解便可)

Virtual Server via Network Address TranslationVS/NAT

调度时:目的IP改为RIP(DNAT) 
返回时:源IP改为VIP(SNAT)

NAT模式特色小结:

 

  1. NAT技术将请求的报文(DNAT)和响应的报文(SNAT),经过调度器地址重写而后在转发发给内部的服务器,报文返回时在改写成原来的用户请求的地址。
  2. 只须要在调度器LB上配置WAN公网IP便可,调度器也要有私有LAN IP和内部RS节点通讯。
  3. 每台内部RS节点的网关地址,必需要配成调度器LB的私有LAN内物理网卡地址(LDIP),这样才能确保数据报文返回时仍然通过调度器LB。
  4. 因为请求与响应的数据报文都通过调度器LB,所以,网站访问量大时调度器LB有较大瓶颈,通常要求最多10-20台节点。
  5. NAT模式支持对IP及端口的转换,即用户请求10.0.0.1:80,能够经过调度器转换到RS节点的10.0.0.2:8080(DR和TUN模式不具有的)
  6. 全部NAT内部RS节点只须要配置私有LAN IP便可。
  7. 因为数据包来回都须要通过调度器,所以,要开启内核转发net.ipv4.ip_forward=1,固然也包括iptables防火墙的forward功能(DR和TUN模式不须要)。

1.6.2 TUN模式-(了解便可)

增长一个IP头部。经过IP隧道进行通讯(能够跨网段找到RS节点)

TUN模式特色小结

  1. 负载均衡器经过把请求的报文经过IP隧道的方式转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户。
  2. 因为真实服务器将响应处理后的报文直接返回给客户端用户,所以,最好RS有一个外网IP地址,这样效率才会更高。理论上:只要能出网便可,无需外网IP地址。
  3. 因为调度器LB只处理入站请求的报文。所以,此集群系统的吞吐量能够提升10倍以上,但隧道模式也会带来必定得系统开销。TUN模式适合LAN/WAN。
  4. TUN模式的LAN环境转发不如DR模式效率高,并且还要考虑系统对IP隧道的支持问题。
  5. 全部的RS服务器都要绑定VIP,抑制ARP,配置复杂。
  6. LAN环境通常多采用DR模式,WAN环境能够用TUN模式,可是当前在WAN环境下,请求转发更多的被haproxy/nginx/DNS调度等代理取代。所以,TUN模式在国内公司实际应用的已经不多。跨机房应用要么拉光纤成局域网,要么DNS调度,底层数据还得同步。
  7. 直接对外的访问业务,例如:Web服务作RS节点,最好用公网IP地址。不直接对外的业务,例如:MySQL,存储系统RS节点,最好用内部IP地址。

1.6.3 DR模式-直接路由模式(重点)

Virtual Server via Direct RoutingVS/DR

VS/DR模式是经过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。同VS/TUN技术同样,VS/DR技术可极大地提升集群系统的伸缩性。并且,这种DR模式没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,可是要求调度器LB与正式服务器RS节点都有一块网卡连在同一物理网段上,即必须在同一个局域网环境。

 

只修改目标MAC地址,经过MAC找到RS节点(没法跨网段找到RS节点)

DR模式特色小结:

  1. 经过在调度器LB上修改数据包的目的MAC地址实现转发。(源IP地址仍然是CIP,目的IP地址仍然是VIP)
  2. 请求的报文通过调度器,而RS响应处理后的报文无需通过调度器LB,所以,并发访问量大时使用效率很高(和NAT模式相比)
  3. 因DR模式是经过MAC地址的改写机制实现的转发,所以,全部RS节点和调度器LB只能在一个局域网LAN中(缺点)
  4. RS节点的默认网关不须要是调度器LB的DIP,而直接是IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的状况),理论讲:只要RS能够出网便可,不是必需要配置外网IP
  5. 因为DR模式的调度器仅进行了目的MAC地址的改写,所以,调度器LB没法改变请求的报文的目的端口(缺点)
  6. 当前,调度器LB支持几乎全部的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点能够是WINDOWS系统。
  7. 总的来讲DR模式效率很高,可是配置也较麻烦,所以,访问量不是特别大的公司能够用haproxy/nginx取代之。这符合运维的原则:简单,易用,高效。日2000W PV或并发请求1万如下均可以考虑用haproxy/nginx(LVS NAT模式)
  8. 直接对外的访问业务,例如:Web服务作RS节点,RS最好用公网IP地址。若是不直接对外的业务,例如:MySQl,存储系统RS节点,最好只用内部IP地址。

1.6.4 FULLNAT模式-(了解便可)

淘宝的LVS应用模式

 

FULLANT特色: 
1,源IP改为不一样的VIP和目的IP改为RIP 
2,RS处理完毕返回时,返回给不一样的LVS调度器 
3,全部LVS调度器之间经过session表进行Client Address的共享

1.7 LVS的调度算法

  • LVS的调度算法决定了如何在集群节点之间分布工做负荷。
  • 当Director调度器收到来自客户端计算机访问它的VIP上的集群服务的入站请求时,Director调度器必须决定哪一个集群节点应该处理请求。Director调度器可用于作出该决定的调度方法分红两个基本类别: 
    固定调度方法:rr,wrr,dh,sh 
    动态调度算法:wlc,lc,lblc,lblcr,SED,NQ

10种调度算法见以下表格(rr,wrr,wlc重点):

 

算法

说明

rr

轮循调度,它将请求依次分配不一样的RS节点,也就是在RS节点中均摊请求。这种算法简单,可是只适合于RS节点处理性能相差不大的状况

wrr

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

dh

目的地址哈希调度,以目的地址为关键字查找一个静态hash表来得到须要的RS

sh

源地址哈希调度,以源地址为关键字查找一个静态hash表来得到须要的RS

wlc

加权最小链接数调度,实际链接数除以权值,最小的RS做为分配的RS

lc

最小链接数调度,链接数最小的RS做为分配的RS

lblc

基于地址的最小链接数调度,未来自同一目的地址的请求分配给同一台RS节点

lblcr

基于地址带重复最小链接数调度。(略)

SED

最短的指望的延迟(不成熟)

NQ

最小队列调度(不成熟)

 

1.8 LVS的调度算法的生产环境选型

通常的网络服务,如Http,Mail,MySQL等,经常使用的LVS调度算法为: 

  • 基本轮叫调度rr算法
  • 加权最小链接调度wlc
  • 加权轮叫调度wrr算法
  • 基于局部性的最少连接LBLC和带复制的基于局部性最少连接LBLCR主要适用于Web Cache和Db Cache集群,可是咱们不多这样用。(都是一致性哈希算法)
  • :源地址散列调度SH和目标地址散列调度DH能够结合使用在防火墙集群中,它们能够保证整个系统的惟一出入口。
  • :最短预期延时调度SED和不排队调度NQ主要是对处理时间相对比较长的网络服务。

实际使用中,这些算法的适用范围不限于这些。咱们最好参考内核中的链接调度算法的实现原理,根据具体业务需求合理的选型。

 

1.9 LVS集群的特色

LVS集群的特色能够归结以下:

1)功能:

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

2)适用性

1)后端真实服务器可运行任何支持TCP/IP的操做系统,包括Linux,各类Unix(如FreeBSD,Sun Solaris,HP Unix等),Mac/OS和windows NT/2000等。

2)负载均衡调度器LB可以支持绝大多数的TCP和UDP协议:

 

协议

内容

TCP

HTTP,FTP,PROXY,SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等

UDP

DNS,NTP,TCP,视频,音频流播放协议等

无需对客户机和服务做任何修改,可适用大多数Internet服务。

3)调度器自己当前不支持windows系统。支持大多数的Linux和UINIX系统。

3)性能

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

4)可靠性

LVS服务器集群软件已经在不少大型的,关键性的站点获得很好的应用,因此它的可靠性在真实应用获得很好的证明。

5)软件许可证

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

1.10 LVS的官方中文阅读资料

 

标题

地址

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的负载均衡功能(DR模式)

2.1 安装LVS软件

2.1.1 LVS应用场景说明

1)数据库及memcache等对内业务的负载均衡环境

 

管理IP地址

角色

备注

10.1.1.141

LVS调度器(Director)

对外提供服务的VIP为10.1.1.240

10.1.1.142

RS1(真实服务器)

 

10.1.1.143

RS2(真实服务器)

 

特别提示:上面的环境为内部环境的负载均衡模式,即LVS服务是对内部业务的,如数据库及memcache等的负载均衡

2)web服务或web cache等负载均衡环境

外部IP地址

内部IP地址

角色

备注

 

10.1.1.141

LVS调度器(Director)

对外提供服务的VIP为10.1.1.240

 

10.1.1.142

RS1(真实服务器)

 

 

10.1.1.143

RS2(真实服务器)

 

提示: 
这个表格通常是提供Web或Web cache负载均衡的状况,此种状况特色为双网卡环境。这里把192.168.0.0/24假设为内网卡,192.168.200.0/24假设为外网卡。

2.1.2 实验一律述

内部IP(eth0)

外部IP(eth1)

角色

备注

10.1.1.141

LVS负载均衡器

VIP: 10.1.1.240  网关为: 10.1.1.150

10.1.1.142

Web01节点

网关为:10.1.1.150

10.1.1.143

Web02节点

网关为:10.1.1.150

10.1.1.144

内网客户端

网关为:10.1.1.150

 

192.168.1.201

外网客户端

不配网关

10.1.1.150

 192.168.1.201

网关型防火墙

双网卡均无网关

 

2.1.3 两台Web配置简单的http服务

为了方便,咱们能够用yum简单装一个apache提供httpd服务进行测试,过程略。

2.1.4 开始安装LVS

如下的安装都是在LVS LB 10.1.141上

1)下载相关软件包

  1. wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz  # <===适合5.x系统
  2. wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz  # <===适合6.x系统

2)安装准备命令

[root@LVS-Master ~]# lsmod | grep ip_vs
[root@LVS-Master ~]# mount /dev/sr0 /media/cdrom/
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@LVS-Master ~]# yum -y install kernel-devel

[root@LVS-Master ~]# ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64/
drwxr-xr-x 22 root root 4096 Jan  3 02:29 /usr/src/kernels/2.6.32-431.el6.x86_64/
[root@LVS-Master ~]# ln -s /usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux
[root@LVS-Master ~]# ll -d /usr/src/linux/
drwxr-xr-x 22 root root 4096 Jan  3 02:29 /usr/src/linux/
[root@LVS-Master ~]# ll /usr/src/
total 12
drwxr-xr-x.  2 root root  4096 Sep 23  2011 debug
drwxr-xr-x. 12  501 games 4096 Oct  2 21:39 httpd-2.2.9
drwxr-xr-x.  3 root root  4096 Jan  3 02:29 kernels
lrwxrwxrwx   1 root root    39 Jan  3 02:31 linux -> /usr/src/kernels/2.6
.32-431.el6.x86_64/

特别注意: 
此ln命令的连接路径要和uname -r输出结果内核版本对应,工做中若是作安装虚拟化可能有多个内核路径 
若是没有/usr/src/kernels/2.6.32-431.el6.x86_64/路径,极可能是由于缺乏kernel-devel软件包。可经过yum进行安装 
centos5.x版本不能用ipvs1.26

3)安装lvs命令:

[root@LVS-Master ~]# yum -y install createrepo

[root@LVS-Master ~]# ls
anaconda-ks.cfg     install.log         ipvsadm-1.26.tar.gz
httpd-2.2.9.tar.gz  install.log.syslog  rpm
[root@LVS-Master ~]# cd rpm/
[root@LVS-Master rpm]# createrepo -v .

[root@LVS-Master ~]# cd /etc/yum.repos.d/
[root@LVS-Master yum.repos.d]# vim CentOS-Media.repo
[root@LVS-Master yum.repos.d]# cat CentOS-Media.repo | grep -v "#"
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///media/CentOS/
        file:///media/cdrom/
        file:///media/cdrecorder/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[rpm]
name=rpm
baseurl=file:///root/rpm/
gpgcheck=0
enabled=1
[root@LVS-Master yum.repos.d]# yum -y clean all && yum makecache
[root@LVS-Master rpm]# yum -y install libnl* popt*
[root@LVS-Master ~]# ls
anaconda-ks.cfg     install.log         ipvsadm-1.26.tar.gz
httpd-2.2.9.tar.gz  install.log.syslog  rpm
[root@LVS-Master ~]# tar xf ipvsadm-1.26.tar.gz -C /usr/src
[root@LVS-Master ~]# cd /usr/src/ipvsadm-1.26/
[root@LVS-Master ipvsadm-1.26]# make && make install
[root@LVS-Master ipvsadm-1.26]# which ipvsadm
/sbin/ipvsadm
[root@LVS-Master ipvsadm-1.26]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@LVS-Master ipvsadm-1.26]# /sbin/ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@LVS-Master ipvsadm-1.26]# lsmod | grep ip_vs
ip_vs                 125220  0
libcrc32c               1246  1 ip_vs
ipv6                  317340  270 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_
defrag_ipv6

出现这个内容就表示LVS已经安装好,并加载到了内核

 

LVS安装小结: 
1,CentOS5.X安装lvs,使用1.24版本。 
2,CentOS6.X安装lvs,使用1.26版本。 
3,安装lvs后,要执行ipvsadm把ip_vs模块加载到内核。

2.2 手动配置LVS负载均衡服务

2.2.1 手工添加lvs转发

(1)配置LVS虚拟IP(VIP)

 [root@LVS-Master ~]# ifconfig eth0:0 10.1.1.240/24
[root@LVS-Master ~]# ifconfig eth0:0
eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:64:FB:85  
          inet addr:10.1.1.240  Bcast:10.1.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

(2)手工执行配置添加LVS服务并增长两台RS

[root@LVS-Master ~]# ipvsadm -C
[root@LVS-Master ~]# ipvsadm -A -t 10.1.1.240:80 -s rr
[root@LVS-Master ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.1.1.240:http rr
[root@LVS-Master ~]# ipvsadm -a -t 10.1.1.240:80 -r 10.1.1.142:80 -g -w 1

[root@LVS-Master ~]# ipvsadm -a -t 10.1.1.240:80 -r 10.1.1.143:80 -g -w 1

(3)查看lvs配置结果

 

[root@LVS-Master ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.1.1.240:http rr
  -> 10.1.1.142:http              Route   1      0          0         
  -> 10.1.1.143:http              Route   1      0          0 

(4)ipvs配置删除方法

  1. ipvsadm -D -t 192.168.0.240:80 -s rr       #删除虚拟路由主机
  2. ipvsadm -d -t 192.168.0.240:80 -r 192.168.0.223:80     #删除RS节点

此时,能够打开浏览器访问http://10.1.1.240体验结果,若是没意外,是没法访问的。(RS将包丢弃了)

 

 

 

2.2.2 手工在RS端绑定

 在NginxWebB上操做

[root@NginxWebB ~]# ifconfig lo:0 10.1.1.240/32 up
[root@NginxWebB~]# ifconfig lo:0
lo:0      Link encap:Local Loopback  
          inet addr:10.1.1.240  Mask:0.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1

 在NginxWebA上操做

[root@NginxWebA ~]# ifconfig lo:0 10.1.1.240/32 up
[root@NginxWebA ~]# ifconfig lo:0
lo:0      Link encap:Local Loopback  
          inet addr:10.1.1.240  Mask:0.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1

2.2.3 浏览器测试LVS转发效果

 

 

 

注意: 
在测试时候你会发现刷新看的都是同一个RS节点 
这是由于浏览器的缓存问题 
等一段时间之后,刷新就会从新负载均衡到新RS节点了

2.2.4 关于DR模式RS节点的ARP抑制的问题

 

 

 

  • 由于在DR模式下,RS节点和LVS同处一个局域网网段内。
  • 当网关经过ARP广播试图获取VIP的MAC地址的时候
  • LVS和节点都会接收到ARP广播而且LVS和节点都绑定了10.1.1.240这个VIP,因此都会去响应网关的这个广播,致使冲突现象。
  • 所以,咱们须要对RS节点作抑制ARP广播的措施。

[root@NginxWebA ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@NginxWebA ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@NginxWebA ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@NginxWebA ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

[root@NginxWebB ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@NginxWebB ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@NginxWebB ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@NginxWebB ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

用命令curl作测试

[root@内网Client ~]# echo "10.1.1.240 www.yunjisuan.com" >> /etc/hosts

[root@内网Client ~]# curl www.yunjisuan.com
10.1.1.142  www.yunjisuan.com
[root@内网Client~]# curl www.yunjisuan.com
10.1.1.143  www.yunjisuan.com
实现了负载均衡

[root@LVS-Master ~]# echo "10.1.1.240 www.yunjisuan.com" >> /etc/hosts
可是咱们发现让LVS本身curl本身,就会卡那里,为何??

由于如今是在LVS上,可是DR模式的特色就是不会再回LVS了,因此在LVS那里是不行的

2.2.5 配置网关型防火墙

防火墙的双网卡都不要设置网关,由于本身的就是网关

 

 

ifup eth1

外网Client网卡信息

配置完以后重启网络服务

 service network reload

特别提示: 
NginxWebA,NginxWebB,LVS负载均衡器,以及内网Client均将网关设置成网关型防火墙的eth0:10.1.1.150

2.2.6 配置内网客户端

内网客户端用于模拟lvs应用于内网的负载均衡状况 
好比lvs数据库读负载均衡,好比lvs memcached缓存组负载均衡 
因为这类型的负载均衡请求都是由内网服务器发起,所以用内网客户端来模拟

从上面能够看出,内网客户端模拟访问lvs负载均衡器,成功

2.2.7 配置外网客户端

外网客户端模拟的是lvs转发外网用户访问需求给RS节点处理的状况 
模拟外网客户端,要求客户端不能配置任何网关

[root@LVS-Master ~]# ifconfig eth0:0 10.1.1.240/24 up
[root@LVS-Master ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.1.1.240:http rr
  -> 10.1.1.142:http              Route   1      0          0         
  -> 10.1.1.143:http              Route   1      0          0         
[root@LVS-Master ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.1.1.240:80 rr
  -> 10.1.1.142:80                Route   1      0          0         
  -> 10.1.1.143:80                Route   1      0          0

[root@NginxWebA ~]# ifconfig lo:0 10.1.1.240/32 up
[root@NginxWebB ~]# ifconfig lo:0 10.1.1.240/32 up

因为外网客户端要访问内网的LVS须要通过网关防火墙的跳转,所以须要在防火墙服务器上作iptables的DNAT,配置以下:

[root@iptables ~]#  iptables -t nat -A PREROUTING -d 192.168.1.200 -p tcp --dport 80 -i eth1 -j DNAT --to-destination 10.1.1.240:80

[root@iptables ~]# vim /etc/sysctl.conf


[root@iptables ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

进行外网客户端访问LVS负载均衡器测试
[root@外网Client ~]# echo "192.168.1.200 www.yunjisuan.com" >> /etc/hosts

[root@外网Client ~]# curl www.yunjisuan.com
10.1.1.143  www.yunjisuan.com
[root@外网Client ~]# curl www.yunjisuan.com
10.1.1.142  www.yunjisuan.com
[root@外网Client ~]# curl www.yunjisuan.com
10.1.1.143  www.yunjisuan.com
[root@外网Client ~]# curl www.yunjisuan.com
10.1.1.142  www.yunjisuan.com


访问防火墙的外网网卡IP,通过iptables的跳转访问到了内网的LVS调度器,进而返回Web节点处理结果。

 

2.3 arp抑制技术参数说明

  • : arp_ignore-INTRGER
  • 定义对目标地址为本地IP的ARP询问不一样的应答模式 
    • 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地址做为优先的网络接口。

2.4 开发脚本配置LVS负载均衡器端

2.4.1 LVS负载均衡器端自动配置脚本:

2.4.2 RS节点Web服务器端自动配置脚本

三,企业LVS负载均衡高可用最优方案(LVS+Keepalived)

3.1 实验二概述

内部IP(eth0)

外部IP(eth1)

角色

备注

10.1.1.141

LVS负载均衡器(主)

VIP:10.1.1.240

10.1.1.140

LVS负载均衡器(备)

VIP:10.1.1.250

10.1.1.142

Web01节点

 

10.1.1.143

Web02节点

 

10.1.1.144

内网客户端

 

 

3.2 LVS负载均衡器主和备安装LVS软件

先给主再添加一个网络适配器(网卡),而后克隆LVS主当作LVS备

[root@LVS-Master ~]# cd /etc/sysconfig/network-scripts/
[root@LVS-Master network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[root@LVS-Master network-scripts]# vim ifcfg-eth1
[root@LVS-Master network-scripts]# ifdown eth1;ifup eth1

[root@LVS-Master network-scripts]# cat ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=10.1.1.141
NETMASK=255.255.255.0
GATEWAY=10.1.1.150
[root@LVS-Master network-scripts]# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.1.50
NETMASK=255.255.255.0

[root@LVS-Slave network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[root@LVS-Slave network-scripts]# vim ifcfg-eth1
[root@LVS-Slave network-scripts]# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.1.100
NETMASK=255.255.255.0
[root@LVS-Slave network-scripts]# ifdown eth1;ifup eth1

 

3.3 两台Web服务器安装Web服务

过程略

3.4 LVS负载均衡器主和备安装Keepalived软件

[root@LVS-Master ~]# yum -y install keepalived

3.5 仅实现LVS负载均衡器主和备的keepalived高可用功能

LVS负载均衡器主的keepalived配置文件内容以下

 [root@LVS-Master ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
    1409156706@qq.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_01
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    10.1.1.240/24 dev eth0 label eth0:240
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth1
    virtual_router_id 56
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    10.1.1.250/24 dev eth0 label eth0:250
    }
}

virtual_server 10.1.1.240 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#    persistence_timeout 50
    protocol TCP

    real_server 10.1.1.142 80 {
        weight 1
    TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        connect_port 80
        }
    }
    real_server 10.1.1.143 80 {
        weight 1
    TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        connect_port 80
        }
    }
}

virtual_server 10.1.1.250 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#    persistence_timeout 50
    protocol TCP


    real_server 10.1.1.142 80 {
        weight 1
    TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        connect_port 80
        }
    }
    real_server 10.1.1.143 80 {
        weight 1
    TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        connect_port 80
        }
    }
}
[root@LVS-Master ~]# /etc/init.d/keepalived start

 [root@LVS-Master ~]# scp /etc/keepalived/keepalived.conf root@10.1.1.140:/etc/keepalived/
root@10.1.1.140's password:
keepalived.conf                                           100% 1823     1.8KB/s   00:00    

LVS负载均衡器备的keepalived配置文件内容以下

[root@LVS-Slave ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
    1409156706@qq.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_02
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    10.1.1.240/24 dev eth0 label eth0:240
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth1
    virtual_router_id 56
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    10.1.1.250/24 dev eth0 label eth0:250
    }
}

virtual_server 10.1.1.240 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#    persistence_timeout 50
    protocol TCP

    real_server 10.1.1.142 80 {
        weight 1
    TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        connect_port 80
        }
    }
    real_server 10.1.1.143 80 {
        weight 1
    TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        connect_port 80
        }
    }
}

virtual_server 10.1.1.250 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#    persistence_timeout 50
    protocol TCP


    real_server 10.1.1.142 80 {
        weight 1
    TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        connect_port 80
        }
    }
    real_server 10.1.1.143 80 {
        weight 1
    TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        connect_port 80
        }
    }
}
[root@LVS-Slave ~]# /etc/init.d/keepalived start

 

将两个实例中的id设为同样,同为55

[root@LVS-Slave ~]# /etc/init.d/keepalived stop
[root@LVS-Master ~]# /etc/init.d/keepalived restart

 测试失败,上下是不能同样的。。

 

再将配置都改回来
[root@LVS-Master ~]# /etc/init.d/keepalived restart

[root@LVS-Slave ~]# /etc/init.d/keepalived start

内网客户端进行访问测试

因为节点尚未绑定新的VIP,因此curl不过去

[root@NginxWebA ~]# ifconfig lo:1 10.1.1.250/32 up
[root@NginxWebB ~]# ifconfig lo:1 10.1.1.250/32 up

 

综上,至此基于LVS的keepalived高可用功能实验完毕。

相关文章
相关标签/搜索