LVS负载均衡集群

回顾-Nginx反向代理型负载

负载均衡(load balance)集群,提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载、带宽、增长吞吐量、增强网络数据处理能力、提升网络的灵活性和可用性。html

  • 单台计算机没法承受大规模的并发访问,或者数据流量。此时须要搭建负载均衡集群把流量分摊到多台节点设备上分别处理,即减小用户的等待响应的时间,又提高了用户体验;
  • 7*24小时的服务保证,任意一个或者多个有限后端节点宕机,不能影响整个业务的运行。

为何还要学习LVS

  1. 工做在网络模型的7层,能够针对http应用作一些分流的策略,好比针对域名、目录结构,Nginx单凭这点可利用的场合就远多于LVS了。
  2. 最新版本的Nginx也支持4层TCP负载,曾经这是LVS比Nginx好的地方。
  3. Nginx对网路稳定性的依赖很是小,理论上能ping通就能进行负载均衡,这个也是它的优点之一,相反LVS对网络稳定性依赖比较大。
  4. Nginx的安装配置比较简单,测试起来比较方便,它基本能把错误用日志打印出来。LVS的配置、测试就要花比较长的时间了,LVS对网络依赖比较大。

懵逼了,Nginx这么好用,为何还要用LVS。linux

简单一句话,当并发量超过Nginx上线,就可使用LVS了。nginx

日1000-2000W  PV 或者并发请求10000一下均可以考虑用Nginx。web

大型门户网站,点上网站须要用到LVS。算法

并发访问量达到几十万用LVSvim

LVS介绍

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,能够在UNIX/LINUX平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立,是中国国内最先出现的自由软件项目之一。

windows

官网:http://www.linuxvirtualserver.org/index.html后端

# 中文资料 ,网址里面加zh 就是中文的了
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内核模块ip_vs介绍

LVS相关名词解释

CIP:客户端主机IP地址浏览器

VIP:负载均衡主设备缓存

DIP:负载服务器的IPDIZHI

RIP:真实web服务器地址

LVS集群的工做模式-四种

  1. DR模式,用的最多的,direct  routing 直接路由模式
  2. NAT模式 , Network Address  Translation
  3. TUN,隧道模式, Tunneling
  4. FULL NAT模式,章教授到淘宝以后开发的 ,Full  Network Address  Translation

DR直接路由模式

DR模式是经过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。
DR技术可极大地提升集群系统的伸缩性。但要求调度器LB与真实服务器RS都有一块物理网卡连在同一物理网段上,即必须在同一局域网环境。

DR模式主要实现过程:

  1. LB修改Mac地址为RS的Mac地址
  2. RS的L0(本地网卡)绑定VIP地址
  3. RS抑制ARP解析
  4. RS将结果交给客户

  1.  经过在调度器LB上修改数据包的目的MAC地址实现转发。注意,源IP地址仍然是CIP,目的IP地址仍然是VIP。
  2. 请求的报文通过调度器,而RS响应处理后的报文无需通过调度器LB,所以,并发访问量大时使用效率很高,比Nginx代理模式强于此处。
  3. 因DR模式是经过MAC地址的改写机制实现转发的,所以,全部RS节点和调度器LB只能在同一个局域网中
  4. 须要注意RS节点的VIP的绑定(lo:vip/32)和ARP抑制问题
  5. 强调下:RS节点的默认网关不须要是调度器LB的DIP,而应该直接是IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的状况),理论上讲,只要RS能够出网便可,不须要必须配置外网IP,但走本身的网关,那网关就成为瓶颈了。
  6. 因为DR模式的调度器仅进行了目的MAC地址的改写,所以,调度器LB没法改变请求报文的目的端口。LVS DR模式的办公室在二层数据链路层(MAC),NAT模式则工做在三层网络层(IP)和四层传输层(端口)。
  7. 当前,调度器LB支持几乎全部UNIX、Linux系统,但不支持windows系统。真实服务器RS节点能够是windows系统。
  8. 总之,DR模式效率很高,可是配置也较麻烦。所以,访问量不是特别大的公司能够用haproxy/Nginx取代之。这符合运维的原则:简单、易用、高效。日1000-2000W PV或并发请求1万如下均可以考虑用haproxy/Nginx(LVS的NAT模式)
  9. 直接对外的访问业务,例如web服务作RS节点,RS最好用公网IP地址。若是不直接对外的业务,例如:MySQL,存储系统RS节点,最好只用内部IP地址。

 

 

 

3个问题-关于RealServer

1. RealServer为何要在lo接口上配置VIP?
答:既然要让RS可以处理目标地址为vip的IP包,首先必需要让RS能接收到这个包。在lo上配置vip可以完成接收包并将结果返回client。

2.在eth0网卡上配置VIP能够吗?
答:不能够,将VIP设置在eth0网卡上,会影响RS的arp请求,形成总体LVS集群arp缓存表紊乱,以致于整个负载均衡集群都不能正常工做。

3.为何要抑制ARP响应?
先回顾ARP知识及了解arp_announce和arp_ignore做用。

 

 

不抑制RS端arp前的广播状况图示

只有抑制了,才能只有LB去响应

NAT模式

收费站模式  ---  来去都要通过LB负载均衡器。

经过网络地址转换,调度器LB重写请求报文的目标地址,
根据预设的调度算法,将请求分派给后端的真实服务器,
真实服务器的响应报文处理以后,返回时必需要经过调度器,
通过调度器时报文的源地址被重写,再返回给客户,完成整个负载调度过程。

 


TUN-隧道模式

采用NAT技术时,
因为请求和响应的报文都必须通过调度器地址重写,当客户请求愈来愈多时,调度器的处理能力将成为瓶颈,
为了解决这个问题,调度器把请求的报文经过IP隧道(至关于ipip或ipsec )转发至真实服务器,
而真实服务器将响应处理后直接返回给客户端用户,这样调度器就只处理请求的入站报文。
因为通常网络服务应答数据比请求报文大不少,采用 VS/TUN技术后,集群系统的最大吞吐量能够提升10倍。
VS
/TUN工做流程,
它的链接调度和管理与VS/NAT中的同样,只是它的报文转发方法不一样。
调度器根据各个服务器的负载状况,链接数多少,动态地选择一台服务器,
将原请求的报文封装在另外一个 IP报文中,再将封装后的IP报文转发给选出的真实服务器;
真实服务器收到报文后,先将收到的报文解封得到原来目标地址为VIP地址的报文, 服务器发现VIP地址被配置在本地的IP隧道设备上(此处要人为配置),因此就处理这个请求,而后根据路由表将响应报文直接返回给客户。

 

FULLNAT模式

类比地铁站多个闸机。
LVS的DR和NAT模式要求RS和LVS在同一个vlan中,致使部署成本太高; TUNNEL模式虽然能够跨vlan,但RealServer上须要部署ipip隧道模块等,网络拓扑上须要连通外网,较复杂,不易运维。
为了解决上述问题,
开发出FULLNAT,该模式和NAT模式的区别是:数据包进入时,除了作DNAT,还作SNAT(用户ip
->内网ip),
从而实现LVS-RealServer间能够跨vlan通信,RealServer只须要链接到内网。

 

 

 

ARP网络知识

ARP协议,全程“Address  Resolution  Protocol”,中文名是地址解析协议,使用ARP协议可实现经过IP地址得到对应主机的物理地址(MAC地址)。

10.0.0.1 ------>ARP ------> 00:50:55:AV:c4:09

ARP是第三层协议,工做在第二层

一个比喻:

  快递员给学生送快递,最多就知道学校地址(IP),可是不知道学生在那个教室,坐在哪一个位置,班主任就是ARP歇息,告诉快递员具体的教室。

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

经过抓包软件WireShark看一下,抓包VM8网卡搜arp,回车

在Linux里面ping 10.0.0.5

查看抓包过程

删除缓存后,从新广播

 

为了提升IP转换MAC的效率,系统会将解析结果保存下来,这个结果叫作ARP缓存。

Windows查看ARP缓存命令   arp -a
Linux查看ARP缓存命令     arp -n
Linux解析IP对应的MAC地址 arping -c 1 -I eth0 10.0.0.6

 

ARP缓存表是把双刃剑

  1. 主机有了arp缓存表,能够加快ARP的解析速度,减小局域网内广播风暴。由于arp是发广播解析的,频繁的解析也是消耗带宽的,尤为是机器多的时候。
  2. 正是有了arp缓存表,给恶意黑客带来了攻击服务器主机的风险,这个就是arp欺骗攻击。有同窗恶做剧,假装班主任告诉快递员错误的教室编号。
  3. 切换路由器,负载均衡器等设备时,可能会致使短时网络中断。由于全部的客户端ARP缓存表没有更新。

服务器切换ARP的问题

当集群中一台提供服务的lb01机器宕机后,而后VIP会转移到备机lb02上,
可是客户端的ARP缓存表的地址解析仍是宕机的lb01的MAC地址。从而致使,即便在lb02上添加VIP,
也会发生客户端没法访问的状况。 解决办法是:当lb01宕机,VIP地址迁移到lb02时,
须要经过arping命令通知全部网络内机器更新本地的ARP缓存表,
从而使得客户机访问时从新广播获取MAC地址。
这个是本身开发服务器高可用脚本及全部高可用软件必须考虑到的问题。 ARP广播进行新的地址解析 arping
-I eth0 -c 1 -U VIP arping -I eth0 -c 1 -U 10.0.0.3

测试命令
ip addr del 10.0.0.13/24 dev eth0

ip addr add 10.0.0.13/24 dev eth0
ip addr show eth0
arping -I eth0 -c 1 -U 10.0.0.13
windows查看arp -a

 

arp_announce和arp_ignore详解

LVS在DR模式下须要关闭arp功能

arp_announce

对网络接口上,本地IP地址的发出的,ARP回应,做出相应级别的限制: 
肯定不一样程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址 1 - 尽可能避免不在该网络接口子网段的本地地址作出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候颇有用.
  此时会检查来访IP是否为全部接口上的子网段内ip之一.若是改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理. 2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通讯的本地地址.
  首要是选择全部的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址.
  若是没有合适的地址被发现,将选择当前的发送网络接口或其余的有可能接受到该ARP回应的网络接口来进行发送.

 

arp_ignore

定义对目标地址为本地IP的ARP询问不一样的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 2 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 3 - 不回应该网络界面的arp请求,而只对设置的惟一和链接地址作出回应 4-7 - 保留未使用 8 - 不回应全部(本地地址)的arp查询

 

LVS集群搭建-DR模式

环境准备

 

1.准备4台安装好CentOS7.4系统的虚拟机,内存512M。
2.全部虚拟机的防火墙和Selinux关闭
3.主机名及IP地址关系以下:
lb03    10.0.0.15   (将以前部署的keeplived和nginx关掉)
lb04    10.0.0.16   (将以前部署的keeplived和nginx关掉)
web03   10.0.0.17  
web04   10.0.0.18
4.web03和web04安装Tomcat软件,并知足下面条件:
curl http://10.0.0.17/页面底部获得结果为web03 10.0.0.17
curl http://10.0.0.18/页面底部获得结果为web04 10.0.0.18
5.安装好wireshark 2.2.2版本  2.2.x版本以上便可

 

 

安装ipvsadm(只在lb03)

# 查看系统的LVS模块。
lsmod|grep ip_vs

# 默认没有加载模块,须要安装管理工具才会激活。
yum -y install ipvsadm  keeplivaed -y

# 查看当前LVS状态,顺便激活LVS内核模块。
ipvsadm

[root@lb01 ~]# lsmod|grep ip_vs
ip_vs                 141092  0 
nf_conntrack          111302  1 ip_vs
libcrc32c              12644  2 xfs,ip_vs

 

 

配置LVS负载均衡服务+ipvsadm(只作lb03)

步骤1:在eth0网卡绑定VIP地址(ip)
步骤2:清除当前全部LVS规则(-C)
步骤3:设置tcp、tcpfin、udp连接超时时间(--set)
步骤4:添加虚拟服务(-A),调度算法见man ipvsadm
步骤5:将虚拟服务关联到真实服务RS上(-a)
步骤6:查看配置结果(-ln)
ip addr add 10.0.0.13/24 dev eth0 label eth0:1
ipvsadm -C                    
ipvsadm --set 30 5 60         
ipvsadm -A -t 10.0.0.13:80 -s wrr -p 20     wrr是加权轮询,-p是会话保持时间,至关于建立了一个池塘
ipvsadm -a -t 10.0.0.13:80 -r 10.0.0.17:80 -g -w 1 
ipvsadm -a -t 10.0.0.13:80 -r 10.0.0.18:80 -g -w 1 
ipvsadm -ln  
  -g 表示DR模式,默认的

 

已配置好,能够转发了,能够做MAC地址的转换了

Web服务器配置(web0三、web04同时操做)

步骤1:在lo网卡绑定VIP地址(ip)
步骤2:修改内核参数抑制ARP响应
ip addr add 10.0.0.13/32 dev lo

cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p

 

可使用了!

使用浏览器访问http://10.0.0.13/,同时使用wireshark抓取数据包http
不要在lb03本地访问测试!能够在lb04测试(未加入LVS“团伙”)

LVS不像nginx那样1:1很强烈的规律,只有访问频率很高的时候,近似的1:1

 

将配置永久保存

添加的内核参数,是永久的

可是添加的规则是临时的,即ipvsadm -ln 的规则(稍后用keepalived好一些)

咱们添加的VIP,lo网卡上绑定的IP是临时的

解决:

一、复制lo网卡的配置文件为ifcfg-lo:1
2、修改配置,名字、IP、子网掩码,以下,而后保存
3、重启网卡
[root@web03 ~]# cd /etc/sysconfig/network-scripts/
[root@web03 network-scripts]# cp ifcfg-lo ifcfg-lo:1
[root@web03 network-scripts]# vim ifcfg-lo:1
DEVICE=lo:1
IPADDR=10.0.0.13
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
NETMASK=255.255.255.255
ONBOOT=yes
NAME=lo:1

[root@web03 network-scripts]# systemctl restart network.service 

 

 

三个问题

问题1:浏览器访问没有发现轮询效果
答:LVS的轮询不像Nginx明显,可使用多个客户端访问(Windows和Linux)
问题2:使用抓包工具,发现进行通讯的是windows的IP和lb03的80端口,可是lb03明明没有80端口? 答:Windows抓包查看,能够发现数据包的源MAC地址是web01或web02 Linux:tcpdump
-nn port 80; tcpdump -nn -e port 80

问题3:客户端的操做有什么含义?

 

 

配置LVS负载均衡+keepalied(高可用)

接下来的实验又是一个新的开始,配置负载均衡不须要ipvsadm这个工具,由于keepalived原本就是另一个自动管理工具。

安装keepalive

步骤1:在lb03和lb04安装Keepalive
  yum -y install keepalived

步骤2:配置Keepalive, lb03和lb04的配置文件分红三部分配置(man keepalived.conf)
  1.global_defs   ------>全局定义 
  2.vrrp 实例配置  ------>VIP
  3.virtual_server配置  --->lvs的配置

 

 

第一部分-全局定义

###########lb03###########  至关于
global_defs {
   router_id LVS_03
}

###########lb04###########
global_defs {
   router_id LVS_04
}

router_id 每个keeplive的配置都有的独一无二的,至关于身份证号
 

 

 

第二部分-VIP配置

###########lb03###########
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 {     # VIP
     10.0.0.13/24
    }
}


###########lb04###########
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 {
     10.0.0.13/24
    }
}

 

 

第三部分-lvs配置,管理和配置lvs

这部分两台负载同样。根据配置文件对比前面学过的ipvsadm命令

virtual_server  10.0.0.13  80 {   # 至关于 ipvsadm -A -t 10.0.0.13:80 
    delay_loop  6             # 循环次数
    lb_algo  wrr              # 轮询的模式
    lb_bind  DR               # 模式
    nat_mask  255.255.255.0
    persistence_timeout  50   # 会话保持的时间  也是-A中的
    protocol  TCP

    real_server  10.0.0.17  80 {    # 至关于ipvs  -a
        weight 1
        TCP_CHECK {             # 端口的检测,如端口挂掉怎么作,还有其余如HTTP_CHECK等
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port  80
        }
    }

    real_server  10.0.0.18  80 {
        weight 1
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port  80
        }
    } 

 

 

那么主备有什么区别呢?推荐使用beyongdCompare软件对比

  1. router_id   路由名称不同
  2. state         主备标志不同
  3. priority      表示主备的权重值不同

vim /etc/keepalived/keepalived.conf  修改配置文件

重启两台主机的keepalived 服务

先检查lb03的vip,ipvsadm -ln是否还在,清除掉。
ipvsadm -ln
ipvsadm -C /etc/init.d/keepalived restart
ipvsadm -ln 检查 配置规则,又从新有了
# Centos7的操做 systemctl start keepalived.service systemctl status keepalived.service ip addr show eth0 ipvsadm
-ln 能够测试keepalive高可用,故障转移(包含VIP及LVS配置)。

测试keepalive的高可用功能

关闭lb01的keepalived服务,而后查看lb02的ip,检查VIP

 

测试Keepalive的健康检查功能

关闭web03

 

做业:部署NAT模式

部署NAT模式

 

常见的LVS负载均衡高可用解决方案

  1. 开发相似keepalived的脚本,早期的办法,如今不推荐使用。
  2. heartbeat+lvs+ldirectord脚本配置方案,复杂不易控制,不推荐使用
  3. RedHat工具piranha,一个web界面配置LVS。
  4. LVS-DR+keepalived方案,老师推荐最优方案,简单、易用、高效。

LVS故障排除

 

做业

完成Keepalived多实例

相关文章
相关标签/搜索