Iawen's Blog

我喜欢这样自由的随手涂鸦, 因为我喜欢风......

LVS是Linux Virtual Server的简写, 意即Linux虚拟服务器, 是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立, 是中国国内最早出现的自由软件项目之一。在linux内存2.6中, 它已经成为内核的一部分, 在此之前的内核版本则需要重新编译内核。

LVS主要用于多服务器的负载均衡。它工作在网络层, 可以实现高性能, 高可用的服务器集群技术。

  • 它廉价, 可把许多低性能的服务器组合在一起形成一个超级服务器。
  • 它易用, 配置非常简单, 且有多种负载均衡的方法。它稳定可靠, 即使在集群的服务器中某台服务器无法正常工作, 也不影响整体效果。
  • 另外可扩展性也非常好。

因为lvs工作在网络层, 所以相对于其他的负载均衡的解决办法(DNS域名轮流解析、应用层负载的调度、客户端的调度等, 它的效率是非常高的) LVS的通过控制IP来实现负载均衡。IPVS是其具体的实现模块。 0 1

1. 环境检查

cat /etc/redhat-release 
uname -r
getenforce 
systemctl status firewalld.service 
hostname -I

2. 安装ipvsadm管理工具

lsmod |grep ip_vs       #检测是否安装
#下载RPM软件包 http://www.linuxvirtualserver.org/
yum -y install ipvsadm  #安装ipvsadm
ipvsadm                 #检查并激活lvs 

注:

  • 只有执行 ipvsadm 以后, 才会在内核加载 ip_vs 模块
  • LVS 是 Linux Virtual Server 的缩写, 意思是 Linux 虚拟服务器。目前有三种 IP 负 载均衡技术( VS/NAT 、 VS/TUN 和 VS/DR );
  • 八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh )。

3. 安装keepalived并设置节点

官方网站: http://www.keepalived.org/ 准备:

  • 节点A: IP 192.168.137.3 Linux 主机
  • 节点B: IP 192.168.137.4 Linux 主机
  • 虚拟IP 192.168.137.220
  • 修改配置文件: /etc/keepalived/keepalived.conf

Keepalived 配置可以分为三类:

3.1 全局配置(Global Configuration)

以 global_defs 作为标识:

标识 说明
notification_email 报警邮件地址
notification_email_from 邮件的发送地址
smtp_server SMTP 服务器地址
smtp_connect_timeout
router_id

3.2 VRRPD 配置

VRRPD 配置又可以分为 VRRP同步组配置和 VRRP 实例配置

3.2.1 VRRP同步组: vrrp_sync_group GXXX {}

标识 说明
group
notify_backup
notify_master 指定当Keepalived进入Master状态是要执行的脚本
notify_fault
notify_stop

3.2.2 VRRP 实例配置: vrrp_instance VXXXX {}

主要用来配置节点角色(主或从), 实例绑定的网络接口, 节点验证机制, 集群服务IP等。

state MASTER / BACKUP
interface 网络接口
virtual_router_id 虚拟路由标识, 数字, MASTER 和 BACKUP 必须一致
priority MASTER 必须大于 BACKUP
advert_int 同步检查的时间间隔, 秒
mcast_src_ip 发送多播包的地址
garp_master_delay
track_interface 额外的网络监控接口
authentication 通讯验证类型和密码
virtual_ipaddress VIP, 即漂移IP 地址
virtual_routes
nopreempt 不抢占功能, 只能在BACKUP上设置
preemtp_delay

3.3 LVS 配置

以 virtual_server {} 作为标识

标识 说明
delay_loop 健康检查的时间间隔, 秒
lb_algo 负载调度算法, 有: rr, wrr, lc, wlc, lblc, sh, dh 等
lb_kind 负载均衡机制, 有NAT, TUN 和 DR 三个模式
persistence_timeout 会话保持时间
persistence_granularity
protocol TCP / UDP
ha_suspend 节点切换时, 暂不启用 real server 节点的健康检查
virtualhost
sorry_server 备用节点
real_server {} weight: 权重
inhibit_on_failure: 失效时, 设weight 为 0
notify_up
notify_down
健康检测方式:
HTTP_GET, SSL_GET, TCP_CHECK, SMPT_CHECK, MISC_CHECK
! Configuration File for keepalived  
  
global_defs {    
   notification_email {    
     root@localhost    
   }    
   notification_email_from root@localhost    
   smtp_server localhost    
   smtp_connect_timeout 30    
   router_id  NodeA    
}   

vrrp_instance VI_1 {  
    state MASTER  
    interface eno16777736  
    virtual_router_id 51  
    priority 100  
    advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {  
        192.168.1.220  
    }  
}  
  
virtual_server 192.168.1.220 8080 {   
   delay_loop 6                    
   lb_algo rr                       
   lb_kind DR                       
   nat_mask 255.255.255.0             
   persistence_timeout 0             
   protocol TCP                      
   real_server 192.168.137.3 80 {     
       weight 1                        
        HTTP_GET {  
            url {   
              path /index.php  
              digest d654f21f87b7e6900b887f07c19e73fe  
            }  
            connect_timeout 3  
            nb_get_retry 3  
            delay_before_retry 3  
        }         
   }  
   real_server 192.168.137.4 80 {      
       weight 11  
        HTTP_GET {  
            url {   
              path /index.php  
              digest 625eddd79c61cf84c71c0c17448f8093  
            }  
            connect_timeout 3  
            nb_get_retry 3  
            delay_before_retry 3  
        }          
   }  
}

按同样的方法配置节点B并修改配置文件, 可将A节点的配置文件复制到B节点, 并修改以下几项:

router_id  NodeB
state   BACKUP
priority   99

其它项不必修改。

其中计算digest : genhash -s 192.168.137.4 -p 80 -u /index.php

然后启动: keepalived -D

将keepalived做成启动服务, 方便管理:

cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
service keepalived restart

4. 开启路由转发

vi /etc/sysctl.conf 
net.ipv4.ip_forward = 1
net.ipv4.conf.lo.arp_ignore = 0
net.ipv4.conf.lo.arp_announce = 0
net.ipv4.conf.all.arp_ignore = 0
net.ipv4.conf.all.arp_announce = 0​

刷新系统变量,使系统文件变更马上生效

sysctl –p
echo 1> /proc/sys/net/ipv4/ip_forward

5. 配置LVS负载均衡

ip addr add 192.168.137.220/24 dev eth0 #在eth0网卡绑定VIP地址
ipvsadm -C #清除当前所有LVS规则 
ipvsadm --set 30 5 60 #设置tcp、tcpfin、udp链接超时时间 
ipvsadm -A -t 192.168.137.220:8080 -s rr -p 20 #添加虚拟服务(-A)
ipvsadm -a -t 192.168.137.220:8080 -r 192.168.137.3:80 -g -w 1 #将虚拟服务关联到真实服务上(-a)
ipvsadm -a -t 192.168.137.220:8080 -r 192.168.137.4:80 -g -w 1 #将虚拟服务关联到真实服务上(-a)
ipvsadm -ln #查看配置结果
-C 清空整个表 
-A 添加一个虚拟服务 
-t 指定一个地址, 一定是ip+端口 
-s 调度算法 
-a 添加一个real server 
-m NAT模式 
-g DR模式, 默认 
-d 删除一个real server 
-p 会话保持功能 
-w 权重 
-i tunnel模式

6. 配置真实服务器

说明: 一般真实互联网应用都配置为lb_kind = dr 模式, 因为这种模式效率是最高的, 缺点就是配置稍微复杂一点, 需要配置客户端。 DR模式原理请参考: http://atong.blog.51cto.com/2393905/1348602

简单说一下: 假设A为前端负载均衡服务器, B,C为后端真实服务器。 A接收到数据包以后, 会把数据包的MAC地址改成B的(根据调度算法, 假设发给B服务器), 然后把数据包重新发出去, 交换机收到数据包根据MAC地址找到B, 把数据包交给B。 这时B会收到数据包, 同时验证请求IP地址, 由于数据包里的IP地址是给A的, 所以正常情况下B会丢弃数据包, 为了防止这种情况, 需要在B机器的回环网卡上配置A的IP地址。并设置ARP压制。

在真实服务器上运行脚本文件, 为lo:0绑定VIP地址、抑制ARP广播:

#!/bin/bash    
#description : start real server  
VIP=192.168.137.220  
/etc/rc.d/init.d/functions  
case "$1" in  
    start)  
        echo " start LVS of REAL Server"  
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        # /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
        ;;  
    stop)  
        /sbin/ifconfig lo:0 down  
        echo "close LVS Directorserver"  
        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 "Usage: $0 {start|stop}"  
        exit 1  
esac

需要对脚本授权: chmod +x lvs_real.sh 运行脚本: ./lvs_real.sh

输入ifconfig查看虚拟IP是否已经绑定到回环网卡(测试的时候最好先关闭防火墙) 如果想知道当前测试机的访问请求被转发到那个服务器去了, 可以在 ipvsadm 命令后带一个选项, 其完整形式为:

ipvsadm –lcn | grep 159.226.240.63 #你的IP

7. 其它健康检查方式

7.1 TCP方式检查

virtual_server 192.168.137.220 8080 {   
   delay_loop 6                    
   lb_algo rr                       
   lb_kind DR                       
   nat_mask 255.255.255.0             
   persistence_timeout 0             
   protocol TCP                      
   real_server 192.168.137.3 80 {     
       weight 1                        
      TCP_CHECK {  
        connect_port    80  
        connect_timeout 5  
      }        
   }  
   real_server 192.168.137.4 80 {      
       weight 1  
      TCP_CHECK {  
        connect_port    80  
        connect_timeout 5  
      }        
   }  
}

7.2 其它方式请参考keepalived提供的配置文件

参考: http://www.linuxvirtualserver.org/ http://www.keepalived.org/