1:LVS(Linux Virtual Server)即为Linux虚拟服务器。

lvs是Linux的负载均衡器,他的特点是只会转发请求,但是不会处理相应。就相当于一扇门,只有进的人,人从其他的出口出去,那么这一扇们的性能就非常好。

Nginx的网络拓扑图(请求,响应都会通过Nginx)

lvs网表svn version_lvs网表svn version


lvs的网络拓扑图(lvs不会处理相应)

lvs网表svn version_lvs网表svn version_02

2 lvs的三种

2.1:NAT模式(类似于Nginx),所有的请求和相应都会经过lvs,在并发不高的情况下,这种模式也是没有问题的。

lvs网表svn version_lvs网表svn version_03

2.2 TUN模式,相应不会经过LVS,每个Real Server都必须有网卡,并且每个服务都是暴露在公网的。

lvs网表svn version_网络_04

2.3 DR 直接路由模式,服务不会暴露在公网中,相应会通过一个路由,由路由做出相应

lvs网表svn version_lvs_05

3:本地实现LVS的DR模式

注意:阿里云不支持虚拟IP,需要购买他的负载均衡,腾讯云虽然支持但是需要额外购买,一个节点最多10个虚拟IP

服务器与ip规划:

LVS - 1台
VIP(虚拟IP):192.168.3.69
DIP(转发者IP/内网IP):192.168.3.68
Nginx - 2台(RealServer)
RIP(真实IP/内网IP):192.168.3.80
RIP(真实IP/内网IP):192.168.3.81
所有计算机节点关闭网络配置管理器,因为有可能会和网络接口冲突:(本地虚拟机)

systemctl stop NetworkManager 
systemctl disable NetworkManager

进入ens33所在目录

cd /etc/sysconfig/network-scripts

复制ens33

cp ifcfg-ens33  ifcfg-ens33:1

修改

DEVICE=ens33:1
# 虚拟IP
IPADDR=192.168.3.69

重启网络

service network restart

查看

ip addr

lvs网表svn version_lvs_06


安装ipvsadm

现如今的centos都是集成了LVS,所以ipvs是自带的,相当于苹果手机自带ios,我们只需要安装ipvsadm即可(ipvsadm是管理集群的工具,通过ipvs可以管理集群,查看集群等操作),命令如下:

yum install ipvsadm

安装好后检查

ipvsadm -Ln

lvs网表svn version_IP_07


为两台RealServer配置网络接口

进入网络配置目录

cd /etc/sysconfig/network-scripts
# 配置子接口
cp ifcfg-lo ifcfg-lo:1
#修改内容
DEVICE=lo:1
#虚拟IP
IPADDR=192.168.3.69
#子网
NETMASK=255.255.255.255
# 然后重启
service network restart 或者 ifup ifcfg-lo:1

lvs网表svn version_lvs网表svn version_08


为两台Real Service实现arp

lvs网表svn version_lvs_09


配置ARP

打开sysctl.conf:

vim /etc/sysctl.conf

# configration for lvs
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

刷新配置文件

sysctl -p

增加一个网关,用于接收数据报文,当有请求到本机,就会交给lo处理

route add -host 192.168.3.69 dev lo:1

如果报route找不到,则

yum install net-tools

防止重启失效,做如下处理,用于开机自启动:

echo "route add -host 192.168.1.150 dev lo:1" >> /etc/rc.local

搭建LVS-DR模式- 使用ipvsadm配置集群规则
创建LVS节点,用户访问的集群调度者

ipvsadm -A -t 192.168.3.69:80 -s rr -p 5
# -A:添加集群
# -t:tcp协议
# ip地址:设定集群的访问ip,也就是LVS的虚拟ip
# -s:设置负载均衡的算法,rr表示轮询
# -p:设置连接持久化的时间

创建2台RS真实服务器

ipvsadm -a -t 192.168.3.69:80 -r 192.168.3.80:80 -g
ipvsadm -a -t 192.168.3.69:80 -r 192.168.3.81:80 -g
# -a:添加真实服务器
# -t:tcp协议
# -r:真实服务器的ip地址
# -g:设定DR模式

保存到规则库,否则重启失效

ipvsadm -S

检查集群

查看集群列表

ipvsadm -Ln

查看集群状态

ipvsadm -Ln --stats

其他命令:

# 重启ipvsadm,重启后需要重新配置
    service ipvsadm restart
    # 查看持久化连接
    ipvsadm -Ln --persistent-conn
    # 查看连接请求过期时间以及请求源ip和目标ip
    ipvsadm -Lnc
    
    # 设置tcp tcpfin udp 的过期时间(一般保持默认)
    ipvsadm --set 1 1 1
    # 查看过期时间
    ipvsadm -Ln --timeout
#更详细的帮助文档:

ipvsadm -h
man ipvsadm

虽然配置的是轮训,但是lvs有默认的超时时间

4:lvs+keepalived+nginx

先要删除所有配置的DR

ipvsadm -C

配置keepalived的配置文件

! Configuration File for keepalived

global_defs {
   router_id keep_82
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        #192.168.200.16
        #192.168.200.17
        #192.168.200.18
        192.168.3.69
    }
}
#配置lvs
virtual_server 192.168.3.69 80 {           #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开
    delay_loop 6                              #每隔6秒查询realserver状态
    lb_algo rr                                #后端调试算法(load balancing algorithm)
    lb_kind DR                                #LVS调度类型NAT/DR/TUN
    persistence_timeout 10                   #同一IP的连接10秒内被分配到同一台realserver
    protocol TCP                              #用TCP协议检查realserver状态
    real_server 192.168.3.80 80 {
        weight 1                              #权重,最大越高,lvs就越优先访问
        TCP_CHECK {                           #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10                #10秒无响应超时
            retry 3                           #重连次数3次
            delay_before_retry 3              #重连间隔时间
            connect_port 80                   #健康检查realserver的端口
        }
    }
    real_server 192.168.3.81 80 {
        weight 1                              #权重,最大越高,lvs就越优先访问
        TCP_CHECK {                           #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 10                #10秒无响应超时
            retry 3                           #重连次数3次
            delay_before_retry 3              #重连间隔时间
            connect_port 80                   #健康检查realserver的端口
        }
    }
}