首页 Linux正文

LVS+Keepalived 负载均衡

王昊 Linux 2019-12-23 281 0

LVS 是 Linux Virtual Server 的简写,意即 Linux 虚拟服务器,是一个虚拟的服务器集群系统

LVS 简单工作原理:用户请求 LVS VIP,LVS 根据转发方式和算法,将请求转发给后端服务器,后端服务器接受到请求,返回给用户。对于用户来说,看不到 WEB 后端具体的应用。

LVS 转发方式有三种,分别是 NAT、DR、TUN 模式,常用算法:RR、LC、WRR、WLC 模式等(RR 为轮询模式,LC 为最少连接模式)

LVS NAT 原理:用户请求 LVS 到达 director,director 将请求的报文的目标地址改成后端的 realserver 地址,同时将报文的目标端口也改成后端选定的 realserver相应端口,最后将报文发送到 realserver,realserver 将数据返给 director,director再把数据发送给用户。(两次请求都经过 director,所以访问大的话,director 会成为瓶颈)

LVS DR 原理:用户请求 LVS 到达 director,director 将请求的报文的目标 MAC地址改成后端的 realserver MAC 地址,目标 IP 为 VIP(不变), 源 IP 为用户 IP 地址(保持不变),然后 Director 将报文发送到 realserver,realserver检测到目标为自己本地 IP,如果在同一个网段,然后将请求直接返给用户。如果用户跟 realserver 不在一个网段,则通过网关返回用户。(此种转发效率最高)

LVS TUN 原理:跟 LVS DR 类似,也是改变封装 MAC 地址,多了一层隧道加密。实施环境复杂,比 LVS DR 模式效率略低。

LVS MASTER:192.168.17.195
LVS BACKUP:192.168.17.197
VIP:192.168.17.188
客户机1:192.168.17.198
客户机2:192.168.17.199

LVS MASTER服务器安装配置

cd /usr/local/

wget http://linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

yum -y install gcc libnl* popt*

tar xzvf ipvsadm-1.26.tar.gz

cd ipvsadm-1.26

make && make install

ipvsadm -version

ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)

LVS 安装完毕之后,需要进行配置,配置的步骤有两步,第一步为定义端口服务,第二步为添加 realserver 后端服务。

ipvsadm -A -t 192.168.17.188:80 -s rr

ipvsadm -a -t 192.168.17.188:80 -r 192.168.17.198 -g -w 2

ipvsadm -a -t 192.168.17.188:80 -r 192.168.17.199 -g -w 2

参数说明:

-A 增加一台虚拟服务器地址。 
-t  虚拟服务器提供的是 tcp 服务。 
-s  使用的调度算法。 
-a  在虚拟服务器中增加一台后端真实服务器。 
-r  指定真实服务器地址。 
-g 设置当前转发方式为直接路由模式 ;-m 为NAT模式;-i 为隧道模式。 
-w 后端真实服务器的权重。 

查看 LVS 转发列表

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.17.188:80 rr
  -> 192.168.17.198:80            Route   2      0          0         
  -> 192.168.17.199:80            Route   2      0          0         

清除表中所有的记录

ipvsadm -C

如果这台 LVS 发生突发情况,down 机了,那后端所有的应用程序都访问不了。为了避免这种问题,就要使用到keepalived来做故障检测

如果使用了 keepalived.conf 配置,就不需要再执行 ipvs –A命令去添加均衡的 realserver 命令了,所有的配置都会在 keepalived.conf 里面,一个配置文件搞定所有,即只需要安装 ipvs 模块

Keepalived的安装配置

cd /usr/local/

wget http://www.keepalived.org/software/keepalived-2.0.8.tar.gz

tar zxvf keepalived-2.0.8.tar.gz

cd keepalived-2.0.8/

yum -y install openssl-devel libnl-devel libnl3-devel libnfnetlink-devel

yum -y groupinstall “Development Tools”

./configure –prefix=/usr/local/keepalived

make && make install

cp /usr/local/keepalived/bin/* /bin/

cp /usr/local/keepalived/sbin/* /sbin/

cp -rf /usr/local/keepalived/etc/keepalived/ /etc/

cp /usr/local/keepalived/etc/sysconfig/* /etc/sysconfig/

修改keepalived的配置文件

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
      whaoub@163.com
   }
   notification_email_from whaoub@163.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

# VIP1
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    lvs_sync_daemon_inteface eth0
    virtual_router_id 51
    priority 100
    advert_int 5
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.17.188
    }
}

virtual_server 192.168.17.188 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 60
    protocol TCP

#REAL_SERVER_1
    real_server 192.168.17.198 80 {
        weight 100         
        TCP_CHECK {        
        connect_timeout 10 
        nb_get_retry 3  
        delay_before_retry 3
        connect_port 80 
        } 
    }   

#REAL_SERVER_2
    real_server 192.168.17.199 80 {
        weight 100 
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3  
        delay_before_retry 3
        connect_port 80 

        }
    }     
}

重启keepalived

service keepalived restart

LVS BACKUP服务器上同样安装LVS+keepalived,这里就不写重复步骤了

要注意修改优先级及状态

修改keepalived的配置文件

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
      whaoub@163.com
   }
   notification_email_from whaoub@163.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

# VIP1
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    lvs_sync_daemon_inteface eth0
    virtual_router_id 51
    priority 90
    advert_int 5
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.17.188
    }
}

virtual_server 192.168.17.188 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 60
    protocol TCP

#REAL_SERVER_1
    real_server 192.168.17.198 80 {
        weight 100         
        TCP_CHECK {        
        connect_timeout 10 
        nb_get_retry 3  
        delay_before_retry 3
        connect_port 80 
        } 
    }   

#REAL_SERVER_2
    real_server 192.168.17.199 80 {
        weight 100 
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3  
        delay_before_retry 3
        connect_port 80 

        }
    }   
}

service keepalived restart

通过日志判断是否有错误

tail -fn 100 /var/log/messages

此时查看日志发现tcp:80端口连接失败,是由于80端口未开启

TCP connection to [192.168.17.198]:tcp:80 failed.
Check on service [192.168.17.199]:tcp:80 failed after 1 retries.
Removing service [192.168.17.199]:tcp:80 to VS [192.168.17.188]:tcp:80
Remote SMTP server [127.0.0.1]:25 connected.
...
TCP connection to [192.168.17.199]:tcp:80 failed.
...

在两台客户机搭建LAMP的测试环境

安装并开启httpd后日志中显示

TCP connection to [192.168.17.199]:tcp:80 success.
Adding service [192.168.17.199]:tcp:80 to VS [192.168.17.188]:tcp:80
Gained quorum 1+0=1 <= 100 for VS [192.168.17.188]:tcp:80
Remote SMTP server [127.0.0.1]:25 connected.
SMTP alert successfully sent.
TCP connection to [192.168.17.198]:tcp:80 success.
Adding service [192.168.17.198]:tcp:80 to VS [192.168.17.188]:tcp:80
Remote SMTP server [127.0.0.1]:25 connected.
SMTP alert successfully sent.

80端口的连接问题已解决

LVS MASTER

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.17.188:80 wrr persistent 60
  -> 192.168.17.198:80            Route   100    0          0         
  -> 192.168.17.199:80            Route   100    0          0 

LVS 主备配置完毕,接下来需要在 realserver 配置 LVS VIP

为什么要在 realserver 绑定 VIP 呢?

客户端访问 director 的 VIP,director 接收请求,将通过相应的算法将请求转发给相应的 realserver。在转发的过程中,会修改请求包的目的 mac 地址,目的 ip地址不变。

Realserver 接收请求,并直接响应客户端。这时便出现一个问题,director 此时与 realserver 位于同一个网络中,当 director 直接将请求转发给 realserver 时,realserver 检测到该请求包的目的 ip 是 vip 而并非自己,便会丢弃,而不会响应。为了解决这个问题,所以需要在所有 Realserver 上都配上 VIP

为什么一定要配置在 lo 接口上呢?

在 realserver 上的 lo 口配置 VIP,这样限制了 VIP 不会在物理交换机上产生 MAC地址表,从而避免 IP 冲突。

两台客户端分别配置脚本

mkdir -p /data/sh

cd /data/sh/

vim realserver.sh

#!/bin/sh 
#LVS Client Server 
VIP=192.168.17.188
case  $1  in
start)
    ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
    /sbin/route add -host $VIP dev lo:0
    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
    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
    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

chmod o+x realserver.sh

sh realserver.sh start

RealServer Start OK

ifconfig

lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.17.188  netmask 255.255.255.255
        loop  txqueuelen 0  (Local Loopback)

VIP已绑定

浏览器访问VIP地址,即可访问到论坛的web界面

LVS MASTER

watch ipvsadm -Ln

实时显示转发

Every 2.0s: ipvsadm -Ln                                                                                                Tue Jul 23 03:58:51 2019

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.17.188:80 wlc persistent 60
  -> 192.168.17.198:80            Route   100    0          0
  -> 192.168.17.199:80            Route   100    2          2

LVS 网站故障排查经验

1)如果发现主网站无法访问,首先第一步 ping 网站域名是否能 ping 通,如果域名无法访问,试着使用 IP 能不能访问,如果 IP 能访问,首先排查到域名解析问题。

2)如果 IP 也无法访问,登录 LVS 服务器,使用命令 ipvsadm –Ln 查看当前连接状态和查看/var/log/messages 日志信息,可以在 LVS 上访问 realserver ip,进行排查。

3)如果 LVS 服务正常,后端 realserver 服务异常,然后查看 nginx 日志信息,是否有大量恶意访问,临时重启看是否能访问。 如果有恶意 ip 访问,找出恶意 ip,经确认可以关闭后,使用 iptables 防火墙临时关闭即可。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论