LVS+Keepalive 实现负载均衡高可用集群

一、LVS 介绍

        目前LVS已经被集成到Linux内核模块中。LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器,该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。

二、LVS集群搭建

(1)环境搭建:client --> DR -->RS --client

LVS无需安装

安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive

ipvsadm是通过命令行管理,而keepalive读取配置文件管理

主机名 主机IP 备注
server1 172.25.1.1

1.这里使用的是redhat7.6系统

2.防火墙和selinux都关闭

3.server2、3的作为RS机子http访问结果为主机名

4.server1 作为DR机 下载ipvsam

5.server1 添加虚拟ip地址(VIP)

172.25.1.100

server2 172.25.1.2
server3 172.25.1.3
server4 172.25.1.4

 (2)安装ipvsam管理工具

yum install ipvsadm -y

 (3) 在server1 eth0网卡绑定VIP地址(高可用)

ip addr add 172.25.1.100/24 dev eth0

(4) 添加虚拟服务以及将其关联到真实服务器上去

ipvsadm -A -t 172.25.1.100:80 -s rr       # 添加虚拟服务
ipvsadm -a -t 172.25.1.100:80 -r 172.25.1.2:80 -g    #将虚拟服务关联到真实服务上
ipvsadm -a -t 172.25.1.100:80 -r 172.25.1.3:80 -g

#LVS默认无80端口,需另外添加新的虚拟IP记录

(5) 查看配置结果

(6)web服务器配置

给两台服务器上的网卡绑定VIP地址

[root@server2 ~]# ip addr add 172.25.1.100/32 dev eth0
[root@server3 ~]# ip addr add 172.25.1.100/32 dev eth0

抑制ARP响应(noarp)

作用使得

yum install arptables.x86_64 -y
[root@server2 html]# arptables -A INPUT -d 172.25.1.100 -j DROP
[root@server2 html]# arptables -A OUTPUT -s 172.25.1.100 -j mangle --mangle-ip-s 172.25.1.2


[root@server3 html]# arptables -A INPUT -d 172.25.1.100 -j DROP
[root@server3 html]# arptables -A OUTPUT -s 172.25.1.100 -j mangle --mangle-ip-s 172.25.1.3

查看策略 

实验效果:实现负载均衡

arp解析查看 

arp详解
01.ARP协议,全称"Address Resolut ion Protocol",中文名是地址解析协议,使用ARP协议可实现通过IP地址获得对应主机的物理地址(MAC地址)

 ARP协议要求通信的主机双方必须在同一个物理网段(即局域网环境)!

02.为了提高IP转换MAC的效率,系统会将解析结果保存下来,这个结果叫做ARP缓存

三、LVS集群的工作模式

DR直接路由模式

client --> DR -->RS --client

DR模式是通过改写请求报文的目标MAC地址,将请求发送给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。

DR技术可极大地提高集群系统的伸缩性,但要求调度器与真实服务器RS都有一块物理网卡连在同一物理网段上,即必须在同一局域网(VLAN)环境。

NAT模式

client --> vs --> rs --> vs --> client

通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器,真实服务器的响应报文处理之后,返回时必须通过调度器,经过调度器时报文的源地址被重写,再返回给客户,完成整个副在调度过程。

TUN 工作模式(隧道工作模式)

客户请求包封装在一个IP tunnel里面,然后发送给RS节点服务器,节点服务器接收到之后解开IP tunnel后,进行响应处理。并且直接把包通过自己的外网地址发送给客户不用经过LB服务器
不足:

1、RS配置复杂(IPIP模块)
2、RS上绑定VIP,风险比较大

FULLNAT(系统不自带)

LVS的DR和NAT模式要求RS和LVS在同一VLAN 中,导致部署成本过高,TUNNEL模式虽然可以跨vlan,但RealServer 上需要部署ipip隧道模块等,网络拓扑上需要连通外网,教为复杂,不易运维,

为解决上述问题,开发出FULLNAT,该模式和NAT模式的区别是:数据包进入时,除了做DNAT,还做SNAT(用户ip-->内网ip),从而实现lvs-真实服务器之间可以跨vlan通讯,真实服务器需要连接内网。类似于地铁站多个闸机。

四、Keepalive+LVS实现

Keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

(1)在server1和server4上安装Keepalive 

[root@server1 ~]# yum install keepalived -y
[root@server4 ~]# yum install   ipvsadm keepalived -y

(2)编写keepalived.conf配置文件

server1

! Configuration File for keepalived

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from keepalive@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.1.100
    }
}

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

    real_server 172.25.1.2 80 {
        weight 1
        TCP_CHECK{
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
   real_server 172.25.1.3 80 {
        weight 1
        TCP_CHECK{
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

server4

(3)开启keepalived服务

systemctl start keepalived.service

查看vip

查看LVS状态

 keepalive健康检查功能

delay_loop 隔多长时间做一次健康检测,单位为秒 

connect_timeout  连接超时时间,单位为秒

nb_get_retry  检测失败后的重试次数,如果达到重试次数仍然失败,将后端从服务器池中移除。

delay_before_retry  失败重试的间隔时间,单位为秒

测试:

注意:因为虚拟的ip重启之后就会失效,故须加入开机启动项rc.local文件并赋予其可执行权限

猜你喜欢

转载自blog.csdn.net/Sun__s/article/details/112000829