一.LVS介绍

1.1.LVS简介

LVS是Linux Virtual Server的简写,意思就是Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立,是中国国内最早出现的自由软件项目之一。

  • LVS技术点小结:

    1、真正实现调度的工具是IPVS,工作在Linux内核层面。

    2、LVS自带的IPVS命令行管理工具是ipvsadm。

    3、keepalived实现管理IPVS及负载均衡器的高可用。

    4、Red hat工具Piranha WEB管理实现调度的工具IPVS。

1.2 简单术语介绍

术语简写术语含义
CIP客户端的IP
DIP负载均衡器对应的实际IP
VIP虚拟IP,需要在调度器提供服务的IP
RIP后端节点的IP
LB负载均衡服务器
RS节点服务器,real server

1.3 LVS调度算法

算法说明
rr轮循调度(Round-Robin),它将请求依次分配不同的RS节点,也就是在RS节点中均摊请求。这种算法很简单,但是只适合于RS节点处理性能相差不大的情况。
wrr加权轮循调度(Weighted Round-Robin),它将依据不同的RS节点的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS节点更多。相同权值的RS得到相同数目的连接数。
wlc加权最小连接数调度(Weighted Least-Connection)假设各台RS的权值依次为Wi(I=1…n),当前的TCP连接次数依次为Ti(I=1…n),依次选取Ti/Wi为最小的RS作为下一个分配的RS。
dh目的地址哈希调度,以目的地址为关键字查找一个静态hash表来获得需要的RS。
sh源地址哈希调度,以源地址为关键字查找一个静态hash表来获得需要的RS。

1.4 LVS参数

1.41创建资源池命令
ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20

参数说明:

-A:–add-service,表示添加一个虚拟服务器

-p: --会话保持时间 默认300s

-t:–tcp-service,指定这是一个tcp的虚拟服务器

-u:–udp-service,指定这是一个udp的虚拟服务器

10.0.0.3:80:表示提供服务的ip地址以及端口号

-s:–scheduler,指定调度器,“rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq”选择一种,默认是wlc.

1.42增加后端节点命令
#dr模式命令
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
#nat模式命令
ipvsadm -a -t 100.0.0.3:80 -r 192.168.1.2:80 -m -w 1   
ipvsadm -a -t 100.0.0.3:80 -r 192.168.1.3:80 -m -w 1

#upstream server server

-a 添加server rs服务器

-t tcp

-u udp

-r 指定rs服务器ip:port

-g --gatewaying 直接路由模式 dr模式

-m --nat模式

-w weight 权重

1.43查看ipvs规则信息

ipvsadm -ln (-nl报错) #查看规则

ipvsadm -save

二.LVS工作模式

1.lvs-DR模式
1.1DR工作模式原理

在这里插入图片描述

原理:客户端向目标vip发出请求,lvs接收 ,LVS根据负载均衡算法选择一台活跃的的节点,将此节点的ip所在网卡的mac地址作为目标mac地址,发送到局域网里

节点在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文.随后重新封装报文,发送到局域网.此时IP包的目标ip是客户端,源ip是自己的vip地址。

1.2 特点

1.Director与RS必须在同一个交换机里,因为他们根据mac来通讯的;

2.直接路由,最大的特点是不更改源IP和目标IP,改变的是MAC地址

3.响应和处理 是后端rs服务器处理 处理直接响应给用户. 物流量产生,所以可以.lvs dr 支持更高并发(几万 几十万) nginx(1w)

4.lvs vip公网ip rs服务器也要有公网ip

5.用户请求过来的端口 无法修改的.

1.4VS-DR工作模式部署搭建
1.41主机IP规划表
服务器说明IP地址主机名称规则
LVS服务器10.0.0.5/24lb01
LVS服务器10.0.0.6/24lb02
Nginx服务器10.0.0.7/24nginx
Nginx服务器10.0.0.8/24apache
10.0.0.3/24虚拟IP地址
1.42 安装软件
[root@nginx ~]# yum -y install ipvsadm
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
*****自动安装过程略****  
Installed:
  ipvsadm.x86_64 0:1.26-4.el6 
1.43 服务端配置

为LVS服务器添加一个虚拟IP地址:

ip addr add 10.0.0.3/24 dev eth0 label eth0:0 
#或者keepalived生成

清空以前的旧配置:

ipvsadm --help          #<==查看ipvsadm的配置参数
ipvsadm -C              #<==清空所有配置
ipvsadm --set 30 5 60   #设置tcp 超时时间

添加一个虚拟vserver(相当于Nginx的upstream):

ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20

参数说明:

-A:–add-service,表示添加一个虚拟服务器

-p: --会话保持时间 默认300s

-t:–tcp-service,指定这是一个tcp的虚拟服务器

-u:–udp-service,指定这是一个udp的虚拟服务器

10.0.0.3:80:表示提供服务的ip地址以及端口号

-s:–scheduler,指定调度器,“rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq”选择一种,默认是wlc.

为服务器添加real server:

ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1

#upstream server server

-a 添加server rs服务器

-t tcp

-u udp

-r 指定rs服务器ip:port

-g --gatewaying 直接路由模式 dr模式

-w weight 权重

1.44节点端配置

需要添加到LVS负载均衡器的节点都需做如下配置:

绑定VIP

在网卡lo绑定虚拟IP,该虚拟IP同LVS服务器的虚拟IP,即10.0.0.3/24

ip addr add 10.0.0.3/32 dev lo label lo:1
route add -host 10.0.0.3 dev lo:1
或者
[root@web01 ~]# cat /etc/sysconfig/networkscripts/ifcfg-lo:1
 DEVICE=lo:1
 IPADDR=10.0.0.3
 NETMASK=255.255.255.255
 ONBOOT=yes
 NAME=loopback
[root@web01 ~]# systemctl restart network
[root@web02 ~]# ip a 

设置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

q 抑制参数说明

arp_ignore:定义目标地址为本地IP的ARP询问不同的应答模式
0默认值,回应任何网络接口上对任何本地IP地址的arp查询请求
1只回答目标IP地址是本地地址(lo)的ARP查询请求
2只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。
3不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应。
4-7保留未使用。
8不回应所有(本地地址)的arp查询
arp_announce:对网络接口上,本地IP地址发出的,ARP回应,作出相应级别的限制。确定不同程序的限制,宣布对来自本地源IP地址发出的ARP请求接口。
0默认值,在任意网络接口(eth0,eth1,lo)上任何本地地址。
1尽量避免不在该网络子网段的地址作出arp回应。当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用,此时会检查来访IP是否为所有接口上的子网段内IP之一。如果该来访者IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理。
2对查询目标使用最适当的本地地址,在此模式下忽略这个IP数据包的源地址并尝试选择能与该地址通信的本地地址,首要是选择所有网络接口的子网中外出访问子网中包目标IP地址的本地地址。如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送,限制了使用本地VIP地址作为优先的网络接口

设置APR抑制原因

在这里插入图片描述

访问10.0.0.21:80,查看结果是否轮循。

[root@lb01 ~]# curl 10.0.0.3
apache.www
[root@lb01 ~]# curl 10.0.0.3
www
[root@lb01 ~]# curl 10.0.0.3
apache.www
[root@lb01 ~]# curl 10.0.0.3
www

keepalived配置LVS服务

###############################
#      LVS的配置部分        #
###############################
virtual_server 10.0.0.21 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    #persistence_timeout 50
    protocol TCP
 
    real_server 10.0.0.16 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
          }
        }
 
    real_server 10.0.0.17 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
          }
        }
}
1.5.Keepalived与LVS配合

1.keepalived配置文件

vim /etc/keepalived/keepalived.conf
#GLOBAL CONFIGURATION   全局定义部分
 global_defs {
 router_id lb02      #keepalived身份 id 每个
keepalived 不同
 } #VRRPD CONFIGURATION vrrp实例部分   虚拟路由冗余协议
 ##vrrp
 vrrp_instance oldboy {    #实例名称   在同1对主备之间 要一
   state BACKUP          #MASTER BACKUP
  interface eth0        #指定网卡 公网网卡
  virtual_router_id 62  #虚拟路由id 同1对 主备之间要一致

  priority 100          #优先级 主>备
  advert_int 1          #interval 间隔 心跳间隔
  authentication {      #认证
  auth_type PASS    #简单认证
  auth_pass 1234
  }
  virtual_ipaddress {   #vip
      
   10.0.0.3/24 dev eth0 label eth0:0 
      #ip addr add 10.0.0.3/24 dev eth0 label eth0:0 
  }
}
#ip addr add 

 [root@lb01 ~]# ip a a 10.0.0.4/24 dev eth0 label eth0:0
 [root@lb01 ~]# ifconfig add eth0 10.0.0.5/24 up 

 #LVS CONFIGURATION 管理lvs
 ##ipvsadm 通过命令
 ##keepalived 通过 配置文件控制lvs
 #               vip     端口
 #ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
 virtual_server 10.0.0.3 80 {
 delay_loop 6         
 lb_algo wrr              #轮询算法   lc least conn 最小连接数   
                           #         wlc
                           #weighted round robin     
   lb_kind DR               # lvs DR模式     
   nat_mask 255.255.255.0   #vip对应的子网掩码
   persistence_timeout 50   #会话保持时间   -p   
   protocol TCP             #协议 -t      
#ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1 
   real_server 10.0.0.7 80 {  #rs服务器的配置
       weight 1               #权重
       TCP_CHECK {            #-t TCP_CHECK 检查 传输层tcp/udp 端口
                               #三次握手 建立连接 与你的端口建立连接
                               #四次挥手
                               # 或者 指定url进行http检查HTTP_GET
       connect_timeout 8       
       nb_get_retry 3         #number of get retry 重试的次数  
       delay_before_retry 3   #每次检查之前 等待3秒
       connect_port 80        #检查端口
       }
   }
#nginx负载均衡
#upstream web_pools {
#server 10.0.0.7:80 wegiht=1 max_fails=3 fail_timeout=30s ; 
#}
   real_server 10.0.0.8 80 {
       weight 1              
       TCP_CHECK {
       connect_timeout 8       
       nb_get_retry 3
       delay_before_retry 3
       connect_port 80
       }
   }
}

2.lvs-nat模式
2.1 nat工作模式原理

lvs-nat也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,目标ip是cip,源Ip是rip,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。

可以看出,在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈

在这里插入图片描述

2.2 特点:
1.每台节点服务器的网关地址必须是lvs服务器的内网地址。#返回数据时,目标IP是CIP,所以网关要指定好。目标不是vip,是vip的话就不需要大家都在同一个局域网内,就不需要找网关了。理解误区在这里。	
2.请求报文和响应报文必须经由Director转发;
3.支持端口映射,可修改请求报文的目标端口;
4.director必须为Linux系统,RS可以为任意系统;
3.3 缺点:

1.请 求响应,流量的出和入都需要经过LVS服务器,为当集群扩展到一定程度后,Director容易成为整个集群系统的瓶颈。

2.效率会比DR模式差一些

4.4 lvs-nat配置部署

dir端配置

1.关闭防火墙 firewalled iptables selinux
2.创建资源池

ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20

3.增加后端节点

ipvsadm -a -t 10.0.0.3:80 -r 172.16.1.7:80 -m

ipvsadm -a -t 10.0.0.3:80 -r 172.16.1.8:80 -m

4. 开启路由转发功能
echo  ’net.ipv4.ip_forward = 1'  >>  /etc/sysctl.conf
#加载
sysctl -p 
5.后端节点配置

后端节点路由指向dip内网

#检查路由
route -n
#设置路由指向网关指向dip内网

#第一种方法:网卡配置文件中设置

在这里插入图片描述

# 第二种:route命令
route add default gw 172.16.1.5 
或者
route add -host 172.16.1.5 gw 172.16.1.5
3.lvs-tun工作模式

不在修改请求报文的ip首部,而是通过在原有的ip首部之外(>cip—vip<),在封装一个ip报文首部(dip<–>rip)

1、RIP,DIP,VIP都要是公网IP

三.LVS报错总结

1.在这里插入图片描述
解决:重启reboot解决

2.在这里插入图片描述

解决:执行命令ipvsadm-save > /etc/sysconfig/ipvsadm

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐