LVS快速入门

LVS

LVS介绍

负载均衡的作用?

解决并发压力,提高应用处理性能,增加吞吐量,加强网络处理能力。
提高故障转移,实现高可用
可以提高添加或减少服务器的数量,提供网站的可扩展性
安全防范,复杂均衡设备上做一些过滤,黑白名单处理

**负载均衡和反向代理区别 **

LVS的负载均衡是仅仅转发用户的请求数据包
nginx反向代理是接收到用户请求后,重定向后端节点发出新的请求。

为什么使用负载均衡?

负载均衡集群提供了一种廉价,有效,透明的方法,来扩展网络设备和服务器的负载,带宽,增加吞吐量,加强网络数据处理能力,提供网络的灵活性和可用性。单台集群无法承受大规模的并发访问或数据流量时,需要搭建负载均衡集群把流量分摊到多台节点设备上分别处理,既减少了用户等待响应的时间,又提升了用户体验。任意一个或多个节点设备宕机,也不会影响整个业务的运行。


负载均衡集群提供了一种廉价,有效,透明的方法,来扩展网络设备和服务器的负载,带宽,增加吞吐量,加强网络数据处理能力,并且提供了网站的可扩展性。还提供了故障转移,防止单点故障,保障了业务的高可用性。

什么时候使用nginx,什么时候使用LVS?


LVS讲解

在实际应用中,LVS常与keepalived的搭配故障,实现该可用,高性能,可伸缩,可管理的服务集群。LVS主要由内核模块,ipvs,KTCPVS与对于的管理程序ipvsadm,tcpvsadm组成。IPVS负责IP负载均衡,即四层网络交换。KTCPVS是基于内存的负载均衡,即七层网络的交换。

IPVS的工作原理:当syn报文到达时,它选择后边的一台服务器,将报文转发过去,在此之后的所有包含相同的IP和tcp报文头地址的数据包都会备转到之前选择的服务器上,这个网络级别的转发效率最高。

LVS无需安装,安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive。
ipvsadm是通过命令行管理,而keeplive读取配置文件管理。

LVS转发方式

IPVS支持三种转发方式:

VS/NAT:通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分发给后端的真实服务器,真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个调度过程。


VS/TUN:调度器包请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户。


VS/DR:通过改下请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。

DR比TUN性能稍好,它没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连在同一物理网段上,且服务器网络设备(或设备别名)不做ARP(地址解析协议)响应。

调度算法

IPVS支持十种负载均衡调度算法:

轮询
加权轮询
最少连接
加权最少连接
最少队列调度
基于局部性的最小连接
带复制的基于局部性的最少连接
目标地址散列
源地址散列
最短期望延迟

部署LVS集群

使用ipvsadm管理集群
ipvsadm 是ipvs的命令行管理工具

概念介绍:
DS 负责负载均衡调度的LVS服务器
RS 负载均衡池中真实工作的服务器
DIP DS的IP地址
RIP RS的IP地址,
CIP 客户端主机的IP地址
VIP 虚拟服务器的IP地址,在DR模式下,DS与RS除了有自己的IP,同时还需要配置相同的VIP。


1.环境准备
主机名			IP地址				软件
lvs-lb01		192.168.178.251		lvs keepalived
lvs-lb02		192.168.178.252		lvs keepalived
lvs-web01		192.168.178.253		nginx(用做web展示)
lvs-web02		192.168.178.12		nginx(用在web展示)

2.改名
hostnamectl set-hostname lvs-lb01
hostnamectl set-hostname lvs-lb02
hostnamectl set-hostname lvs-web01
hostnamectl set-hostname lvs-web02

3.机器环境初始化,防火墙,基础命令,yum源等配置
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'  /etc/sysconfig/selinux
reboot
getenforce
iptables -F

4.确保web01,web02可访问
web01:
yum install nginx -y
echo "web01 page" > /usr/share/nginx/html/index.html
nginx
[root@lvs-web01 ~]# curl 192.168.178.253
web01 page

web02:
yum install nginx -y
echo "web02 page" > /usr/share/nginx/html/index.html
nginx
[root@lvs-web02 ~]# curl 192.168.178.12
web02 page

配置lb01,
6.安装ipvsadm
查看是否支持ip_vs模块,默认是没有开启的
[root@lvs-lb01 ~]# lsmod ip_vs
Usage: lsmod
[root@lvs-lb01 ~]# lsmod |grep ip_vs

7.安装lvs管理工具
yum install ipvsadm  -y

8.激活LVS内核
[root@lvs-lb01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

9.检查系统模块支持
[root@lvs-lb01 ~]# lsmod | grep ip_vs
ip_vs                 141432  0 
nf_conntrack          133053  1 ip_vs
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

LVS搭建

开始搭建LVS
配置lvs负载均衡,在lb01上操作
1.绑定VIP地址,重启后消失
ip addr add 192.168.178.40 dev ens33
ip addr

2.清除当前所有LVS规则,-C参数,-h查看帮助
ipvsadm -C

3.设置连接超时时间,--set参数
--set tcp tcpfin udp        set connection timeout values
ipvsadm --set 30 5 60

4.激活dr转发模式
-A 添加虚拟服务器 
-t 指定虚拟服务器的IP端口
-s 指定调度算法
-p 指定超时时间

[root@lvs-lb01 ~]# ipvsadm -A -t 192.168.178.40:80  -s wrr -p 20
查看算法
[root@lvs-lb01 ~]# ipvsadm -h |grep wrr
  --scheduler    -s scheduler       one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
  
5.将虚拟服务关联到真实服务,-a参数,也就是关联到web01/web02两台机器
ipvsadm -a -t 192.168.178.40:80 -r 192.168.178.253:80 -g -w 1
ipvsadm -a -t 192.168.178.40:80 -r 192.168.178.12:80 -g -w 1

-r 指定真实服务端IP端口
-g lvs的dr模式
-w 指定权重

6.查看lvs配置结果
[root@lvs-lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.178.40:80 wrr persistent 20
  -> 192.168.178.12:80            Route   1      0          0         
  -> 192.168.178.253:80           Route   1      0          0   

ipvsadm命令参数

**ipvsadm****参数说明:(**更多参照 man ipvsadm)

参数 名称 数说明
-A –add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E –edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D –delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C –clear 清除内核虚拟服务器表中的所有记录。
-R –restore 恢复虚拟服务器规则
-S –save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a –add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e –edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d –delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
**-L\ -l** –list显示内核虚拟服务器列表
-Z –zero 虚拟服务表计数器清零(清空当前的连接数量等)
- –set tcp tcpfin udp 设置连接超时值
- –start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。
- –stop-daemon 停止同步守护进程
-h –help 显示帮助信息
-t –tcp-service service-address [vip:port] or [real-server-ip:port] 说明虚拟服务器提供的是tcp 的服务
-u –udp-service service-address [vip:port] or [real-server-ip:port] 说明虚拟服务器提供的是udp 的服务
-f –fwmark-service fwmark 说明是经过iptables 标记过的服务类型。
-s –scheduler scheduler 使用的调度算法,有这样几个选项rr\wrr\lc\wlc\lblc\lblcr\dh\sh\sed\nq默认的调度算法是: wlc
-p –persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300秒。
-M –netmask netmask persistent granularity mask
-r –real-server server-address 真实的服务器[Real-Server:port]
-g –gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i –ipip 指定LVS 的工作模式为隧道模式
-m –masquerading 指定LVS 的工作模式为NAT 模式
-w –weight weight 真实服务器的权值
- –mcast-interface interface 指定组播的同步接口
-c –connection 显示LVS 目前的连接 如:ipvsadm -L -c
- –timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
- –daemon 显示同步守护进程状态
- –stats 显示统计信息
- –rate 显示速率信息
- –sort 对虚拟服务器和真实服务器排序输出
- –numeric -n 输出IP 地址和端口的数字形式

部署web01/web02(RS)

1.在lo坏换地址上绑定VIP,让rs机器能够接收到VIP的数据包,在lo回环地址上配置VIP可以完成,且只能配置在lo回环地址上,不能在ens33上,否则会造成arp缓存紊乱,导致lvs集群无法工作。
在web01和web02两台机器上操作
ip addr add 192.168.178.40/32  dev lo

2.抑制rs服务器的arp解析,anp安装: yum install net-tools -y
Linux查看arp缓存命令是arp -n

arp协议是地址解析协议,使用arp协议可实现通过IP地址获得对应主机的物理地址(mac地址)

Linux解析ip对应的mac地址
arping -c 1 -I ens33 192.168.178.253

实验环境中,因为客户端与ds,rs在同一个物理网段中,所以会有ARP问题。DS,RS都有相同的vip,当客户端需要访问VIP地址时,rs可能先于ds对arp解析进行抢答,这样客户端就直接于RS交互,DS就起不到负载均衡的作用了,所以要在rs的相应网络接口上禁用arp功能,禁用的命令如下:

arp的作用是根据IP地址获取mac地址:
在web01/web02是操作:
cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF

让内核参数生效
sysctl -p

arp刷新
arping -I ens33 -c 1 -U 192.168.178.40  # 后面是VIP地址

测试结果:
[root@lvs-web01 ~]# curl 192.168.178.40
web01 page
[root@lvs-web02 ~]# curl 192.168.178.40
web02 page

lvs 结合 keepalived

lvs结合keepalived方案
之前的lvs虽然配置成功,也实现了负载均衡,但是微妙测试的时候发现,当某台真实的服务器把nginx停掉,director照样会把请求转发过去,这样造成了某些请求不正常。所以需要一种机制来检查真实服务器的状态,这时就可以使用keepalive.

keepalived的作用
keepalived是运行在lvs之上,它的主要功能是实现真实服务器的故障隔离以及director负载均衡间的failover(失败切换,故障转移)。


1.在lb01/lb02机器上安装keeplived
yum install keepalived -y

2.修改配置文件,lb01
养成修改配置文件前先备份的好习惯
cp  /etc/keepalived/keepalived.conf{,.bak}
vim /etc/keepalived/keepalived.conf,修改如下:

! Configuration File for keepalived
#全局IP
global_defs {
   router_id LVS_01
}
#实例配置
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    192.168.178.40/24
    }
}
#虚拟服务器配置
virtual_server 192.168.178.40 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
#真实服务器一
    real_server 192.168.178.12 80 {
        weight 1
    TCP_CHECK {
         connect_timeout 8
         nb_get_retry 3
         delay_before_retry 3
         connect_port 80
          }
        }
#真实服务器二
    real_server 192.168.178.253 80 {
        weight 1
    TCP_CHECK {
         connect_timeout 8
         nb_get_retry 3
         delay_before_retry 3
         connect_port 80
          }
        }

}


修改lb02配置文件如下:
cp /etc/keepalived/keepalived.conf{,.bak}
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id LVS_02
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
     192.168.178.40/24
    }
}
virtual_server 192.168.178.40 80 {
    delay_loop 6
    lb_algo wrr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.178.12 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }

    real_server 192.168.178.253 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    
    
}


启动keepalived服务,(启动前先关闭先前设置的ipvsadm,重启网络即可)
systemctl  restart network

启动两个机器keepalived即可生成vip
systemctl start keepalived
systemctl status  keepalived

检查虚拟ip是否生成
ip add |grep "inet 192"

[root@lvs-lb01 ~]# ip add |grep "inet 192"
    inet 192.168.178.251/24 brd 192.168.178.255 scope global noprefixroute ens33
    inet 192.168.178.40/24 scope global secondary ens33

[root@lvs-lb02 ~]# ip add |grep "inet 192"
    inet 192.168.178.252/24 brd 192.168.178.255 scope global noprefixroute ens33
    
检查漂移,只有正确漂移,才能保证实验的准确。
[root@lvs-lb01 ~]# systemctl stop keepalived
[root@lvs-lb01 ~]# 
[root@lvs-lb01 ~]# 
[root@lvs-lb01 ~]# ip add |grep "inet 192"
    inet 192.168.178.251/24 brd 192.168.178.255 scope global noprefixroute ens33
    
[root@lvs-lb02 ~]# ip add |grep "inet 192"
    inet 192.168.178.252/24 brd 192.168.178.255 scope global noprefixroute ens33
    inet 192.168.178.40/24 scope global secondary ens33

#重新启动vip又回到lb01机器
[root@lvs-lb01 ~]# systemctl start  keepalived
[root@lvs-lb01 ~]# ip add |grep "inet 192"
    inet 192.168.178.251/24 brd 192.168.178.255 scope global noprefixroute ens33
    inet 192.168.178.40/24 scope global secondary ens33

配置lb02
yum install ipvsadm -y

检查ipvsadm的状态
[root@lvs-lb01 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  lvs-lb01:http wrr persistent 50
  -> 192.168.178.12:http          Route   1      0          0         
  -> 192.168.178.253:http         Route   1      0          0
  
[root@lvs-lb02 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.178.40:http wrr persistent 50
  -> 192.168.178.12:http          Route   1      0          0         
  -> 192.168.178.253:http         Route   1      0          0   
  
在web01/web02上配置,命令修改只是临时生效,写入配置文件rc.local实现永久生效
抑制客户端arp解析
ip addr add 192.168.178.40/32 dev lo

修改内核参数,抑制arp响应
cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF

sysctl -p


验证lvs+keepalived
访问lvs 192.168.178.40

[root@lvs-lb01 ~]# ip a | grep link/ether.*
    link/ether 00:0c:29:89:18:cf brd ff:ff:ff:ff:ff:ff

[root@lvs-web01 ~]# arping -c 1 -I ens33 192.168.178.40
ARPING 192.168.178.40 from 192.168.178.253 ens33
Unicast reply from 192.168.178.40 [00:0C:29:89:18:CF]  1.526ms #解析到lb01的mac地址
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

测试:如果lb01宕机,也不影响服务
[root@lvs-lb01 ~]# systemctl stop keepalived
可以解析到的mac地址02
[root@lvs-lb02 ~]# ip a | grep link/ether.*
    link/ether 00:0c:29:19:43:23 brd ff:ff:ff:ff:ff:ff

[root@lvs-web01 ~]# arping -c 1 -I ens33 192.168.178.40
ARPING 192.168.178.40 from 192.168.178.253 ens33
Unicast reply from 192.168.178.40 [00:0C:29:19:43:23]  1.778ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

至此lvs+keepalived搭建完成,即时RS,web/web02机器宕机,以及lb01/lb02宕机也不会出现无法访问的情况。

LVS快速入门

keepalived参数解释

参数解释
TCP方式
onnect_port 80         # 设置监控检查的端口
bindto  <IPADD>         # 设置健康检查的 IP 地址
connect_timeout   3     # 设置连接超时时间
nb_get_retry  3         # 设置重连次数
delay_before_retry  2   # 设置重连间隔
Virtual_server虚拟主机配置
关于 keeplived 的虚拟主机配置有三种如下所示
virtual server IP port
virtual server fwmark int
virtual server group string

以常用的第一种为例
virtual_server 192.168.1.2 80
含义: 设置一个 virtual server: VIP:Vport

delay_loop 3
含义: 设置 service polling 的 delay 时间即服务轮询的时间间隔

lb_algo rr|wrr|lc|wlc|lblc|sh|dh
含义: 设置 LVS 调度算法

lb_kind NAT|DR|TUN
含义: 设置 LVS 集群模式

persistence_timeout 120
含义: 设置会话保持时间秒为单位即以用户在 120 秒内被分配到同一个后端 realserver, 超过此时间就重新分配

persistence_granularity
含义: 设置 LVS 会话保持粒度 ipvsadm 中的 - M 参数默认是 0xffffffff 即每个客户端都做会话保持

protocol TCP
含义: 设置健康检查用的是 TCP 还是 UDP

ha_suspend
含义: suspendhealthchecker’s activity

virtualhost
含义: HTTP_GET 做健康检查时检查的 web 服务器的虚拟主机即 host 头

sorry_server
含义: 设置 backupserver 就是当所有后端 realserver 节点都不可用时就用这里设置的也就是临时把所有的请求都发送到这里

real_server
含义: 设置后端真实节点主机的权重等设置主要后端有几台这里就要设置几个

weight 1
含义: 设置给每台的权重 0 表示失效 (不知给他转发请求知道他恢复正常) 默认是 1

inhibit_on_failure
含义: 表示在节点失败后把他权重设置成 0 而不是冲 IPVS 中删除

notify_up |
含义: 设置检查服务器正常 (UP) 后要执行的脚本
notify_down |
含义: 设置检查服务器失败 (down) 后要执行的脚本

注: keepalived 检查机制说明
keepalived 健康检查方式有: HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK 

CP 还是 UDP

ha_suspend
含义: suspendhealthchecker’s activity

virtualhost
含义: HTTP_GET 做健康检查时检查的 web 服务器的虚拟主机即 host 头

sorry_server
含义: 设置 backupserver 就是当所有后端 realserver 节点都不可用时就用这里设置的也就是临时把所有的请求都发送到这里

real_server
含义: 设置后端真实节点主机的权重等设置主要后端有几台这里就要设置几个

weight 1
含义: 设置给每台的权重 0 表示失效 (不知给他转发请求知道他恢复正常) 默认是 1

inhibit_on_failure
含义: 表示在节点失败后把他权重设置成 0 而不是冲 IPVS 中删除

notify_up |
含义: 设置检查服务器正常 (UP) 后要执行的脚本
notify_down |
含义: 设置检查服务器失败 (down) 后要执行的脚本

注: keepalived 检查机制说明
keepalived 健康检查方式有: HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK


上一篇:Linux下"负载均衡+高可用"集群的考虑点 以及 高可用方案说明(Keepalive/Heartb


下一篇:再论跳槽的能力