zoukankan      html  css  js  c++  java
  • 企业——LVS-DR模式负载均衡构建配置

    ####LVS-DR模式负载均衡构建配置###

    1.过程

    client -> VS -> RS -> client(VS只做调度,RS为虚拟服务器)

    DR模式:直接由路由,通过改写请求报文的目的MAC地址,将请求发送给真实的服务器,服务器将相应消息直接发送给客户端

    2.原理详情

    1)通过在调度器VS上修改数据包的目的MAC地址实现转发,注意源地址是CIP,目的地址仍然是VIP,(CIP(CMAC)-> VIP(VM -> RM,在二层链路层改变了MAC地址来定位))

    2)请求的报文经过调度器,而服务器响应处理后的报文无需经过调度器,因而并发访问量大时使用效率很高(和NAT模式相比)

    3)因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器只能在同一个局域网里面

    4)服务器主机需要绑定VIP地址在lo接口上,且需要配置ARP抑制

    5)服务器节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让服务器直接出网就可以

    6)因为DR模式的调度器只做MAC地址的改写,所以调度器就不能改写目标端口,那么服务器就得使用和VIP相同的端口提供服务

    3.实验环境及其基本操作

    关闭iptables和selinux

    开启封装好base之后,创建的四个虚拟机

    rhel6.5

    VS: vm1 172.25.254.1

    RS1: vm2 172.25.254.2

    RS2: vm3 172.25.254.3

    vip 172.25.254.100

           

    <1>.VS

    1)vim /etc/yum.repos.d/rhel-source.repo    ##重新配置yum源文件,配置成更高级的yum源仓库。

    [rhel-source]

    name=Red Hat Enterprise Linux $releasever - $basearch - Source

    baseurl=http://172.25.254.77/rhel6.5

    enabled=1

    gpgcheck=1

    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

    [HighAvailability]   ##高可用

    name=HighAvailability

    baseurl=http://172.25.254.77/rhel6.5/HighAvailability

    gpgcheck=0

    [LoadBalancer]        ##负载均衡

    name=LoadBalancer

    baseurl=http://172.25.254.77/rhel6.5/LoadBalancer

    gpgcheck=0

    ==========================================================

    出现的错误:

    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release在编写yum源的配置文件的时候,这一行不能删除,否则会报错

    ==========================================================

    (2)下载ipvsadm   (在LVS调度器上安装)

     ipvsadm 的命令参数:

     -A   增加一台虚拟设备
       -a   添加真实服务器的操作
     -t   tcp服务地址
     -s   调度算法(10中调度算法rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)
     -r   对应的真实ip
     -g   rh(路由)
     rr  调度算法:轮询

       yum install ipvsadm -y

       ipvsadm -L   ##查看是否写入策略

       ipvsadm -A -t 172.25.254.100:80 -s rr     ## -s调度算法,默认为wlc加权调度算法

       ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.2:80 -g

       ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.3:80 -g

       ipvsadm -ln   ##查看写入的策略

     /etc/init.d/ipvsadm  save     ##保存写好的策略

       ip addr add 172.25.254.100/24 dev eth0     ##临时增加

       ip addr

    <2>.RS后端真实服务器的配置

       注意:RS上也必须有vip才可以建立连接

       

    RS1:

       yum install httpd -y

       /etc/init.d/httpd start

       cd /var/www/html/

       vim index.html

    <h1>vm2-westos.com</h1>

       ip addr add 172.25.254.100/24 dev eth0     ##临时增加

       ip addr

           

    RS2:

       yum install httpd -y

       /etc/init.d/httpd start

       cd /var/www/html/

       vim index.html

    <h1>vm3-westos.com</h1>

       ip addr add 172.25.254.100/24 dev eth0     ##临时增加

       ip addr

           

    <3>.客户端测试

       发现连接到的ip(VS和RS的ip都一样)是随机的,因为三台server在统一VLAN下具有相同的VIP,故不能保证每次都访问到调度器

       curl 172.25.254.100  ##这里出现的是轮询的情况,是因为绑定的是 server1上的MAC地址,所以会出现轮询的效果

      <h1>vm2-westos.com</h1>

      <h1>vm3-westos.com</h1>

      <h1>vm2-westos.com</h1>

      <h1>vm3-westos.com</h1>

      <h1>vm2-westos.com</h1>

      <h1>vm3-westos.com</h1>

      以上情况,server1,2,3都有可能被访问到

      如果绑定的MAC地址是server1,则在server2,3轮询

      如果绑定的MAC地址是sever2或sever3的,那么会发现,在测试端根本不会出现轮询,而是直接去了MAC绑定的后端服务器 (显然这样在企业中是不允许的)

       arp -an |grep 100         ##查看绑定的MAC地址的信息

    ? (172.25.254.100) at 52:54:00:50:cc:71 [ether] on br0  ##这里绑定的是server1的MAC地址

       arp -d 172.25.254.100     ## 删除掉刚才的绑定的策略,重新访问

       curl 172.25.254.100      ##这里出现的就是客户端直接绑定了后端服务器的MAC地址,因此访问的时候就不会出现轮询的效果。显然这样是不被允许的。

      <h1>vm2-westos.com</h1>

      <h1>vm2-westos.com</h1>

      <h1>vm2-westos.com</h1>

       arp -an |grep 100       ##出现的是 vm2/vm3的信息

    <4>.为了让客户端通过VS访问服务器,需要给RS设置ARP抑制,来禁止客户端直接访问服务器

      为了解决刚才的情况,要求只绑定 server 1 的MAC地址,因此需要对 server2/server3 上的VIP进行隐藏,即ARP抑制。

       RS上:

       yum install arptables_jf -y    ##为arptables网络的用户控制过滤的守护进程

       arptables -A IN -d 172.25.254.100 -j DROP  ##当网内广播需要172.25.254.100这个ip时,它丢弃所有网内的请求

       arptables -A OUT -s 172.25.254.100 -j mangle --mangle-ip-s 172.25.254.2  ##当它自身需要在网内发包时,伪装为自己原本的ip172.25.64.2

                          ## -A控制arp协议,IN添加策略,mangle转换

       /etc/init.d/arptables_jf save

       cat /etc/sysconfig/arptables  ##此文件存有arptables的记录,关掉之后,重启记录依旧存在

    <5>.再一次客户端测试

     先删除现有的绑定的MAC地址

     arp  -d  172.25.254.100

       curl 172.25.254.100

       arp -d 172.25.254.100  ##多次down掉连接,查看绑定的MAC地址是否会改变

       curl 172.25.254.100

       arp -an |grep 100         ##查看地址信息,依旧是VS的MAC地址

    4.VS对后端没有健康检查

       注意:因为没有健康检查,所以当一个后端的服务器down掉之后,服务端通过VS访问某服务器的时候,还是会能访问到,这就会出现错误

    解决方法一:使用ldirectord

       yum install ldirectord-3.9.5-3.1.x86_64.rpm -y    ##在LVS调度器上安装健康检查

       rpm -ql ldirectord

       cp  /usr/share/doc/ldirectord-3.9.5/ldirectord.cf  /etc/ha.d    ##配置文件的母板拷到/etc/ha.d/

       cd /etc/ha.d

       vim ldirectord.cf  ##编辑文件内容

            virtual=172.25.254.100:80    ##VIP 地址和端口号

             real=172.25.254.2:80 gate  ##指定RealServer地址和端口,同时设定LVS工作模式,gate表示DR模式,ipip表示TUNL模式,masq表示NAT模式。

             real=172.25.254.3:80 gate

             fallback=127.0.0.1:80 gate  ##当所有的real server节点不能工作时,web服务重定向到本地的80端口的默认发布页面上。

             service=http  ##指定服务类型,对http服务做负载均衡

             scheduler=rr  ##指定调度算法,这里是rr(轮叫)算法

             #persistent=600

             #netmask=255.255.255.255

             protocol=tcp  ##指出该服务使用的协议:tcp、udp 或 fwm

             checktype=negotiate  ##指定Ldirectord的检测类型,默认为negotiate

             checkport=80  ##指出健康检查使用的端口

             request="index.html"

             #receive="Test Page"

             #virtualhost=www.x.y.z

       ipvsadm -C     ##清理规则

       ipvsadm -ln    ##查看是否清除规则

       /etc/init.d/ldirectord  restart  ##再次开启服务,又可以加载出规则

       yum install httpd -y

       cd /var/www/html/

       vim index.html

      <h1>系统维护中。。。</h1>

    <1>在客户端测试

       关闭两个服务器的http服务

       重新开起一个虚拟机vm4

       curl 172.25.254.100

    <h1>系统维护中。。。</h1>

       注意:访问的是本地的httpd的发布目录,因此表示监测成功

    解决方法二:使用keepalived

       /etc/init.d/ldirectord stop   ##应用之前先关掉上一个服务

    1)下载keepalived的压缩文件

       tar zxf keepalived-2.0.6.tar.gz

       ./configure --with-init=SYSV --prefix=/usr/local/keepalived/      ##将文件转成二进制文件

       make    ##编译

       make install

       

    2)创建软链接

       cd /usr/local/keepalived/etc/rc.d/init.d

       ls

       chmod +x keeppalived

       ln -s /usr/local/keepalived/etc/rc.d/init.d/keeppalived /etc/init.d

       cd ..

       cd ..

       ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig

       ln -s /usr/local/keepalived/etc/keepalived /etc

       ln -s /usr/local/keepalived/sbin/keepalived /sbin/

       ll /etc/sysconfig/keepalived ##查看软链接是否做好

       cd /usr/local

       scp -r keepalived/ vm4:/usr/local

       (将上面的创建链接操作再执行一遍)

    3)配置keepalived文件

       cd /etc/keepalived/

       vim keepalived.conf

    global_defs {

       notification_email {

    root@localhost

       }

       notification_email_from keepalived@localhost

       smtp_server 127.0.0.1

       smtp_connect_timeout 30

       router_id LVS_DEVEL

       vrrp_skip_check_adv_addr

       #vrrp_strict   ##注释以防其修改防火墙规则

       vrrp_garp_interval 0

       vrrp_gna_interval 0

    }

    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 {

            172.25.254.100

        }

    }

    virtual_server 172.25.254.100 80 {  

    ##VS的VIP,服务启动生效时自动添加

        delay_loop 6      ##对后端健康检查的时间

        lb_algo rr        ##调度算法

        lb_kind DR       ##模式为DR模式

        #persistence_timeout 50

        protocol TCP

        real_server 172.25.254.2 80 {

            weight 1

            TCP_CHECK {

                connect_timeout 3

                retry 3

                delay_before_retry 3

            }

        }

        real_server 172.25.254.3 80 {

            weight 1

            TCP_CHECK {

                connect_timeout 3

                retry 3

                delay_before_retry 3

            }

        }

    }

       scp keepalived.conf vm4:/etc/keepalived/

       注意:因为虚拟机vm4是用来做备用VS的,是为了防止当VS(vm1)挂掉的时候,不会导致服务器瘫痪。当vm1 down掉以后,vm4就可以立即接替vm1的工作

    4)客户端测试

       vm1,2,3,4都开启的时候

       用真机访问,是通过主VS访问服务器的

       

       vm1,4开启,2,3关闭http服务的时候

       用真机访问的是VS的httpd的发布文件

       vm2,3,4开启,1关闭http服务的时候

       服务不会中断,vm4会接替vm1的工作,查看的是vm4的地址信息

           

           

          

          

          

    5.vm1和vm4互为主备

      一个当被用的虚拟机,会有点浪费资源。所以,当服务很多的时候,可以将服务分开来当主备,这样两个服务器可以同时工作,并且互为主备

       cd /etc/keepalived/

       vim keepalived.conf

    更改配置文件图片,如下:

       /erc/init.d/keepalived start

  • 相关阅读:
    MATLAB仿真学习笔记(一)
    SolidWorks学习笔记(一)
    机械制造技术学习笔记(七)
    基于MATLAB的多功能语音处理器
    MATLAB图形界面设计(下)
    36、如何避免僵尸进程?
    37、局部性原理你知道吗?主要有哪两大局部性原理?各自是什么?
    35、 守护进程、僵尸进程和孤儿进程
    32、什么是快表,你知道多少关于快表的知识?
    30、终端退出,终端运行的进程会怎样?31、如何让进程后台运行
  • 原文地址:https://www.cnblogs.com/wf-aiyouwei/p/9715801.html
Copyright © 2011-2022 走看看