zoukankan      html  css  js  c++  java
  • lvs 集群-DR模式

    LVS-DR
    服务概述:
    Direct Routing(直接路由)
    director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct Routing由于采用物理层(修改MAC地址)技术,因此所有服务器都必须在一个网段中。

    LVS-DR模式工作原理:
    1), DR模式, 全程目标地址, 原地址不变, 因为DR模式工作于2层
    2), 请求报文从客户端发出:
    原地址: CIP 源MAC CMAC 目标地址: VIP 目标mac: xxx
    3), 请求报文到达机房防火墙之后, 会在防火墙的内网口进行广播, 找到VIP在哪儿 然后把包丢出去
    原地址: CIP 目标地址: VIP
    源MAC: FMAC 目标MAC: VMAC
    4), 报文到达director之后, 解包, 发现目标mac是自己, 开始解析这个报文
    处理完成, 通过自定义的一个调度算法, 转发报文到达其中一台RS上
    原地址: CIP 目标地址: VIP
    源mac: DMAC 目标MAC: RMAC
    5), 数据报文到达RS之后, 进行节封装, 发现目标mac是自己, 开始解析, 发现VIP也有,开始处理
    6), 处理完成之后, 数据直接通过RS流向客户端

    一、LVS-DR数据包流向分析

    为了方便进行原理分析,将Client与群集机器放在网络中,数据包流经的路线为1-2-3-4

    LVS-DR模型的特点

    ①RS和DS必须在同一个物理网络中

    ②RS可以使用私有地址,也可以使用公网地址,如果使用公网地址,可以通过互联网对RIP进行直接访问

    ③所有的请求报文经由Director Server,但响应报文必须不能经过Director Server

    ④RS的数据包绝不允许指向DIP

    ⑤RS上的lo接口配置VIP的IP地址

    1.1、Client向目标VIP发出请求,Director(负载均衡器)接收

    1.1.1、IP包头及数据帧头信息

    1.2、Director根据负载均衡算法选择RealServer_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer_1的MAC地址,然后再局域网上发送

    1.2.1、IP包头及数据帧头信息

    1.3、RealServer_1收到这个帧,解封装后发现目标IP与本机匹配(RealServer事先绑定了VIP),于是处理这个报文,随后重新封装报文,发送到局域网

    1.3.1、IP包头及数据帧头信息

    1.4、Client将收到回复报文,Client人为得到正常的服务,而不会知道是哪一台服务器处理的

    1.4.1、注意:如果跨网段,则报文通过路由器经由Internet返回给用户

    二、LVS-DR中的ARP问题

    2.1、在LVS-DR负载均衡集群中,负载均衡与节点服务器都要配置相同的VIP地址

    2.2、在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱

    2.2.1、当ARP广播发送到LVS-DR集群时,因为负载均衡和节点服务器都是连接到相同的网络上,它们都会接收到ARP广播

    2.2.2、只有前端的负载均衡器进行响应广播,节点服务器不应该响应ARP广播

    2.3、对节点服务要求进行处理,使其不响应针对VIP的ARP请求

    2.3.1、使用虚接口lo:0承载VIP地址

    2.3.2、设置内核参数arp_ignore=1:系统只响应目的IP为本地IP的ARP请求

    2.4、RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址

    2.5、发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址

    2.6、路由器收到ARP请求后,将更新ARP表项

    2.7、原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址

    2.8、问题

    路由表根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效

    2.9、解决方法

    对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址

    三、案例:LVS-DR部署

    3.1、环境

    调度服务器

    192.168.100.10/24(内网)

    192.168.100.100/24(VIP)

    Web1服务器

    192.168.100.20/24

    Web2服务器

    192.168.100.30/24

    NFS共享服务器

    192.168.100.40/24

    客户机一台

    用于测试验证

    3.2、配置调度服务器

     
    加载ip_vs模块
    [root@lvs ~]# modprobe ip_vs
    [root@lvs ~]# cat /proc/net/ip_vs
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port Forward Weight ActiveConn InActConn
    
    安装管理软件ipvsadm,不需要启动
    [root@lvs ~]# rpm -ivh /mnt/Packages/ipvsadm-1.27-7.el7.x86_64.rpm
    
    编辑调度服务器脚本
    [root@lvs ~]# vi dr.sh
    #!/bin/bash
    # dr调度服务器安装
    ifconfig ens33:0 192.168.100.100 broadcast 192.168.100.100  netmask 255.255.255.255 up       #添加虚拟地址的虚接口
    route add -host 192.168.100.100 dev ens33:0      #给ens33:0添加路由
    ipvsadm -C                  #清除内核虚拟服务器表中的所有记录
    ipvsadm -A -t 192.168.100.100:80 -s rr      #创建虚拟服务器
    ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.20:80 -g   #添加服务器节点
    ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.30:80 -g   #添加服务器节点
    ipvsadm -Ln         #查看节点状态,加个"-n"将以数字形式显示地址、端口信息
    
    执行脚本
    [root@lvs ~]# sh dr.sh
    
    查看接口
    [root@lvs ~]# ifconfig
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.100.10  netmask 255.255.255.0  broadcast 192.168.100.255
            inet6 fe80::26b5:ebd3:a0d2:db12  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:9a:cd:27  txqueuelen 1000  (Ethernet)
            RX packets 3038  bytes 1120347 (1.0 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1151  bytes 130160 (127.1 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.100.100  netmask 255.255.255.255  broadcast 192.168.100.100
            ether 00:0c:29:9a:cd:27  txqueuelen 1000  (Ethernet)
    
    ###选项注释
    "-A":表示添加虚拟服务器
    "-a":表示添加真实服务器
    "-t":用来指定VIP地址及TCP端口
    "-r":用来指定RIP地址及TCP端口
    "-s":用来指定负载调度算法——rr(轮询)、wrr(加权轮询)、lc(最少连接)、wlc(加权最少连接)
    "-m":表示使用NAT群集模式(是DR模式,是TUN模式)
    

    3.3、配置NFS服务器

    安装NFS服务
    [root@nfs-server ~]# yum -y install rpcbind nfs-utils
    
    创建测试目录并新建网页
    [root@nfs-server ~]# mkdir -p /opt/web1
    [root@nfs-server ~]# mkdir -p /opt/web2
    [root@nfs-server ~]# echo '<h1>this is web 1!</h1>' > /opt/web1/index.html
    [root@nfs-server ~]# echo '<h1>this is web 2!</h1>' > /opt/web2/index.html
    
    设置访问权限
    [root@nfs-server ~]# vi /etc/exports
    /opt/web1  192.168.100.20(ro)
    /opt/web2  192.168.100.30(ro)
    
    开启服务并开机自启
    [root@nfs-server ~]# systemctl start nfs
    [root@nfs-server ~]# systemctl start rpcbind
    [root@nfs-server ~]# systemctl enable nfs
    [root@nfs-server ~]# systemctl enable rpcbind
    
    查看访问权限
    [root@nfs-server ~]# showmount -e
    Export list for nfs-server:
    /opt/web2 192.168.100.30
    /opt/web1 192.168.100.20
    

    3.4、配置Web1服务器

    安装httpd服务
    [root@web1 ~]# yum -y install httpd
    
    挂载NFS服务
    [root@web1 ~]# mount 192.168.100.40:/opt/web1 /var/www/html
    
    查看权限
    [root@web1 ~]# showmount -e 192.168.100.40
    Export list for 192.168.100.40:
    /opt/web2 192.168.100.30
    /opt/web1 192.168.100.20
    
    开启httpd服务
    [root@web1 ~]# systemctl start httpd
    
    本机访问
    [root@web1 ~]# curl http://localhost
    <h1>this is web1!</h1>
    
    配置DR模式
    [root@web1 ~]# vi web1.sh
    #!/bin/bash
    # web1
    ifconfig lo:0 192.168.100.100 broadcast 192.168.100.100 netmask 255.255.255.255 up
    route add -host 192.168.100.100 dev lo:0
    echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
    sysctl -p &> /dev/null
    
    执行脚本
    [root@web1 ~]# sh web1.sh
    
    查看端口信息
    [root@web1 ~]# ifconfig
    ......
    lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 192.168.100.100  netmask 255.255.255.255
            loop  txqueuelen 1  (Local Loopback)
    ......
    

    3.5、配置web2服务器

    安装httpd服务
    [root@web1 ~]# yum -y install httpd
    
    挂载NFS服务
    [root@web1 ~]# mount 192.168.100.40:/opt/web2 /var/www/html
    
    查看权限
    [root@web2 ~]# showmount -e 192.168.100.40
    Export list for 192.168.100.40:
    /opt/web2 192.168.100.30
    /opt/web1 192.168.100.20
    
    开启httpd服务
    [root@web2 ~]# systemctl start httpd
    
    本机访问
    [root@web2 ~]# curl http://localhost
    <h1>this is web2!</h1>
    
    配置DR模式
    [root@web2 ~]# vi web2.sh
    #!/bin/bash
    # web2
    ifconfig lo:0 192.168.100.100 broadcast 192.168.100.100 netmask 255.255.255.255 up
    route add -host 192.168.100.100 dev lo:0
    echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
    sysctl -p &> /dev/null
    
    执行脚本
    [root@web2 ~]# sh web2.sh
    
    查看端口信息
    [root@web2 ~]# ifconfig
    ......
    lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 192.168.100.100  netmask 255.255.255.255
            loop  txqueuelen 1  (Local Loopback)
    ......
    

    3.6、客户机测试

    ①先访问web1和web2服务器的IP

     

     ②再测试LVS-DR服务器IP

     

     ③查看节点状态

    [root@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.100.100:80 rr
     -> 192.168.100.20:80            Route   1      0          2
     -> 192.168.100.30:80            Route   1      0          1
    #使用的是轮询,所以权重都是1
    

      

      

      

      

      

  • 相关阅读:
    手机网站调试神器之chrome控制台
    改善C#程序的建议2:C#中dynamic的正确用法
    flowplayer视频播放插件[转]
    Python类,特殊方法, __getitem__,__len__, __delitem__
    Python yield 使用浅析
    Openerp负载平衡
    linux sheel重复执行上条命令
    Python 去除列表中重复的元素
    去除Odoo主页中的提示: Your Odoo is not supported.
    Python 正则表达式学习摘要及资料
  • 原文地址:https://www.cnblogs.com/tianzhendengni/p/13934220.html
Copyright © 2011-2022 走看看