vlambda博客
学习文章列表

Linux 集群总结 + LVS(负载均衡器)原理及配置


一、集群相关概念

1. 集群是什么? 

集群是一组协同工作的服务器,对外表现为一个整体。 

集群的意义:更好的利用现有资源实现服务的高度可用


集群扩展方式: 

  • 垂直扩展:更换服务器硬件

  • 水平扩展:添加更多的服务器节点


2. 集群的分类

  • 负载均衡集群-LBC

    使用意图:减轻单台服务器的压力,将用户请求分担给多台主机一起处理。

    实现方法:硬件:典型代表F5    软件:LVS Nginx HaProxy RAC 等

    使用范围:业务并发较大的应用程序


  • 高可用集群-HAC

    使用意图:最大限度的保证用户的应用持久,不间断的提供服务

    实现原理:心跳检测

    实现方法:硬件:F5    软件:heartbeat   Linux-HA  keepalived

    使用范围:需要持续提供服务的应用程序


  • 高性能运算集群-HPC

    使用意图:提供单台计算机所不具备的计算能力

    负载均衡集群和高性能运算集群的原理对比:

    负载均衡集群通过提高单位时间内的执行的任务数来提升效率

    高性能运算集群通过缩短单个任务的执行时间来提高效率


二、常见的集群拓扑:


三、LVS(负载均衡器) 搭建负载均衡集群

相信你已经对集群分类有了大致了解了,那么我们现在详细说说使用LVS来实现负载均衡集群。


1、LVS 简介

LVS,英文全称LinuxVirtualServer,Linux虚拟服务器,是一个虚拟服务器集群,由章文嵩博士创建。使用LVS技术要达到的目标是利用Linux操作系统和LVS集群软件实现一个高可用、高性能、低成本的服务器应用集群;利用LVS技术实现高可用、可伸缩的网络服务,如www服务、cache服务、DNS服务、FTP服务mail服务等。


2. LVS实现负载均衡原理

补充:ipvs称之为IP虚拟服务器(IP Virtual Server,简写为IPVS)。是运行在LVS下的提供负载平衡功能的一种技术。


3. LVS术语

Director Server: 调度服务器,将负载分发到RealServer的服务器上

Real Server: 真实服务器,真正提供应用服务的服务器

CIP:  客户端IP


4. LVS体系结构

使用LVS架设的服务器集群系统有三个组成部分。

(1)最前端负载均衡层,用LoadBalancer表示

(2)中间的服务器群组层,用ServerArray表示

(3)最底层的数据共享存储层,用Share Storage表示。

LVS 体系结构图如下:

Linux 集群总结 + LVS(负载均衡器)原理及配置

重点来了, 下面我们来介绍LVS的三种工作模式。也是面试时经常问到的一道题。


5. LVS 三种工作模式

1)NAT

Linux 集群总结 + LVS(负载均衡器)原理及配置

注意:

在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端

特点:

优点:

缺点:

扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!

NAT 模式配置:

安装ipvsadm:

[root@LVS ~]# yum install ipvsadm* -y
[root@LVS ~]# lsmod | grep lv_
[root@LVS ~]# lsmod | grep ip_vs
ip_vs_rr                1420  0 
ip_vs                 126897  2 ip_vs_rr
libcrc32c               1246  1 ip_vs
ipv6                  336282  270 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
配置脚本如下:
#!/bin/bash

VIP=192.168.10.10 #外网用户直接访问网站的IP地址, LVS的eth1网卡的IP。 
RIP1=192.168.84.104 #后端web1服务器的IP地址
RIP2=192.168.84.105 #后端web2服务器的IP地址
DIP=192.168.84.103 #LVS的eth0网卡的IP

case "$1" in
start)
    echo "Start LVS as the mode NAT"
    echo "1" > /proc/sys/net/ipv4/ip_forward #开启LVS服务器的IP路由转发功能
    /sbin/ifconfig eth0:0 $VIP netmask 255.255.255.0 up #设定VIP地址
    /sbin/ipvsadm -A -t $VIP:80 -s rr   #添加vip
    #-A:添加虚拟服务器
    #-t :指定vip及tcp端口
    #-s:指定算法 
    #rr:轮询
    /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m
    /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m
    #-a :添加节点 
    #-t :指定vip和端口
    #-r :指定节点ip及端口
    #-m:表示使用nat模式
    #-w:设置权重

    /sbin/ipvsadm 
    ;;
stop)
    echo "Stop LVS"
    echo "0" > /proc/sys/net/ipv4/ip_forward
    /sbin/ifconfig eth0:0 down
    ;;
*)  
    echo "Usage:$0 {start|stop}"
    exit 1
esac

还要配置网页

#web1服务器:
[root@web1 ~] echo "webserver1">/var/www/html/index.html   #写一个测试页面
[root@web1 ~] service httpd start

#web2服务器:
[root@web2 ~]# echo "webserver2">/var/www/html/index.html   #写一个测试页面
[root@web2 ~] service httpd start

[root@web1 ~]# route del default
[root@web1 ~]# route add default gateway 192.168.84.103   ##192.168.84.103 为LVS的DIP
[root@web1 ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.84.0    *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1002   0        0 eth0
default         192.168.84.103  0.0.0.0         UG    0      0        0 eth0

运行脚本后结果如下:

[root@LVS ~]# sh lvs_nat.sh start
Start LVS as the mode NAT
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.10:http rr
  -> 192.168.84.104:http          Masq    1      0          0         
  -> 192.168.84.105:http          Masq    1      0          0

通过curl命令查看是否成功

[root@LVS ~]curl 192.168.10.10
webserver2
[root@LVS ~]curl 192.168.10.10
webserver1
[root@LVS ~]curl 192.168.10.10
webserver2
[root@LVS ~]curl 192.168.10.10
webserver1
[root@LVS ~]curl 192.168.10.10
webserver2
[root@LVS ~]curl 192.168.10.10
webserver1



2)DR(是LVS的默认模式,应用最为广泛)

Linux 集群总结 + LVS(负载均衡器)原理及配置

③.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。

注意:

需要设置lo接口的VIP不能响应本地网络内的arp请求。

总结:

2、请求的报文经过调度器,而 RS 响应处理后的报文无需经过调度器 LB,因此并发访问量大时使用效率很高(和 NAT 模式比)

5、RS 节点的默认网关不需要配置成 LB,而是直接配置为上级路由的网关,能让 RS 直接出网就可以。

7、直接对外的业务比如WEB等,RS 的IP最好是使用公网IP。对外的服务,比如数据库等最好使用内网IP。

优点:

和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。

DR模式的效率很高,但是配置稍微复杂一点,因此对于访问量不是特别大的公司可以用haproxy/nginx取代。日1000-2000W PV或者并发请求1万以下都可以考虑用haproxy/nginx。

缺点:

所有 RS 节点和调度器 LB 只能在一个局域网里面。

DR模式配置:

LVS-DR web服务器脚本

#!/bin/bash 
VIP=192.168.84.200 
/etc/rc.d/init.d/functions 
case "$1" in 
start) 
           echo "start LVS of RealServer DR" 
           /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
           #添加路由记录,当访问VIP交给l0:0 网卡接受 
           /sbin/route add -host $VIP dev lo:0
           #关闭对应ARP响应及公告功能
           echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore 
           echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce 
           echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore 
           echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce  
       ;; 
stop) 
           /sbin/ifconfig lo:0 down 
           echo "close LVS of RealServer DR" 
           echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore 
           echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce 
           echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore 
           echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce 
           ;; 

*) 
          echo "Usage: $0 {start|stop}" 
          exit 1 
esac  
exit 0

Lvs-DR LVS server端启动脚本

#!/bin/bash 
VIP=192.168.84.200 
RIP1=192.168.84.104 
RIP2=192.168.84.105
/etc/rc.d/init.d/functions 
case "$1" in 
start) 
           echo "start LVS of DirectorServer DR" 
           # 添加IP地址为VIP的虚拟网卡lo:0
           /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up 
           # 添加一条路由,目标IP为VIP的数据包使用lo接口发送,这样响应报文的源IP就会为VIP
           /sbin/route add -host $VIP dev eth0:0 
           echo "1" >/proc/sys/net/ipv4/ip_forward 
           #Clear IPVS table
           /sbin/ipvsadm -C
           #set LVS
           /sbin/ipvsadm -A -t $VIP:80 -s rr  
           /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g 
           /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g 
           #RUN LVS
           /sbin/ipvsadm 
       ;; 
stop) 
           echo "stop LVS of DirectorServer DR" 
           echo "0" >/proc/sys/net/ipv4/ip_forward 
           /sbin/ipvsadm -C 
           /sbin/ifconfig eth0:0 down 
           ;; 
*) 
          echo "Usage: $0 {start|stop}" 
          exit 1 
esac 
exit 0



3)TUN

TUN 模式原理:在原请求IP报文之外新加一个IP首部

Linux 集群总结 + LVS(负载均衡器)原理及配置

注意:

需要设置lo接口的VIP不能在公网上出现。

总结:

2.TUNNEL 模式的 vip ------>realserver 的包通信通过 TUNNEL 模式,不管是内网和外网都能通信,所以不需要 lvs vip 跟 realserver 在同一个网段内

3.TUNNEL 模式 realserver 会把 packet 直接发给 client 不会给 lvs 了

4.TUNNEL 模式走的隧道模式,所以运维起来比较难,所以一般不用。

优点:

负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。

缺点:

隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。

TUN 模式配置:

负载均衡器:DIP: eth0 192.168.152.139
VIP:192.168.152.250
web节点IP:192.168.152.151 192.168.152.152

负载均衡器安装配置
1)安装
#yum -y install ipvsadm
#lsmod | grep ip_vs 查看没有输出
#modprobe ip_vs 安装即可
2)一样这里也写个脚本,#cat /etc/init.d/lvstun
#!/bin/bash
#lvs of TUN
VIP=192.168.152.250
RIP1=192.168.152.151
RIP2=192.168.152.152
case "$1" in
start)
echo "start lvs of TUN"
/sbin/ifconfig tunl0 $VIP broadcast $VIP netmask 255.255.255.0 up
/sbin/route add -host $VIP dev tunl0
/sbin/ipvsadm -C
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -i
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -i
/sbin/ipvsadm
;;
stop)
echo "stop lvs of TUN"
/sbin/ipvsadm -C
/sbin/ifconfig tunl0 down
;;
*)
echo "Usage :$0 {start|stop}"
exit1
esac
#chmod o+x /etc/init.d/lvstun
#service lvstun start

节点服务器配置
节点1,2一样写脚本,# cat /etc/init.d/lvsTUNRIP
#!/bin/bash
#TUN server
VIP=192.168.152.250
case "$1" in
start)
echo "start LVS of TUN"
/sbin/ifconfig tunl0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev tunl0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
echo "stop LVS of TUN"
/sbin/ifconfig tunl0 down
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage:$0 {start|stop}"
exit 1
esac
#chmod o+x /etc/init.d/lvsTUNRIP
#service lvsTUNRIP start


6. 三种工作模式比较

工作模式 VS/NAT VS/TUN VS/DR
Real server(节点服务器) Config dr gw Tunneling Non-arp device/tie vip
Server Network Private LAN/WAN LAN
Server number(节点数量) Low 10-20 High 100 High 100
Real server gateway Load balance Own router Own router
优点 地址和端口转换 Wan环境加密数据 性能最高
缺点 效率低 需要隧道支持 不能跨域LAN


7. LVS 调度算法

在内核中的连接调度算法上,IPVS已实现了以下八种调度算法:

  • 轮叫调度(Round-Robin Scheduling)

  • 加权轮叫调度(Weighted Round-Robin Scheduling)

  • 最小连接调度(Least-Connection Scheduling)

  • 加权最小连接调度(Weighted Least-Connection Scheduling)

  • 基于局部性的最少链接(Locality-Based Least Connections Scheduling)

  • 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)


今天我们先介绍到这里。之后我们继续介绍集群的内容。

参考资料:

https://www.cnblogs.com/gaoxu387/p/7941381.html

https://www.jianshu.com/p/2ed85a5204cc



长按二维码