首页 > 代码库 > lvs

lvs

负载均衡 LVS

三种(应该是四种)负载均衡技术:不具备抗攻击能力

技术分享

技术分享 VS/NAT (通过NAT实现虚拟服务器) 压力都在调度器上 调度器输入内网的数据包会源路返回到外网  对后端的realserver 没有要求只要提供服务就行了
 VS/TUN(隧道模式 在原有的模式下继续做封装缺点:数据包过大)(通过IP隧道实现虚拟服务器)成本高 可支持广域网
 VS/DR(后端可以挂一百个服务器速度快)(通过直接路由实现虚拟服务器) 必须在内网(在同一个物理网络)

生产环境中主要用第四种:FullNAT(跨WELN)

redhat6:自带10种内核连接调度算法

技术分享



VS/DR: 核心 更改mac地址 不支持回包
调度机器:
首先安装一服务:确认一下
ipvsadm -l
ip addr add 172.25.42.130 (vip)

技术分享
ipvsadm -A -t 172.25.42.130:80 -s rr
(rr:论寻算法)
ipvsadm -a -t 172.25.42.130:80 -r 172.25.42.17:80 -g
ipvsadm -a -t 172.25.42.130:80-r 172.25.42.18:80 –g

技术分享
ipvsadm -l
/etc/init.d/ipvsadm save

realserver1(dd8.example.com) 用apache测试  //对外不响应
yum install httpd -y
/etc/init.d/httpd start
cd /var/www/html
vim index.html
<h1>dd8.example.com</h1>

ipaddr add 172.25.42.130/32 dev eth0


realserver2(dd9.example.com)
yum install httpd -y
/etc/init.d/httpd start
cd /var/www/html
vim index.html
<h1>dd9.example.com</h1>

ip addr add 172.25.42.130/32 dev eth0

如果只做上述操作,发现调度机不起作用


在物理机上:arp -an 172.25.42.130


            arp -d 172.25.42.130
            ping 172.25.42.130
            arp -an 172.25.42.130

会发现,两次IP的mac地址不一样,因为调度机,两台realyserver 上面都有172.25.42.130 这个IP 也就是说这三个相同的IP有三个不同的mac地址 此时ping 这个IP 只会随机选择一个

在 real server上:arptable(arp 防火墙)//此实验中 主要是为了屏蔽real server 上面的vip的mac

yum install arptables_jf.x86_64 -y
arptables -A IN -d 172.25.42.130 -j DROP (对外不发布172.25.42.130)
arptables -A OUT -s 172.25.42.130 -j mangle --mangle-ip-s 172.25.42.17 (谁用 172.25.42.130 访问我 我所回应的都是 172.25.42.17)//一个mac可以对应多个ip,在real server 里面不让vip用这个mac
技术分享

yum install arptables_jf.x86_64 -y
arptables -A IN -d 172.25.42.130 -j DROP
arptables -A OUT -s 172.25.42.130 -j mangle --mangle-ip-s 172.25.42.17

技术分享

技术分享

技术分享对后台服务器不具备健康检查:
其中一台real server 的httpd服务关闭
在调度服务器中,发现调度器依然会正常调度:
此时,在物理机上测试:curl:172.25.42.130

优化:(加上健康检查)
调度机:ipvsadm –C

技术分享在heartbeat 的前提下(找一个已经安装过的软件包)
cd /etc/ha.d
rpm -qd ldirectord
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf .
技术分享

vim ldirectord.cf

技术分享# Sample for an http virtual service
virtual=172.25.42.130:80
        real=172.25.42.17:80 gate  //real server ip
        real=172.25.42.18:80 gate  //real server ip
        fallback=127.0.0.1:80 gate //realserver
全部挂掉 调度机器(本机)去顶替
        service=http
        scheduler=rr
        #persistent=600       //与存储或数据库等长久需要保持连接的设置有关 
        #netmask=255.255.255.255
        protocol=tcp
        checktype=negotiate
        checkport=80
        request="index.html"
#       receive="TestPage"   
#       virtualhost=www.x.y.z
       
/etc/init.d/ldirectord start
技术分享


测试:

技术分享


关掉real server 的httpd

 

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

 


heartbeat+ldirectord+lvs:(两台已经做好 heartbeat的虚拟机)
调度机器1:/etc/init.d/ldirectord stop
ipvsadm -C
/etc/init.d/httpd stop
ip addr del 172.25.42.130/24 dev eth0 //因为交给集群来做 不需要手动开启和人为干预

vim haresources
dd6.example.com IPaddr::172.25.42.130/24/eth0 ldirectord httpd

技术分享

scp ldirectord.cf haresources root@172.25.42.16:/etc/ha.d/
/etc/init.d/heartbeat start
(两台都做此操作)

real server (手动开启httpd服务)

测试:
两台调度机互相切换:
dd6.example.com:/etc/init.d/heartbeat stop

技术分享

技术分享

技术分享

技术分享

技术分享


服务健康切换:


技术分享

技术分享





keepalived+lvs:(/etc/init.d/heartbeat stop)
1.
安装keepalived (keepalived 自带健康检查)
./configure --prefix=/usr/local/keepalived  //源码编译
make && make install

2.(两台调度机都做)
/etc/init.d/heartbeat stop
ln-s/usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
ln-s /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig
ln-s /usr/local/keepalived/etc/keepalived /etc
cd /usr/local/keepalived
cd sbin
ln -s /usr/local/keepalived/sbin/keepalived /sbin
chmod+x /usr/local/keepalived/etc/rc.d/init.d/keepalived

cd /usr/local
scp -r * root@172.25.42.16:/usr/local
cd /etc/keepalived
vim keepalived
yum install mailx -y

/etc/init.d/keepalived start

增加服务 vsftpd
/etc/init.d/keepalived stop
real server :yum install vsftpd -y

vim /etc/keepalived/keepalived

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_fromkeepalived@dd1.example.com
   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 142
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.42.150
        172.25.42.160
    }
}

virtual_server 172.25.42.150 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
   # persistence_timeout 50
    protocol TCP

    real_server 172.25.42.12 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 172.25.42.13 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 172.25.42.160 21 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 172.25.42.12 21 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 172.25.42.13 21 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

/etc/init.d/keepalived start

增加虚拟ip:
/etc/init.d/keepalived stop
real server :
ip addr add 172.25.42.140
arptables -A IN -d 172.25.42.140 -j DROP
arptables -A OUT -s 172.25.42.140 -j mangle --mangle-ip-s 172.25.42.140
/etc/init.d/keepalived start
测试:

keepalived 与 heartbeat 相比takeover速度非常快 几乎没有时间的延迟
我们可以在两台机器上面 ipvsadm -l 看到 不管这台机器是不是主调度器 上面都会有调度信息

技术分享












 


lvs