第四十二节、LVS负载均衡服务

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集
目前主流的负载均衡服务有以下三种:LVS、Haproxy、Nginx
LVS基于4层网络层效率较高
Haproxy基于7层应用层,都适用于高并发网站,对机器要求高

特点
  • 可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)
  • 在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术
工作原理
  • 用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接受到请求,返回给用户。-
    对于用户来说,看不到WEB后端具体的应用
  • LVS转发方式有三种,分别是NAT、DR、TUN模式,常用算法:RR(round-robin)、LC(least_connection)、W(weight)RR、WLC模式等(RR为轮询模式,LC为最少连接模式,WRR为权重模式)
    NAT修改数据包的IP,DR修改MAC,TUN也是修改MAC但多列一层隧道加密
  • LVS NAT原理:用户请求LVS到达director,director将请求的报文的目标地址改成后端的realserver地址,同时将报文的目标端口也改成后端选定的realserver相应端口,最后将报文发送到realserver,realserver将数据返给director,director再把数据发送给用户。(两次请求都经过director,所以访问大的话,director会成为瓶颈),realserver上需要配置网关,网关地址就是LVS的VIP
  • LVS DR原理:用户请求LVS到达director,director将请求的报文的目标MAC地址改成后端的realserver MAC地址,目标IP为VIP(不变),源IP为用户IP地址(保持不变),然后Director将报文发送到realserver,realserver检测到目标为自己本地IP,如果在同一个网段,然后将请求直接返给用户。如果用户跟realserver不在一个网段,则通过网关返回用户。(此种转发效率最高),realserver和LVS上配置相同的VIP地址,但是realserver上会限制ARP响应,防止realserver直接向用户提供服务,而是只接收LVS转发的请求提供服务.
  • LVS TUN原理:跟LVS DR类似,也是改变封装MAC地址,多了一层隧道加密。实施环境复杂,比LVS DR模式效率略低。
服务安装

LVS技术是基于ip_vs内核模块(ip虚拟技术),需要先安装软件包ipvsadm-1.2.4.tar.gz,注意软件版本和内核版本的对应关系,内核2.6对应ipvs1.24版本

#查看系统内核版本是2.6.32
[root@localhost src]# uname -a
Linux localhost.localdomain 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
#下载ipvsadm-1.2.4
[root@localhost src]# wget -c http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
--2018-01-07 14:10:33--  http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
正在解析主机 www.linuxvirtualserver.org... 173.255.202.51, 2600:3c00::f03c:91ff:fe96:fcc2
正在连接 www.linuxvirtualserver.org|173.255.202.51|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:36598 (36K) [application/x-gzip]
正在保存至: “ipvsadm-1.24.tar.gz”
100%[=======================================================================>] 36,598      23.4K/s   in 1.5s    
2018-01-07 14:10:36 (23.4 KB/s) - 已保存 “ipvsadm-1.24.tar.gz” [36598/36598])
#解压源码包后切换到解压目录
[root@localhost src]# tar zxvf ipvsadm-1.24.tar.gz
[root@localhost src]# cd ipvsadm-1.24
[root@localhost ipvsadm-1.24]# ls
config_stream.c  debian           ipvsadm.8        ipvsadm-restore.8  ipvsadm.sh       libipvs   SCHEDULERS
config_stream.h  dynamic_array.c  ipvsadm.c        ipvsadm-save       ipvsadm.spec     Makefile  TAGS
contrib          dynamic_array.h  ipvsadm-restore  ipvsadm-save.8     ipvsadm.spec.in  README    VERSION

ipvsadmin软件包需要先做好软链接编译进内核然后直接进入解压目录安装

#做软链接
[root@localhost src]# ln -s /usr/src/kernels/2.6.32-431.el6.x86_64/  /usr/src/linux
[root@localhost src]# ll
总用量 10052
drwxr-xr-x. 2 root root    4096 9月  23 2011 debug
drwxr-xr-x  5 root root    4096 1月   7 14:15 ipvsadm-1.24
-rw-r--r--  1 root root   36598 12月 11 2005 ipvsadm-1.24.tar.gz
drwxr-xr-x. 3 root root    4096 12月 16 20:10 kernels
lrwxrwxrwx  1 root root      39 1月   7 14:18 linux -> /usr/src/kernels/2.6.32-431.el6.x86_64/
#进入ipvsadmin解压目录后安装
[root@localhost src]# cd ipvsadm-1.24
[root@localhost ipvsadm-1.24]# make 
[root@localhost ipvsadm-1.24]# make install

查看安装是否成功ipvasdm

[root@localhost ipvsadm-1.24]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)   #显示ipvs版本信息及转发表的大小
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
ipvs服务配置通过命令直接配置
  • A 增加一台虚拟服务器地址
  • t 虚拟服务器提供的是tcp服务
  • s 使用的调度算法
  • a 在虚拟服务器中增加一台后端真实服务器
  • r 指定真实服务器地址
    -m 设置当前转发方式为NAT模式;-g为直接路由模式;-i 为隧道模式
  • w 后端真实服务器的权重
    配置的步骤有两步,第一步为定义端口服务,第二步为添加realserver后端服务
#添加虚拟的VIP192.168.15.202,端口80,调度算法rr轮询
[root@localhost ~]# ipvsadm -A -t 192.168.15.202:80 -s rr
#添加后端服务器realserver192.168.15.172,直接路由模式,权重2
[root@localhost ~]# ipvsadm -a -t 192.168.15.202:80 -r 192.168.15.172 -g -w 2
#查看参数打印列表Ln
[root@localhost ~]# ipvsadm -Ln   
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.15.202:80 rr
  -> 192.168.15.172:80            Local   2      0          0   
  -> 192.168.15.173:80            Local   2      0          0   
#使用文件定向符保存ipvs配置
[root@localhost ~]# ipvsadm-save >/tmp/ipvs.txt
#加载恢复ipvs配置
[root@localhost ~]# ipvsadm-restore 
在realserver后端真实服务器上配置VIP
#将VIP绑定到loopback本地回还地址上不会和其他网卡冲突
[root@localhost ~]# VIP=192.168.15.202
[root@localhost ~]# ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
[root@localhost ~]# ifconfig
lo:0      Link encap:Local Loopback  
          inet addr:192.168.15.202  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
#添加网关地址
[root@localhost ~]# /sbin/route add -host $VIP dev lo:0
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.15.202  0.0.0.0         255.255.255.255 UH    0      0        0 lo
192.168.15.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.15.1    0.0.0.0         UG    0      0        0 eth0
realserver不仅仅要绑定VIP,还要通过以下脚本抑止自己的arp响应
[root@localhost ~]#  vim auto_realserver.sh
#!/bin/sh
#LVS Client Server
VIP=192.168.15.202                       #定义VIP
case  $1  in                                                                                                                                                                                                                                                           
start)                                                                                                                                                                                                                                            
    ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP   #lo:0绑定vip
    /sbin/route add -host $VIP dev lo:0                                            #添加网关地址
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore         #下面4句就是抑止arp响应的语句
    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
    sysctl -p >/dev/null 2>&1                                            #使上述配置生效
    echo "RealServer Start OK"
    exit 0
;;                                                                                                                                                                                                                                         
stop)
    ifconfig lo:0 down      
    route del $VIP >/dev/null 2>&1                                   #删除路由信息
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore          #恢复arp响应
    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 "RealServer Stoped OK"
    exit 1
;;
*)
    echo "Usage: $0 {start|stop}"
;;
esac
#授予执行权限并启动脚本
[root@localhost ~]#  chmod 0+x auto_realserver.sh
[root@localhost ~]#  sh  auto_realserver.sh  start
RealServer Start OK
LVS服务器故障排查思路
  • 1、ping网站的域名www.jfedu.net,能解析到IP,证明域名服务器没问题,nslookup、ping、dig
  • 2、登录LVS服务器,查看ipvsadm -Ln信息以及日志信息tail -fn 100 /var/log/messages,看客户端realserver的80端口是否启动
  • 3、看zabbix监控服务器,有无异常报警
  • 4、看keepalived.conf配置文件是否错误,进程
  • 5、看客户端的auto_realserver.sh脚本VIP是否启动
  • 6、使用tcpdump -nn port80 and host XXXXip抓包
LVS和keepalived综合运用

所有操作都直接定义在keepalived的配置文件中即可

[root@localhost ~]# vim /etc/keepalived/keepalived.conf    
#######global conf####  全局配置定义发送接受的邮箱及路由信息等保持不变
! Configuration File for keepalived
global_defs {
   notification_email {
      [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
######## VIP1  VRRP CONF  第一个VRRP实例作为LVS的MASTER该部分也不变化
vrrp_instance VI_1 {
    state MASTER
    interface eth0                                #通信端口
    lvs_sync_daemon_inteface eth0  #lvs通信端口类似心跳线功能
    virtual_router_id 151                     #路由ID
    priority 100                                    #优先级   
    advert_int 5                                   #发送广播时间间隔
    nopreempt                                     #设置为不抢占
    authentication {
        auth_type PASS
        auth_pass 2222
    }
    virtual_ipaddress {
        192.168.15.201                         #定义LVS的虚拟VIP
    }
}
############虚拟服务器配置部分增加LVS配置代码
virtual_server 192.168.15.201 80{
    delay_loop 6                    #健康检查时间间隔
    lb_algo wrr                       #LVS算法权重轮询模式
    lb_kind DR                       #LVS转发方式为直接路由DR还可以是NAT/TUN
    persistence_timeout 60   #60秒内会话保持在后端同一台服务器
    protocol TCP                    #v转发协议tcp
    real_server 192.168.15.172 80 {    #这里的realserver是后端的服务器1
        weight 100
        notify_down /data/sh/mysql.sh
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
 real_server 192.168.15.173 80 {      #这里的realserver是后端的服务器2
        weight 100
        notify_down /data/sh/mysql.sh
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}
  • LVS及后端的realserver上都配置VIP,而realserver上配置脚本抑止arp响应是为了当路由器广播时只有LVS主机响应,而LVS接到数据包后修改完目的MAC地址后能把数据包直接转发到后端服务器
  • 虚拟VIP绑定到本地回环地址lo上是为了防止虚拟的VIP在交换机端口上产生MAC地址表,而且lo上可绑定多个虚拟VIP
[root@localhost ~]# VIP=XXXX.XXXX.XXXX.XXXX
 [root@localhost ~]# ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP

你可能感兴趣的:(第四十二节、LVS负载均衡服务)