• centos配置LVS


    LVS有三种工作模式:NAT, TUN, DR.  DR是三种工作模式中性能最高的,TUN次之。

    本文记录LVS/TUN和LVS/DR工作模式的配置过程。

    环境:

    • 三台CentOS 7 x64 虚拟机: CentOS Linux release 7.4.1708 (Core)
    • IP 地址分别为192.168.1.11/24, 192.168.1.12/24, 192.168.1.13/24
    • 虚拟IP为192.168.1.99, 网络结构为:

    1. LVS/TUN – 隧道模式:

    Director(192.168.1.11)上的配置:

    为tunl0设备配置VIP:

    # ifconfig tunl0 192.168.1.99 broadcast 192.168.1.99 netmask 255.255.255.255 up

    安装ipvsadm工具:

    # yum install ipvsadm

    用ipvsadm配置LVS转发器:

    • 清除配置表
    • 添加一个访问地址为192.168.1.99:80的TCP服务,并设置调度算法为轮叫(rr)
    • 为服务添加两个Real Server 192.168.1.12 和 192.168.1.13, -i参数标识工作模式为TUN模式
    • 最后清除iptables,重新生成
    # ipvsadm -C
    # ipvsadm -A -t 192.168.1.99:80 -s rr
    # ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.12 -i
    # ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.13 -i
    # iptables -F

    配置完成后使用ipvsadm -Ln查看:

    # 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.1.99:80 rr
      -> 192.168.1.12:80              Route   1      0          0         
      -> 192.168.1.13:80              Route   1      0          0

    Real Server(192.168.1.12,192.168.1.13)上的配置:

    • 配置VIP
    • 配置Real Server不响应VIP的ARP请求
    • 关闭数据包源地址检验
    • 最后清除iptables,重新生成
    # ifconfig tunl0 192.168.1.99 broadcast 192.168.1.99 netmask 255.255.255.255 up
    # echo "1" > /proc/sys/net/ipv4/conf/tunl0/arp_ignore
    # echo "2" > /proc/sys/net/ipv4/conf/tunl0/arp_announce
    # echo "0" > /proc/sys/net/ipv4/conf/tunl0/rp_filter
    # echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
    # echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
    # echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
    # iptables -F
    • 在Real Server上启动一个简单的web服务。两种方式:

    1. 在192.168.1.12和192.168.1.13上直接通过rpm包安装nginx, 在192.168.1.12和192.168.1.13上配置两个web server显示两个可识别的web页面:

    # rpm -Uvh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.14.0-1.el7_4.ngx.x86_64.rpm

    2. 通过docker使用默认NAT网络启动一个nginx实例,在192.168.1.12和192.168.1.13上配置两个nginx实例显示两个可识别的web页面。通过docker启动web服务时要在Real Server上开启ip_forward, 因为docker run默认使用的NAT网络依赖ip_forward:

    # docker run --name nginx -d -p 80:80 -v /etc/nginx/:/etc/nginx/ -v /var/www/html/:/usr/share/nginx/html/ -v /var/log/nginx/:/var/log/nginx/ nginx:1.13.12
    # echo "1" > /proc/sys/net/ipv4/ip_forward

    最后执行iptables -F确保所有通信不被防火墙阻挡。

    LVS/TUN模式配置完成,通过在另一个linux 虚拟机中通过curl访问192.168.1.99, 可以看到http请求会以轮询的方式被分别转发到的192.168.1.12和192.168.1.13:

    在浏览器中访问时由于浏览器缓存可能没那么明显。

    2. LVS/DR 模式:

    Director(192.168.1.11)上的配置:

    # ifconfig enp0s3:0 192.168.1.99 netmask 255.255.255.255 up
    # ipvsadm -C
    # ipvsadm -A -t 192.168.1.99:80 -s rr
    # ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.12 -g
    # ipvsadm -a -t 192.168.1.99:80 -r 192.168.1.13 -g
    # iptables -F

    DR模式不使用隧道设备tunl0, 而是把虚拟IP配置本地网卡别名enp0s3:0上,添加Real Server时指定模式为-g。也有人说把虚拟IP配置在lookback别名上,实测配置在loopback好像对real server的轮询切换并不那么及时。

    Real Server(192.168.1.12,192.168.1.13)上的配置:

    # ifconfig enp0s3:0 192.168.1.99 netmask 255.255.255.255 up
    # echo "1" > /proc/sys/net/ipv4/conf/enp0s3/arp_ignore
    # echo "2" > /proc/sys/net/ipv4/conf/enp0s3/arp_announce
    # echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
    # echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
    # iptables -F

    如需网络内核参数永久生效请修改/etc/sysctl.conf (最好这样做):

    # cat <<EOF >> /etc/sysctl.conf
    net.ipv4.conf.enp0s3.arp_ignore = 1
    net.ipv4.conf.enp0s3.arp_announce = 2
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    EOF
    # sysctl -p

    Real Server中同样要配置虚拟IP,并设置不响应对192.168.1.99的arp查询,Web Server的配置与TUN模式相同。

    配置完成。

    Tips:

    如果在Director上也有web服务,还可以把Director(192.168.1.11)也作为Real Server使用。


    参考信息:

    关于arp_ignore, arp_announce, rp_filter参数的作用,请参见:

    上述配置在firewalld为运行状态并且SELinux为Enforcing状态时测试通过。

    所有的网络参数配置均为临时立即生效,若要长久生效,请修改/etc/sysctl.conf文件,并执行sysctl -p

    # vi /etc/sysctl.conf
    # sysctl -p

    ipvsadm配置的内容在系统重启后也会丢失,可能通过ipvsadm -Sn保存到文件,然后可通过ipvsadm –restore加载。

    注意ipvsadm的-S(–save)一起要跟上n参数,否则会保存错误的IP地址。

    [root@centos01 ~]# 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.1.99:80 rr
     -> 192.168.1.12:80 Route 1 0 7 
     -> 192.168.1.13:80 Route 1 0 4 
    [root@centos01 ~]# ipvsadm -Sn > ipvsadm.conf
    [root@centos01 ~]# cat ipvsadm.conf
    -A -t 192.168.1.99:80 -s rr
    -a -t 192.168.1.99:80 -r 192.168.1.12:80 -g -w 1
    -a -t 192.168.1.99:80 -r 192.168.1.13:80 -g -w 1
    [root@centos01 ~]# ipvsadm -C
    [root@centos01 ~]# cat ipvsadm.conf | ipvsadm --restore
    [root@centos01 ~]# 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.1.99:80 rr
     -> 192.168.1.12:80 Route 1 0 4 
     -> 192.168.1.13:80 Route 1 0 4

    如果遇到转发故障可通过tcpdump进行诊断。如:监听接口enp0s3,抓取host为192.168.1.99并且目的端口为80,或host为192.168.1.12并且源端口为80的数据包:

    # tcpdump -i enp0s3 '((dst port 80) and (host 192.168.1.99)) or ((src port 80) and (host 192.168.1.12))'

    关于LVS的调度算法请参见:LVS集群的负载调度

  • 相关阅读:
    PHP数据采集curl常用的5个例子
    【荐】PHP采集工具curl快速入门教程
    PHP常用正则表达式
    JavaScript方法call、apply、caller、callee、bind的使用详解及区别
    axf、elf文件转换成bin、hex脚本工具
    为什么数据须要做爱
    POJ 3978 Primes(求范围素数个数)
    Facebook Hacker Cup 2015 Round 1--Homework(筛选法求素数)
    后台进程整理
    Nginx优化具体,应对高并发
  • 原文地址:https://www.cnblogs.com/duanlinxiao/p/10957435.html
Copyright © 2020-2023  润新知