LVS实践篇:LVS(DR)实现负载均衡、lvs+ldirectord、lvs+keepalived、LVS负载均衡排错

lvs实践篇:LVS(DR)实现负载均衡、lvs+ldirectord、lvs+keepalived、LVS负载均衡排错

一、通过lvs实现负载均衡

1、实验环境

  • VS:172.25.70.1 hostname:lvs
  • VIP:172.25.70.100
  • REALSERVER:
    • 172.25.70.2 hostname:RS1
    • 172.25.70.3 hostname:RS2
  • client: 172.25.254.70

2、安装配置VS(调度器)

LVS负载均衡的实现是基于Linux内核模块ipvs,和iptables一样是直接工作在内核中,默认的镜像源中已经集成了ipvs模块

 ##为了安装管理工具ipvsdam,所以应该先配置完整的yum源,镜像源挂载在真实主机上
 真实主机的ip为172.25.70.250
[root@lvs ~]# vim /etc/yum.repos.d/yum.repo
[rhel6.5]
name=rhel6.5
baseurl=http://172.25.70.250/rhel6.5
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.70.250/rhel6.5/LoadBalancer
gpgcheck=0

[HighAvailability]
name=HighAvailability
baseurl=http://172.25.70.250/rhel6.5/HighAvailability
gpgcheck=0

[ResilientStorage]
name=ResilientStorage
baseurl=http://172.25.70.250/rhel6.5/ResilientStorage
gpgcheck=0

[ScalableFileSystem]
name=ScalableFileSystem
baseurl=http://172.25.70.250/rhel6.5/ScalableFileSystem
gpgcheck=0

 ##安装ipvsadm
[root@lvs ~]# yum install -y ipvsadm

 ##添加vip
[root@lvs ~]# ip addr add 172.25.70.100/24 dev eth0
[root@lvs ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:e6:18:54 brd ff:ff:ff:ff:ff:ff
    inet 172.25.70.1/24 brd 172.25.70.255 scope global eth0
    inet 172.25.70.100/24 scope global secondary eth0
    inet6 fe80::5054:ff:fee6:1854/64 scope link 
       valid_lft forever preferred_lft forever

 ##配置ipvsadm的策略
[root@lvs ~]# ipvsadm -A -t 172.25.70.100:80 -s rr  #设置调度器的ip,以及算法,rr为轮询,-t表示指定虚拟服务为tcp服务
 ##添加realserver
[root@lvs ~]# ipvsadm -a -t 172.25.70.100:80 -r 172.25.70.2:80 -g
[root@lvs ~]# ipvsadm -a -t 172.25.70.100:80 -r 172.25.70.3:80 -g

 ##保存策略并开启服务,显示为ok则表示开启成功
[root@lvs ~]# /etc/init.d/ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]
[root@lvs ~]# /etc/init.d/ipvsadm start
ipvsadm: Clearing the current IPVS table:                  [  OK  ]
ipvsadm: Applying IPVS configuration:                      [  OK  ]

 ##查看策略
[root@lvs ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.70.100:http rr
  -> 172.25.70.2:http             Route   1      0          0         
  -> 172.25.70.3:http             Route   1      0          0         

3、ipvsadm配置参数说明

  • -A:增加一台虚拟服务器VIP地址
  • -t:虚拟服务器提供的是TCP服务
  • -s:使用的调度算法
  • -a:在虚拟服务器中增加一台后端真实服务器
  • -r:指定真实服务器地址
  • -w:后端真实服务器的权重
  • -m:设置当前转发方式为NAT模式
  • -g:模式为直接路由模式
  • -i:模式为隧道模式

4、配置realserver

在这里,需要设置realserver隐藏vip,因为如果不隐藏的话,VS和RS在局域网中会有多个相同的ip生效(VIP),会导致IP冲突,数据流传输混乱。而且如果隐藏VS调度器的VIP,客户端访问VIP时会得到来自RS其中某一台的数据,mac地址也是RS中的一台,不能实现MAC地址转换,那么负载均衡也就没有意义

隐藏RS的VIP可以通过两种方法,一种是通过修改RS的内核参数,还有一种是设置ARP策略,因为DR模式实现MAC的转换是通过ARP协议来实现的。这里两台RS通过两种不同的方法来实现,实际情况下随便用哪一种都可,但同一个RS只做一种即可

ip addr add 172.25.92.100/24 dev eth0   ##添加vip,所有的RS均需要
/etc/init.d/httpd start  #开启apache服务

 ##RS1通过修改内核参数
vim /etc/sysctl.conf    ##添加下面四行
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

sysctl -p   #修改生效

 ##RS2通过修改arp策略来隐藏
/etc/init.d/httpd start     #开启apche服务
yum install -y arptables_jf.x86_64  #安装arptbles的管理工具
ip addr add 172.25.70.100/24 dev eth0   #添加vip
arptables -A IN -d 172.25.70.100 -j DROP    #丢弃对本机上172.25.70.100发来的所有数据包
arptables -A OUT -s 172.25.70.100 -j mangle --mangle-ip-s 172.25.70.3        #隐藏vip,只是对外公布自己的真实ip
/etc/init.d/arptables_jf save           #保存arp策略

5、测试

(1)在client上访问虚拟ip查看显示是否实现了负载均衡,以及ARP是否是通过VS
这里写图片描述
这里写图片描述

可以看到成功实现了负载均衡
(2)此时,关闭RS中的某一个服务,查看是否是轮询算法
这里写图片描述

二、lvs+ldirectord

1、ldirectord功能

ldirectord用来实现LVS负载均衡资源在主、备节点间的故障转移。在首次启动时,ldirectord可以自动创建IPVS表。此外,它还可以监控各RealServer的运行状态,一旦发现某RealServer运行异常时,还可以将其从IPVS表中移除。

ldirectord 进程通过向RealServer的RIP发送资源访问请求并通过由RealServer返回的响应信息来确定RealServer的运行状态。在 Director上,每一个VIP需要一个单独的ldirectord进程。如果RealServer不能正常响应Director上 ldirectord的请求,ldirectord进程将通过ipvsadm命令将此RealServer从IPVS表中移除。而一旦 RealServer再次上线,ldirectord会将其重新添加至IPVS表中

2、安装配置ldirectord

在lvs主机上安装配置ldirectord,直接从官网上下载的rpm包进行安装
[root@lvs ~]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm
[root@lvs ~]# rpm -ql ldirectord    ##查看生成的文件
[root@lvs ~]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/

 ##修改配置文件,修改25到38行之间的内容
[root@lvs ~]# vim /etc/ha.d/ldirectord.cf
 25 virtual=172.25.70.100:80    ##LVS使用的VIP和端口
 26         real=172.25.70.2:80 gate  ##realserver
 27         real=172.25.70.3:80 gate
 28         fallback=127.0.0.1:80 gate  #当所有的RS都宕掉后,使用本地地址回应
 29         service=http    ##服务
 30         scheduler=rr    ##LVS使用的调度算法
 31         #persistent=600   #持续时间,针对服务,ftp应该设置持续时间
 32         #netmask=255.255.255.255
 33         protocol=tcp   # 定义此虚拟服务用到的协议
 34         checktype=negotiate   # ldirectord进程用于监控RealServer的方法;{negotiate|connect|A number|off}
 35         checkport=80    # 指健康检查使用的端口;
 36         request="index.html"  # 检查RealServer用到的页面
 37         #receive="Test Page"  # 检查RealServer用到的页面内容
 38         #virtualhost=www.x.y.z

 ##不要忘记先打开上面那个实验最后关闭的RS1的apache服务

 ##这里需要先关闭ipvsadm本身的策略,然后打开ldirectord,配置的策略会自动加载进去
[root@lvs ~]# /etc/init.d/ipvsadm stop
[root@lvs ~]# ipvsadm -l    #此时策略为空
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lvs ~]# /etc/init.d/ldirectord start
[root@lvs ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.70.100:http rr
  -> 172.25.70.2:http             Route   1      0          0         
  -> 172.25.70.3:http             Route   1      0          0 

3、测试

(1)先关闭某一个RS服务,查看ipvsadm的策略内容
这里写图片描述
(2)将两个RS服务都关闭,查看策略是否是配置文件设置的本地
这里写图片描述

则此时健康检查设置成功!

三、lvs+keepalived

1、加入keepalived的原因

如果单台LVS发生突发情况,例如宕机、发生不可恢复等,会导致用户无法访问后端所有的应用程序。为了避免这种问题导致网站长时间不可用,可以使用HA方案实现故障切换,可以基于LVS+keepalived实现负载均衡及高可用,满足网站稳定高效运行。

如果使用了keepalived的配置,就不需要执行ipvsadm添加均衡的realserver命令,所有的都在keepalived的配置文件里面设置

keepalived的功能其实和ldirectord类似,它们两会产生冲突,所以做这个实验时,需要先把ldirectord关掉

2、安装配置

keepalived的安装等在上一篇博客中有写到,这里直接从修改配置文件开始

这里不仅做了http还做了ftp,那么真实主机也需要安装ftp并且创建文件等用来测试,这里就展示这些工作了

[root@lvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict   #此处应该注释掉,否则开启keepalived后会默认将vip(172.25.92.100)加入到iptables的禁止访问列表中,可以通过iptables -L看到
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 92
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.70.100
    }
}

 ##http
virtual_server 172.25.70.100 80 {
    delay_loop 1
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50    #持续连接一台RS的时间,对于ftp服务需要开启
    protocol TCP

    real_server 172.25.70.2 80 {
        weight 1
    TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
    real_server 172.25.70.3 80 {
        weight 1
    TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

 ##ftp
virtual_server 172.25.70.100 21 {
    delay_loop 1
    lb_algo rr
    lb_kind DR
    persistence_timeout 50    #ftp服务需要保持持续连接时间,防止传输的数据流中断
    protocol TCP

    real_server 172.25.70.2 21 {
        weight 1
        TCP_CHECK {
            connect_port 21
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }

    real_server 172.25.70.3 21 {
        weight 1
        TCP_CHECK {
            connect_port 21
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

3、测试

(1)测试http是否实现了负载均衡,并且是否实现了keepalived的高可用
这里写图片描述
这里写图片描述
这里写图片描述
(2)测试ftp
这里写图片描述

可以看到,当有两台主机同时访问172.25.70.100的ftp时,其中一个是RS1提供的服务,一个是RS2提供的服务,实现了负载均衡!

如果只有一台keepalived的话,当这台keepalived出现问题的话,也会造成网站无法访问,所以也可以做keepalived的主备,而这个的实现可以参考上一篇专门写keepalived的博客,里面有实现

四、LVS负载均衡排错

在lvs+keepalived+nginx架构中,如果突然发现网站的部分用户访问比较慢,甚至出现无法访问的情况,这个问题排错如下:

  1. 客户端ping www.xxx.com,通过ping返回域名对应的IP是否正常
  2. 如果无法返回IP,或者响应较慢,定位问题为DNS或者网络延迟问题,windows主机可以通过tracert www.xxx.com,而linux主机通过traceroute www.xxx.com测试客户端主机到服务器的链路延迟;
  3. 登录LVS服务器,用ipvsadm -Ln查看当前后端Web连接信息
  4. 一般LVS的实际算法都是wlc,加权最少连接算法。如果网站部分用户无法访问,那么可以猜测是其中一台后端的Web服务器无法访问或者访问较慢导致。但如果单台Web服务器异常,keepalived又没有将它移出
  5. 此时可以查看keepalived.conf配置文件,有可能是LVS使用的是TCP检测方法,这个时候是只要80端口能通,请求就会被转发到后端服务器上。此时在lvs服务器上直接wget目前连接最多的后端服务器的http页面返回会很慢,直至超时。而其他的服务器返回正常。
  6. 造成有的用户可以访问,有的用户不可以访问的原因可能是那台后端服务器网卡上是否绑定了VIP,可能是由于排错之后这个服务器被重启,realserver的脚本配置VIP出现了异常,可以重新启动realserver的配置脚本,网站可能会恢复正常。

那么为了防止这种事件,可以增加LVS对于后端Nginx URL的检测,能访问URL表示服务正常。那么通过URL检测的话,就算后端某台服务器出现502超时错误,keepalived也会自动将这台后端服务器踢出,等待它恢复后再添加到正常的服务器列表上。

keepalived基于URL检查的代码如下,用ip地址为172.25.70.1的后端服务器为例:

 ##在keepalived.conf文件里配置该后端服务器处修改为:
real_server 172.25.70.1 {
    weight 100
    HTTP_GET {
        url {
            path /log/warn.jsp
            status_code 200
        }
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值