负载均衡之LVS+Keepalived部署

LVS+keepalived

Posted by     BY   杨晓明 on September 8, 2017

一、LVS简介

1.什么是LVS?

本文主要着眼于部署,关于原理可阅读这里:LVS项目介绍

2.LVS的工作模式

1).通过直接路由实现虚拟服务器(VS/DR)

本质上LVS服务器是在数据链锯层改变了目标IP的mac地址。 此外需要在RS服务器上绑定和LVS服务器上一样的虚拟IP(VIP),和进行ARP抑制。(关于ARP协议请阅读:ARP协议-维基百科) 此模式只有请求数据包会通过LVS服务器,而响应数据包直接从RS服务器发给client,所以性能是最优秀的。 本文主要介绍此模式的架构部署。

2).通过NAT实现虚拟服务器(VS/NAT)

本质上LVS服务器是在网络层改变了目标IP。 数据包来回都需要通过LVS负载均衡服务器,而这又会使得LVS服务器成为影响网站性能的新瓶颈。 此模式可承受的RS服务器大约20~30台。 本文对此模式不做部署介绍。(后续补充)

3).通过IP隧道实现虚拟服务器(VS/TUN)

关于此模式笔者也还在学习…… 这里提供一些资料:

二、部署LVS-DR模式负载均衡+高可用

1.基础环境(所有服务器)

  • 基础软件准备
    yum -y install wget vim bash-completion lrzsz nmap telnet tree net-tools bind-utils
    
  • yum源
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    
  • 关闭防火墙
    systemctl disable  firewalld 
    systemctl stop     firewalld 
    systemctl status   firewalld 
    
  • 关闭selinux
    sed -i  's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
    setenforce 0
    

    2.主机说明

  • lvs01,lvs02为lvs负载均衡服务器,做keepalived高可用
  • web01,web02为RS服务器,均已经部署好nginx
主机名 系统 外网IP 内网IP
lvs01 centos7.2 10.0.0.1 10.0.10.1
lvs02 centos7.2 10.0.0.2 10.0.10.2
web01 centos7.2 10.0.0.5 10.0.10.5
web02 centos7.2 10.0.0.6 10.0.10.6

3.LVS服务器上的配置

1).安装ipvsadm

使用ipvsadm命令管理ipvs内核模块 此命令详细参数见详细参数

yum install ipvsadm.x86_64 -y
lsmod |grep ip_vs
(1).ipvsadm常用参数
ipvsadm -ln             #查看规则
ipvsadm -C				#清空规则
ipvsadm --set 30 5 60	#
ipvsadm -A -t 10.0.0.10:80 -s wrr -p 20           #创建一个虚拟服务器ip为10.0.0.10
ipvsadm -a -t 10.0.0.10:80 -r 10.0.0.5:80 -g -w 1 #指定RS服务器
ipvsadm -a -t 10.0.0.10:80 -r 10.0.0.6:80 -g -w 1 #指定RS服务器
ipvsadm-save  -n >/data/ipvsadm.bak               #备份规则
ipvsadm--restore </data/ipvsadm.bak               #恢复规则

2).使用keepalived管理LVS并实现高可用

(1).主机lvs01上的keepalived配置
global_defs {
   router_id LVS_01
}
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 {
     10.0.0.10/24 dev eth0 label eth0:1
    }
}
#创建虚拟服务器
virtual_server 10.0.0.10 80 {
    delay_loop  6          	
    lb_algo wrr                 #指定调度算法为轮询                
    lb_kind DR                  #指定工作模式为dr模式 
    nat_mask 255.255.255.0      #子网掩码
    persistence_timeout 50      #会话保持的时间  
    protocol TCP                #使用tcp协议    
	#添加RS服务器1
	real_server 10.0.0.5 80 {
		weight 1              
	    TCP_CHECK {
		    connect_timeout 8    #超时的时间     
		    nb_get_retry 3       #重试次数 
		    delay_before_retry 3 #重试之前等待时间
		    connect_port 80
	    }
	}
	#添加RS服务器2
	real_server 10.0.0.6 80 {
	   weight 1              
	   TCP_CHECK {
	        connect_timeout 8       
	        nb_get_retry 3
	        delay_before_retry 3
	        connect_port 80
	    }
	}
}
(2).主机lvs02上的keepalived配置
global_defs {
   router_id LVS_02
}
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.10/24 dev eth0 label eth0:1
    }
}
virtual_server 10.0.0.10 80 {
    delay_loop 6          
    lb_algo wrr                
    lb_kind DR                
    nat_mask 255.255.255.0
    persistence_timeout 50     
    protocol TCP                
    real_server 10.0.0.5 80 {
        weight 1              
        TCP_CHECK {
        connect_timeout 8       
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 10.0.0.6 80 {
        weight 1              
        TCP_CHECK {
        connect_timeout 8       
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}
(3).测试管理效果
  • 先清空规则:ipvsadm -C
  • 再查看规则:ipvsadm -ln:可以看到没有规则 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  • 启动keepalived:systemctl start keepalived.service
  • 再查看规则:ipvsadm -ln:可以看到已经有我们定义的规则。 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.0.10:80 wrr persistent 50 -> 10.0.0.5:80 Route 1 0 0
    -> 10.0.0.6:80 Route 1 0 0

4.RS服务器上的配置

1).绑定VIP

ip addr add 10.0.0.10/32 dev lo label lo:0

提示:/32

2).抑制APR响应

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  #刷新内核参数

5.访问站点抓包测试

1).请求响应过程

可以看到在用户角度,请求的是10.0.0.10,响应的也是10.0.0.10。 这也是负载均衡与反向代理的区别所在。 lvs_img02

2).查看请求时的目标ip的mac地址与响应时的源IP的mac地址的差异

  • 此图为请求时10.0.0.10的mac地址: lvs_img03
  • 此图为响应时10.0.0.10的mac地址: lvs_img04

经过对比很容易发现请求时的目标IP与响应时的源IP没有发生变化,但是其mac地址却发生了变化。 请求时10.0.0.10对应的mac地址为:lvs01服务器对应的网卡的MAC地址 响应时10.0.0.10对应的mac地址为:RS服务器对应的网卡的MAC地址 这也验证了上文所述的LVS的DR工作模式的原理。