LVS实战篇

1 环境准备

1.1 系统环境

1.1.1 系统版本

[root@lb01 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@lb01 ~]# uname -r
2.6.32-696.el6.x86_64
[root@lb01 ~]# uname -m
x86_64

1.1.2 关闭安全机制

[root@lb01 ~]# sed -i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/sysconfig/selinux
[root@lb01 ~]# setenforce 0
[root@lb01 ~]# /etc/init.d/iptables stop

1.1.3 更换yum源并添加epel

[root@lb01 ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
[root@lb01 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
[root@lb01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

1.2 主机及IP地址规划

主机名

IP地址

说明

lb01

10.0.0.5

负载1

lb02

10.0.0.6

负载2

web02

10.0.0.7

web服务1

web01

10.0.0.8

web服务2

 

2 安装ipvsadm

2.1 yum安装

[root@lb01 ~]# yum install -y ipvsadm  ==》四台服务器都要执行
[root@web02 ~]# rpm -qa ipvsadm    ==》四台服务器都要执行
ipvsadm-1.26-4.el6.x86_64

2.2 做软连接并查看是否加载内核模块

[root@lb01 ~]# ln -s /usr/src/kernels/`uname -r` /usr/src/linux ==》只需在负载上执行即可
[root@lb01 ~]# ll /usr/src/
[root@lb01 ~]# lsmod |grep ip_vs ==》四台服务器都要执行
ip_vs                 126705  0
libcrc32c               1246  1 ip_vs
ipv6                  336368  272 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6,ib_ipoib,ib_addr

注意:若用lsmod |graep ip_vs没出现上述内容,则执行ipvsadm或者modprobe ip_vs命令即可 然后在执行lsmod |graep ip_vs即可出现上述内容

2.3 在负载上添加VIP

[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0
或者
[root@lb02 ~]# ifconfig eth0:0 10.0.0.3/24 up

2.4 在负载上添加节点

[root@lb01 ~]# ipvsadm -C  ==》清空
[root@lb01 ~]# ipvsadm -A -t 10.0.0.3:80 -s wrr  ==》增加vserver
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1 ==》添加节点
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
[root@lb01 ~]# ipvsadm --set 30 5 60  ==》优化
[root@lb01 ~]# 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.3:80 wrr
  -> 10.0.0.7:80                  Route   1      0          0        
  -> 10.0.0.8:80                  Route   1      0          0

2.5 RS上绑定VIP和一直ARP

[root@web01 ~]# ip addr add 10.0.0.3/32 dev lo label lo:0  ==》绑定VIP
或者
[root@web01 ~]# ifconfig lo:0 10.0.0.3/32 up
[root@web01 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore  ==》抑制ARP
[root@web01 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@web01 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@web01 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
##
[root@web02 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web02 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@web02 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@web02 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
##
[root@web01 ~]# route add -host 10.0.0.3 lo  ==》增加一条路由 不是必须的


2.6RS上搭建Web服务

详细搭建过程在前面的nginx基础篇已经介绍过,可以点击下面的连接进行查看

https://blog.51cto.com/lzhnb/2095335

2.7 测试

在浏览器中输入10.0.0.3进行访问

keepalived+lvs实现高可用负载均衡集群_第1张图片

可以在命令行输入下面的命令进行监视

[root@lb01 ~]# watch -n 1 ipvsadm -Ln
Every 1.0s: ipvsadm -Ln                                                                                      Sat May 26 21:15:56 2018
 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.3:80 wrr
  -> 10.0.0.7:80                  Route   1        1          0
  -> 10.0.0.8:80                  Route   1       2          0

3 ipvsadm常用参数总结

[root@lb01 ~]# ipvsadm --help
ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)
Usage:
  ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine]
  ipvsadm -D -t|u|f service-address
  ipvsadm -C
  ipvsadm -R
  ipvsadm -S [-n]
  ipvsadm -a|e -t|u|f service-address -r server-address [options]
  ipvsadm -d -t|u|f service-address -r server-address
  ipvsadm -L|l [options]
  ipvsadm -Z [-t|u|f service-address]
  ipvsadm --set tcp tcpfin udp
  ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
  ipvsadm --stop-daemon state
  ipvsadm -h
命令:    
允许长或短选项。    
--add-service -A添加具有选项的虚拟服务    
--edit-service -E使用选项编辑虚拟服务    
--delete-service -D删除虚拟服务    
--clear -C清除整个表    
--restore -R从stdin恢复规则    
--save -S将规则保存到stdout    
--add-server -a添加带有选项的实服务器    
--edit-server -e编辑带有选项的实服务器    
--delete-server -d删除真实服务器    
--list -L | -l列出表    
--zero -Z零计数器在服务或所有服务    
--set tcp tcpfin udp设置连接超时值    
--start-daemon启动连接同步守护程序    
--stop-daemon停止连接同步守护程序    
--help -h显示此帮助消息
 
选项:    
--tcp-service -t service-address service-address是host [:port]    
--udp-service -u service-address service-address是host [:port]    
--fwmark-service -f fwmark fwmark是一个大于零的整数    
--scheduler -s调度程序rr | wrr | lc | wlc | lblc | lblcr | dh | sh | sed | nq默认调度程序是wlc。     
--persistent -p [timeout]持久服务    
--netmask -M netmask持久粒度掩码    
--real-server -r服务器地址服务器地址是主机(和端口)    
--gatewaying -g网关(直接路由)(默认)    
--ipip -i ipip encapsulation(tunneling)    
--masquerading -m伪装(NAT)    
--weight -w实服务器的权重   
 --syncid sid syncid用于连接同步(默认值= 255)     
--ipip -i ipip encapsulation(tunneling)    
指定LVS的工作模式为隧道模式    
--masquerading -m伪装(NAT)    
指定LVS的工作模式为NAT模式      
--u-threshold -x连接的阈值上限阈值    
--l-threshold -y lthreshold连接的下限阈值         
--mcast-interface接口用于连接同步的组播接口    
指定组播的同步接口    
--syncid sid syncid用于连接同步(默认值= 255)    
--connection -c当前IPVS连接的输出    
显示LVS目前的连接如:ipvsadm -L -c    
超时输出超时(tcp tcpfin udp)    
显示tcp tcpfin udp的超时值如:ipvsadm -L --timeout    
--daemon输出守护进程信息    
显示同步守护进程状态    
统计信息的统计输出    
显示统计信息    
速率信息的速率输出    
显示速率信息    
阈值输出阈值信息    
   --persistent-conn输出持久连接信息    
服务/服务器条目的排序输出    
对虚拟服务器和真实服务器排序输出    
--ops -O单分组调度        
--numeric -n地址和端口的数字输出    
 输出IP地址和端口的数字形式       
-numeric -n输出IP地址和端口的数字形式  
--stat选项是统计自那条转发规则生效以来的包    
Conns(connections scheduled)已经转发过的连接数    
InPkts(incoming packets)入包个数    
OutPkts(outgoing packets)出包个数    
InBytes(传入字节)入流量(字节)      
OutBytes(outgoing bytes)出流量(字节)      
--rate选项是显示速率信息    
CPS(current connection rate)每秒连接数    
InPPS(当前包速率)每秒的入包个数    
OutPPS(当前输出包速率)每秒的出包个数    
InBPS(字节速率)每秒入流量(字节)    
OutBPS(current out byte rate)每秒入流量(字节)


4keepalived+lvs

4.1 安装keepalived服务

[root@lb01 ~]# yum install keepalived -y  ==
》在负载上安装


4.2 配置keepalived

[root@lb01 keepalived]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}
virtual_server 10.0.0.3 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
 
    real_server 10.0.0.7 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
    }
 }
    real_server 10.0.0.8 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
      }
 }
 
}

4.3 RS节点执行下面的脚本

[root@web02 init.d]# cat /etc/init.d/lvs
#!/bin/bash
#description Config LVS to realserver lo and apply noarp
#Written by LZH
 
VIP=10.0.0.3
. /etc/init.d/functions
 
case "$1" in
        start)
               ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
               #/sbin/route add -host $SNS_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"
               ;;
        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"
               ;;
        *)
               echo "Usage: $0 {start|stop}"
               exit 1
        esac
 
        exit 0

注意需要给该脚本加上可执行权限!!!

[root@web02 init.d]# chmod +x /etc/init.d/lvs

keepalived+lvs 是生产中常用的实现lvs负载均衡的方法

5 lvs故障排错思路

5.1 导致负载不均衡的原因

q  LVS自身的会话保持参数设置(-p 300),优化:大公司常用cookies代替session

q  LVS调度算法设置,如rrwrrwlclc

q  后端RS节点的会话保持参数,如apachekeepalived参数

q  用户发送请求时间短,请求资源的大小

5.2 排错思路

q  调度器上LVS调度规则及IP的正确性

q  RS节点上VIP绑定和arp的抑制检查

vip绑定处理方案:

  RS绑定的VIP做实时监控

‚  RS绑定的VIP 做成配置文件,/etc/sysconfig/network-scripts/ifcfg-lo:0

arp抑制处理方案:

  如果是单个VIP,则可以用stop传参设置0

‚  若果RS有多个VIP绑定,即使stop也一定不要设置为0

q  RS节点上自身提供服务的检查(DR不能进行端口转换)

q  利用辅助工具tcpdumpping等进行排查