LVS DR模型负载均衡 健康检查

LVS简介

  1. LVS(Linux virtual server),即Linux虚拟服务器。是因为LVS自身是个负载均衡器(director),不直接处理请求,而是将请求转发至位于它后端真正的服务器realserver上,所以是虚拟服务器
  2. LVS是四层(传输层tcp/udp)、七层(应用层)的负载均衡工具,只不过大众一般都使用它的四层负载均衡功能ipvs,而七层的内容分发负载工具ktcpvs(kernel tcp virtual server)不怎么完善,使用的人并不多。
  3. LVS相关的几种IP:
  • VIP :virtual IP,LVS服务器上接收外网数据报文的网卡IP地址。
  • DIP :director,LVS服务器上发送数据报文到realserver的网卡IP地址。
  • RIP :realserver(常简称为RS)上的IP,即提供服务的服务器IP。
  • CIP :客户端的IP。
  1. LVS的四种工作模式
  • DR > TUN(隧道) > NAT > FULLNAT
  • DR(直接路由模式): client ->VS -> RS ->client
  • NAT(地址转换模式): client ->VS -> RS
  • TUN(隧道模式): client -> VS ->RS ->client
    #以上三种都没有抗攻击能力
  • FULLNAT: client ->VS -> RS #支持多vlan,抗攻击,进行两次NAT
  • 五元组:地址,目标地址,端口,目标端口,协议

DR(直接路由模式): client ->VS -> RS ->client

它的报文转发方法是将报文直接路由给目标服务器。在VS/DR 中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后 的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现 报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。
在VS/DR中,根据缺省的TCP/IP协议栈处理,请求报文的目标地址为VIP,响应报文的源地址肯
定也为VIP,所以响应报文不需要作任何修改,可以直接返回给客户,客户认为得到正常的服务,而不会知道是哪一台服务器处理的。VS/DR负载调度器跟VS/TUN一样只处于从客户到服务器的半连接中,按照半连接的TCP有限状态机进行状态迁移。

随机匹配MAC地址

  1. 在server1上:
    我们需要ipvsadm来编写策略,而一般的yum源里没有ipvsadm,所以我们需要扩充高可用yum源

[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo
[rhel6.5]
name=rhel6.5
baseurl=http://172.25.78.250/rhel6.5
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.78.250/rhel6.5/LoadBalancer
enabled=1
在这里插入图片描述
[root@server1 ~]# yum repolist
[root@server1 ~]# yum install -y ipvsadm # 下载编写调度策略的软件
[root@server1 ~]# ipvsadm -l # 查看策略
[root@server1 ~]# ipvsadm -A -t 172.25.78.100:80 -s rr # 添加算法,-A表示添加一个虚拟服务,把数据进行分摊,rr表示轮询调度算法
[root@server1 ~]# ipvsadm -a -t 172.25.78.100:80 -r 172.25.78.2:80 -g # 添加虚拟ip,-a表示添加,-g表示采用直连模式即DR模式
[root@server1 ~]# ipvsadm -a -t 172.25.78.100:80 -r 172.25.78.3:80 -g
[root@server1 ~]# ipvsadm -l # 再次查看发现策略添加成功
在这里插入图片描述
[root@server1 ~]# ip addr add 172.25.78.100/24 dev eth0 # 给eth0设备上添加虚拟ip
[root@server1 ~]# ip addr show # 查看添加成功
在这里插入图片描述
[root@server1 ~]# /etc/init.d/ipvsadm save # 保存策略
[root@server1 ~]# cat /etc/sysconfig/ipvsadm # 这样我们添加的策略就可以在文件中查看了
-A -t 172.25.78.100:80 -s rr
-a -t 172.25.78.100:80 -r 172.25.78.2:80 -g -w 1
-a -t 172.25.78.100:80 -r 172.25.78.3:80 -g -w 1
在这里插入图片描述

  1. 在server2和server3上

[root@server2 ~]# /etc/init.d/httpd start
[root@server3 ~]# /etc/init.d/httpd start

在真机上访问测试(虽然测试不成功,后端服务器确实被调度了,这是因为后端服务器没有相应的ip取响应,所以才不会成功)
在server1(调度器)上查看

[root@server1 ~]# ipvsadm -l

在这里插入图片描述

  1. 在后端服务器上添加虚拟ip去响应调度器

[root@server2 ~]# ip addr add 172.25.78.100/32 dev eth0 # 32表示此ip只在本机使用
[root@server3 ~]# ip addr add 172.25.78.100/32 dev eth0

  1. 再次测试,发现可以成功响应(实现轮询)

[kiosk@foundation78 Desktop]$ curl 172.25.78.100
www.westos.org – server3
[kiosk@foundation78 Desktop]$ curl 172.25.78.100
www.westos.org —server2
[kiosk@foundation78 Desktop]$ curl 172.25.78.100
www.westos.org – server3
[kiosk@foundation78 Desktop]$ curl 172.25.78.100
www.westos.org —server
在这里插入图片描述[kiosk@foundation78 Desktop]$ arp -an | grep 100 #查看172.25.78.100绑定的mac地址
? (172.25.78.100) at 52:54:00:c2:0c:10 [ether] on br0
在这里插入图片描述
经过查看,发现绑定的是调度器(server1)上的,所以才会在后端服务器上进行轮询
在这里插入图片描述
[kiosk@foundation78 Desktop]$ arp -d 172.25.78.100 # 清除缓存,出现这种情况的原因是权限不够,切换到root就行了
SIOCDARP(dontpub): Operation not permitted
[kiosk@foundation78 Desktop]$ su -
Password:
[root@foundation78 ~]# arp -d 172.25.78.100 # 清除缓存
[root@foundation78 ~]# curl 172.25.78.100 # 再次测试发现访问的是server2
www.westos.org —server2
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org —server2
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org —server2

  • 经过测试发现,可以看出其访问具有随机性,因为三台server在同一VLAN下具有相同的ip,因此并不能保证每次都访问的是调度器server1,如果访问到的不是server1(调度器),那么后端服务器就会被客户端直接访问,后果不堪设想,因此我们现在来解决这个问题,为了让客户端通过vs访问服务器,需要给rs设置ARP抑制,来禁止客户端直接访问服务器度器

用arptables实现绑定mac地址

  • arptables是控制内核响应,用来屏蔽数据包,拦截ip冲突,因为虚拟机与real-server的地址一致啊,所以进入
  • real-server时就需要把虚拟ip DROP掉,也就就是拦截掉real-server的虚拟ip
  1. 在后端服务器上设置

[root@server2 ~]# yum install -y arptables_jf
[root@server2 ~]# arptables -L # 查看策略
在这里插入图片描述
[root@server2 ~]# arptables -A IN -d 172.25.78.100 -j DROP # 当172.25.78.100来访问时,直接DROP掉,不做响应
[root@server2 ~]# arptables -A OUT -s 172.25.78.100 -j mangle --mangle-ip-s 172.25.78.2 # -A控制arp协议,由于tcp三次握手原因,所以出去的时候仍要以vip地址出去才会实现握手,而真正将数据传输给客户端的就是real-server, mangle参数就是这个功能
[root@server2 ~]# /etc/init.d/arptables_jf save
[root@server2 ~]# arptables -L # 查看策略添加成功
在这里插入图片描述
[root@server3 ~]# yum install -y arptables_jf
[root@server3 ~]# arptables -A IN -d 172.25.78.100 -j DROP
[root@server3 ~]# arptables -A OUT -s 172.25.78.100 -j mangle --mangle-ip-s 172.25.78.3
[root@server3 ~]# /etc/init.d/arptables_jf save
在这里插入图片描述

  1. 测试

[root@foundation78 ~]# arp -d 172.25.78.100 # 清除缓存
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org – server3
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org —server2
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org – server3
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org —server2
在这里插入图片描述

健康检查

  • 当后端服务器挂掉之后,客户端会发现异常,这不是我们的目的,我们要让客户端更好的享用服务,所以我们需要在调度器上对服务端进行健康检查
  1. 在server2和server3上

[root@server2 ~]# /etc/init.d/httpd stop
[root@server3 ~]# /etc/init.d/httpd stop

  1. 测试

[root@foundation78 ~]# curl 172.25.78.100 # 在客户端直接就看到报错了
curl: (7) Failed connect to 172.25.78.100:80; Connection refused
[root@foundation78 ~]# curl 172.25.78.100
curl: (7) Failed connect to 172.25.78.100:80; Connection refused

配置健康检查,解决问题

  1. 在调度器上

[root@server1 ~]# ipvsadm -C # 清除所有的策略
[root@server1 ~]# /etc/init.d/ipvsadm save # 保存策略
[root@server1 ~]# ipvsadm -A -t 172.25.78.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.78.100:80 -r 172.25.78.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.78.100:80 -r 172.25.78.3:80 -g
[root@server1 ~]# vim /etc/yum.repos.d/rhel-source.repo # 配置改可用yum源
[rhel6.5]name=rhel6.5
baseurl=http://172.25.78.250/rhel6.5
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release[LoadBalancer]
name=LoadBalancer
baseurl=http://172.25.78.250/rhel6.5/LoadBalancer
enabled=1
[HighAvailability]name=HighAvailability
baseurl=http://172.25.78.250/rhel6.5/HighAvailability
enabled=1
在这里插入图片描述
[root@server1 ~]# yum install -y ldirectord-3.9.5-3.1.x86_64.rpm -y
[root@server1 ~]# rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm # 查看所有的配置文件
在这里插入图片描述
[root@server1 ~]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/
[root@server1 ~]# cd /etc/ha.d/
[root@server1 ha.d]# vim ldirectord.cf
virtual=172.25.78.1:80
real=172.25.78.2:80 gate
real=172.25.78.3:80 gate
fallback=127.0.0.1:80 gate
service=http
scheduler=rr
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80
request=“index.html”
#receive=“Test Page”
#virtualhost=www.x.y.z
在这里插入图片描述[root@server1 ha.d]# /etc/init.d/ldirectord start
[root@server1 ha.d]# cd /var/www/html/
[root@server1 html]# ls
bansys class_socket.php config.php index.php purge_action.php static
[root@server1 html]# rm -fr *
[root@server1 html]# vim index.html
网站正在维护中。。。[
root@server1 html]# vim /etc/httpd/conf/httpd.conf # 修改端口
Listen 80
[root@server1 html]# /etc/init.d/httpd restart

  1. 再次测试,客户端就不会发现异常

[root@foundation78 ~]# curl 172.25.78.100
www.westos.org —server2
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org —server2
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org —server2
在这里插入图片描述
当所有的后端服务器都down时,调度器会给客户端回应
[root@foundation78 ~]# curl 172.25.78.100
网站正在维护中。。。
[root@foundation78 ~]# curl 172.25.78.100
网站正在维护中。。。
[root@foundation78 ~]# curl 172.25.78.100
网站正在维护中。。。

  • 我们现在解决了后端服务器的后端检查,但是,我们只有一个调度器,当我们的调度器down掉之后,后端服务器就都不能使用,所以我们现在来做高可用,防止调度器down

给集群做高可用(keepalived)

  1. keepalived主要作用
  • keepalived采用VRRP(virtual router redundancy protocol),虚拟路由冗余协议,以
    软件的形式实现服务器热备功能。通常情况下是将两台linux服务器组成一个热备组(master-backup),同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用IP地址(VIP),这个VIP只存在master上并对外提供服务。如果keepalived检测到master宕机或服务故障,备服务器(backup)会自动接管VIP成为master,keepalived并将master从热备组移除,当master恢复后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能。
  1. 在server1上

[root@server1 ~]# tar zxf keepalived-2.0.6.tar.gz
[root@server1 ~]# cd keepalived-2.0.6
[root@server1 keepalived-2.0.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV # 编译的时候会有依赖
[root@server1 keepalived-2.0.6]# yum install -y openssl-devel # 下载依赖包
[root@server1 keepalived-2.0.6]# ./configure --prefix=/usr/local/keepalived --with-init=SYSV # 再次编译
在这里插入图片描述
[root@server1 keepalived-2.0.6]# make && make install
[root@server1 keepalived-2.0.6]# cd /usr/local/
[root@server1 local]# ls
keepalived
[root@server1 local]# chmod +x /usr/local/keepalived/etc/rc.d/init.d/keepalived
[root@server1 local]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d
[root@server1 local]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server1 local]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server1 local]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 local]# /etc/init.d/ldirectord stop # keepalived自带健康检查,所以不需要ldirectord来健康检查
[root@server1 local]# chkconfig ldirectord off
[root@server1 local]# ip addr del 172.25.78.100 dev eth0 # 删除虚拟ip,因为keepalived会自动生成虚拟ip
[root@server1 local]# cd
[root@server1 ~]# cd /etc/keepalived/
[root@server1 keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost # 指定keepalived在发生切换时需要发送email到的对象,一行一个
}
notification_email_from keepalived@localhost # 指定发件人
smtp_server 127.0.0.1 # 指定smtp服务器地址,此处写本机
smtp_connect_timeout 30 # 指定smtp连接超时时间
router_id LVS_DEVEL # 运行keepalived机器的一个标识
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 78 # VPID标记 相同VRID的LVS属于同一组,根据优先级选举出一个主
priority 100 #优先级,高优先级竞选为master
advert_int 1 # 检查间隔,默认1秒
authentication { # 设置认证
auth_type PASS # 认证方式
auth_pass 1111 # 认证密码(密码只识别前8位)
}
virtual_ipaddress { # 设置vip
172.25.78.100
}
}
virtual_server 172.25.78.100 80 {
delay_loop 6 # 健康检查时间间隔
lb_algo rr # 调度算法
lb_kind DR # 负载均衡转发规则
persistence_timeout 50 # 会话保持时间
protocol TCP # 使用的协议
real_server 172.25.78.2 80 {
TCP_CHECK{
weight 1 # 默认为1,0为失效
connect_timeout 3 # 连接超时时间
retry 3 # 重连次数
delay_before_retry 3 # 重连间隔时间
}
}
real_server 172.25.78.3 80 {
TCP_CHECK{
weight 1
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}

在这里插入图片描述
在这里插入图片描述

[root@server1 keepalived]# /etc/init.d/keepalived start
[root@server1 keepalived]# scp -r /usr/local/keepalived/ server4:/usr/local/
[root@server1 keepalived]# ip addr show
在这里插入图片描述

  1. 在另外一台调度器上

[root@server4 ~]# vim /etc/yum.repos.d/rhel-source.repo
在这里插入图片描述[root@server4 ~]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d
[root@server4 ~]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server4 ~]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server4 ~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server4 ~]# cd /etc/keepalived/
[root@server4 keepalived]# vim keepalived.conf
18 state BACKUP # 设置server4为备用
21 priority 50 # 修改优先级,比master的优先级低即可
[root@server4 keepalived]# /etc/init.d/keepalived start

  1. 测试
  • 当两台后端服务器都正常服务时

[root@foundation78 ~]# curl 172.25.78.100
www.westos.org – server3
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org —server2
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org – server3
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org —server2

  • 当一台服务器坏掉之后

[root@server2 ~]# /etc/init.d/httpd stop

  • 测试

[root@foundation78 ~]# curl 172.25.78.100 # 调度器会自动进行健康检查,如果出现报错,是延迟的问题,等一会儿就好了
www.westos.org – server3
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org – server3
[root@foundation78 ~]# curl 172.25.78.100
www.westos.org – server3

  • 当一台主调度器down掉之后,会自动切换到备用调度器

[root@server4 keepalived]# ip addr show # 查看备用调度器,虚拟ip已经自动切换了

在这里插入图片描述
LVS中文官方手册: http://www.linuxvirtualserver.org/zh/index.html 。
LVS英文官方手册: http://www.linuxvirtualserver.org/Documents.html 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值