基于lvs-nat方式实现负载均衡

本文涉及的产品
公网NAT网关,每月750个小时 15CU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介:


实验环境:

1
2
3
4
5
6
7
8
9
10
11
     OS : CentOS 6.6 
     ipvsadm: ipvsadm-1.26-4.el6.x86_64
     LVS Server: 
             eth0: 172.16.66.10
             eth1: 192.168.100.3
     RS1:
             eth1: 192.168.66.11
             gateway: 192.168.100.3
     RS2:
             eth1: 192.168.100.12
             gateway: 192.168.100.3



集群系统性能提升方式:
    scale up: 向上扩展 (升级硬件设备 等)
    scale out: 向外扩展 (添加主机数量提升性能)


Linux Cluster 类型 
    负载均衡集群:Load Balancing (主要用于扩容、及可用性)
    高可用集群:High Availability (主要目标保证系统可用) (又称HA集群 )
        衡量可用性指标 = 平均无故障时间/(平均无故障时间+平均修复时间)    其比例 用于衡量可用性 性能 
            95%,  99%,  99.9%, 99.99%, 99.999% 
    高性能集群:High Performance    (又称HP 集群)
        www.top500.org 
        
负载均衡集群LB实现方式:
    软件:
        tcp:LVS (Linux Virtual Server), haproxy, nginx(能在用户空间模拟tcp进行调度)
        http: haproxy,nginx,Apache(proxy module, balancer module),ats(apache traffic server)--【Yahoo 贡献】,squid,varnish
        mysql: mysql-proxy [mysql 协议专用]
    硬件
        F5:Big-IP【性能最好,价位也贵】
        Citrix: NetScaler        思杰 (价位仅次于F5)
        A10:A10
        Array:
        RedWare:
    

LVS:Linux Virtual Server
    LVS工作在第四层:传输层
            layer4 router
            layer4 switch 
    原理:根据目标地址和端口作出转发与否的决策,根据调度方法作出转发至哪一个后端服务器的决策

    组成部分:
        ipvs (工作与内核空间) :工作在netfilter的 INPUT链
        ipvsadm (工作与用户空间):用于在ipvs上定义集群服务,同时也得定义此集群服务对应于有哪个后端主机可用

    lvs中的常用语约定
        Host:
            Director: 调度器 
            Real Server: RS,后端提供服务的主机
        IP:
            Client IP:CIP
            Director Virtual IP: VIP  【面向客户端提供服务的IP】
            Director IP: DIP    【面向后端提供服务的IP】
            Real IP: RIP    【后端提供服务的主机IP】    

    LVS的类型
        lvs-nat:
            masquerade: 基于地址伪装来实现
        lvs-dr:
            direct routing :直接路由
        lvs-tun:
            tunneling:基于IP隧道做转发
        lvs-fullnat:
            fullnat  : 入站或出站时即更改目标地址又更改源地址

    LVS类型详解:
        lvs-nat: 类似于DNAT,但支持多目标转发;
            它通过修改请求报文的目标地址为根据调度算法所跳出的某RS的RIP来进行转发;
                    
         架构特性:
            (1)RS应该使用私有地址,即RIP应该为私有地址;各RS的网关必须指向DIP
            (2)请求和响应报文都经由Director转发,高负载场景中,Director易于成为系统瓶颈;
            (3)支持端口映射;
            (4)RS可以使用任意类型的OS;
            (5)RS的RIP必须与Director的DIP处于同一网络;

        lvs-dr: 直接路由
            Director在实现转发时不修改请求报文的IP首部,而是通过直接封装MAC首部完成转发;目标MAC是Director根据调度方法挑选出的某RS的MAC地址;拓扑结构有别于NAT类型;
                
            架构特性:    
                (1)保证前端路由器将目标地址为VIP的请求报文通过ARP的地址解析后送往Director
                    解决方案:
                        静态绑定:在前端路由直接将VIP对应的目标MAC静态配置为Director的MAC地址(不太现实 ,route 在运营商那里 一般我们没有权限,)
                        arptables:在各RS上,通过arptables规则拒绝其相应对VIP的ARP广播请求
                        内核参数:在RS上修改内核参数,并结合地址配置方式实现拒绝相应对VIP的ARP广播请求
                (2)RS的RIP可以使用私有地址;但也可以使用公网地址,此时可通过互联网上的主机直接对此RS发起管理操作;
                (3)请求报文必须经由Director调度,但相应报文必须不能经由Director;
                (4)各RIP必须与DIP在同一个物理网络中;
                (5)不支持端口映射
                (6)RS可是使用大多数的OS; (VIP 加进去)
                (7)RS的网关一定不能指向Director;
                
        lvs-tun:不修改请求报文的IP首部,而是通过IP隧道机制在原有的IP报文之外再封装IP首部,经由互联网把请求报文交给选定的RS;
                CIP;VIP  DIP;RIP
                tun    =>  tunrel   隧道 
                IP隧道承载IP报文
            架构特性:    
                (1)RIP,DIP,VIP都是公网地址;
                (2)RS的网关不能,也不可能指向DIP;
                (3)请求报文由Director分发,但相应报文由RS响应给请求者Client
                (4)不支持端口映射
                (5)RS的OS必须得支持IP隧道;
                
           lvs-tun 这种模式不常用 
                
        lvs-fullnat:通过修改请求报文的源地址为DIP,目标地址为RIP来实现转发;对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发;
                
            架构特性:    
                (1)RIP,DIP可以使用私有地址;
                (2)RIP和DIP可以不再同一个网络中,且RIP的网关未必需要指向DIP
                (3)支持端口映射;
                (4)RS的OS可以使用任意类型;
                (5)请求报文经由Director,响应报文经由Director
            
                【Linux 默认不支持lvs-fullnat 】
                
    LVS Scheduler:    LVS 的十种 调度方法
            
        静态方法:仅根据算法本身实现调度 (关注起点公平)
            RR:round-robin ,轮询;轮叫、论调、轮流
            WRR:weighted round-robin,加权轮询; (给每个RS一个权重)
                Overhead=conn/weight 
            SH:Source ip Hashing:源地址hash ,把来自于同一个地址的请求,统统定向至此前选定的RS; (session 绑定)  (将同一个client请求定向至同一个RS)
            DH:Destination Ip Hashing,目标地址哈希;把访问同一个目标地址的请求,统统定向至此前选定的RS(当公司出口有多个时才用的到)
            
        动态方法:根据算法及后端RS当前的负载状况实现调度 (关注结果公平)
            LC:least connection 最少链接
                Overhead=Active * 256 + Inactive   【Overhead值 = 活动链接 * 256 + 非活动链接】
            WLC:weighted least connection  【被当做LVS 默认调度,也是用的最多的调度算法】
                Overhead= (Active* 256 + Inactive)/weight 
            SED:Shorted Ecpection Delay  最短期望延迟
                Overhead=(Active +1 )*256 /weight 
            NQ: Never Queue 永不排队
            LBLC:local-Based Least Connection,动态方式的DH算法 【考虑RS状况进行调度】
            LBLCR: Replicated LBLC 
              【活动链接比较消耗资源】
              
    Session 保持  【session sharing ---session 共享 】
        Session Sticky 【简单粗暴、有效  、实现容易】
        Session Replication Cluster: Session 复制集群 【规模有限】
        Session Server 
            
                    
                
ipvsadm 命令的用户;
            管理集群服务:创建、修改、删除、
            管理集群服务的RS:添加、修改、移除
            查看:
                统计数据
                速率
                
                -C  :清空规则
                -A:
                - Z:清空计数器
                
            管理集群服务: 
                创建或修改:
                     ipvsadm -A|E -t|u|f service-address [-s scheduler]
                     
                        -A:添加
                        -E:修改 
                        
                        -t:承载的应用层协议为基于TCP协议提供服务的协议;其service-address的格式为“VIP:PORT”;如“172.16.100.6:80"
                        -u:承载的应用层协议为基于TCP协议提供服务的协议;其service-address的格式为“VIP:PORT”;如“172.16.100.6:53";
                        -f:承载的应用层协议为基于TCP或UDP协议提供服务的协议;但此类报文会经由iptables/netfilter 打标记,即为防火墙标记;其service-address的格式为“FWM”;如“10"
                        
                        -s scheduler: 指明调度方法,默认为WLC
                
                删除:
                     ipvsadm -D -t|u|f service-address
                
            管理集群服务上的RS:
                添加或修改:
                    ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]

                        -t:承载的应用层协议为基于TCP协议提供服务的协议;其service-address的格式为“VIP:PORT”;如“172.16.100.6:80"
                        -u:承载的应用层协议为基于TCP协议提供服务的协议;其service-address的格式为“VIP:PORT”;如“172.16.100.6:53";
                        -f:承载的应用层协议为基于TCP或UDP协议提供服务的协议;但此类报文会经由iptables/netfilter 打标记,即为防火墙标记;其service-address的格式为“FWM”;如“10"
                        
                        -r server-address: 指明RS,server-address格式一般为”IP[:PORT]";注意,只支持端口映射的lvs类型中才应该显式定义此处端口
                            例如: -r 192.168.10.7:80 
                        [-g|i|m] : 指明LVS类型
                            -g:gateway,意为dr类型;
                            -i:ipip,意为tun类型
                            -m: masquerade, 意为nat类型
                        [-w weight]:当前RS的权重:
                            注意:仅对于支持加权重调度的scheduler,权重才有意义;
                
                删除: 
                    ipvsadm -d -t|u|f service-address -r server-address
                
            清空所有集群服务的定义:
                ipvsadm -C 
            
            
            保存规则:
                ipvsadm -S > /etc/sysconfig/ipvsadm 
                ipvsadm-save > /etc/sysconfig/ipvsadm 
                service ipvsadm save 
                      /etc/sysconfig/ipvsadm
                      
                ipvsadm -R < /etc/sysconfig/ipvsadm 
                ipvsadm-restore < /etc/sysconfig/ipvsadm 
                service ipvsadm restart 
            
            查看规则:
                ipvsadm -L | l [OPTIONS]
                    -c: 列出当前所有connection:
                    --stats:列出统计数据
                    --rate: 列出速率 
                    -n, --numeric: 数字格式显示IP及端口;
                    --exact:精确值;
            清空计数器 :
                ipvsadm -Z [-t|u|f service-address]                     
                
 ##############################################################

##############################################################                
                
                

前期准备:

RS1:
    1、安装httpd,启动服务
    2、设置主页面,为了区分调度效果,主页面内容设置为: This is RS1 Server
    3、设置IP: ifconfig eth1 192.168.100.11/24 up
    4、添加网关: # route add default gw 192.168.100.3
    
RS2:
    1、安装httpd,启动服务
    2、为WEB服务添加主页面,为了实验区分调度效果,主页面内容设置为: This is RS2 Server
    3、设置IP: ifconfig eth1 192.168.100.12/24 up
    4、添加网关: # route add default gw 192.168.100.3

LVS Server :
    1、设置IP 
        # ifconfig eth0 172.16.66.10/16 up
        # ifconfig eth1 192.168.100.3/14 up
    2、安装ipvsadm   
        # yum -y install ipvsadm    
    3、开启forward 转发            
        # echo 1 > /proc/sys/net/ipv4/ip_forward        
                

注: RS1、RS2与LVS Server的eth1 处于同一私有网段
实验一:
    配置lvs-nat类型 以轮调模式配置服务器集群
    

1
2
3
4
5
6
7
8
9
10
11
     [root@1inux ~]# ipvsadm -A -t 172.16.66.10:80 -s rr
[root@1inux ~]# ipvsadm -a -t 172.16.66.10:80 -r 192.168.100.11 -m
[root@1inux ~]# ipvsadm -a -t 172.16.66.10:80 -r 192.168.100.12 -m
[root@1inux ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.66.10:80 rr
   -> 192.168.100.11:80            Masq    1      1          8         
   -> 192.168.100.12:80            Masq    1      0          1         
[root@1inux ~]#

然后我们访问 http://172.16.66.10
我们可以看到首次访问的是 RS1  Server   

当我们使用F5 刷新出现了RS2 Server 页面 
wKioL1VyUHvQZeAXAAD3wgInNYU539.jpg


可以看到RS1,RS2是以论调的方式依次出现的


使用ipvsadm命令查看LB Server 的数据 

查看 其统计数据 
[root@1inux ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  172.16.66.10:80                    16       89       82    10592     7300
  -> 192.168.100.11:80                   8       47       41     5428     3646  
  -> 192.168.100.12:80                   8       42       41     5164     3654
[root@1inux ~]# 
可以查看RS1、RS2其统计数据一致

保存ipvs配置规则

[root@1inux yum.repos.d]# service ipvsadm save    //其文件默认保存在/etc/sysconfig/ipvsadm 中
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [  OK  ]
[root@1inux yum.repos.d]# 
                
删除配置规则:
[root@1inux yum.repos.d]# ipvsadm -D -t 172.16.66.10:80
[root@1inux yum.repos.d]# ipvsadm -L -n   //验证是否删除成功
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@1inux yum.repos.d]#     

恢复之前的保存配置规则 

1
2
3
4
5
6
7
8
9
[root@1inux yum.repos.d]# ipvsadm -R < /etc/sysconfig/ipvsadm
[root@1inux yum.repos.d]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.66.10:80 rr
   -> 192.168.100.11:80            Masq    1      0          0         
   -> 192.168.100.12:80            Masq    1      0          0         
[root@1inux yum.repos.d]#

 
实验二:
使用WLC调度方法,并添加权重 RS1 为1 , RS2 为2 

1
2
3
[root@1inux ~]# ipvsadm -A -t 172.16.66.10:80 -s wlc
[root@1inux ~]# ipvsadm -a -t 172.16.66.10:80 -r 192.168.100.11 -m -w 1
[root@1inux ~]# ipvsadm -a -t 172.16.66.10:80 -r 192.168.100.12 -m -w 2

验证配置情况

1
2
3
4
5
6
7
8
[root@1inux ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.66.10:80 wlc
   -> 192.168.100.11:80            Masq    1      0          0         
   -> 192.168.100.12:80            Masq    2      0          0         
[root@1inux ~]#

然后客户端访问,同样多次刷新 ,发现每刷新三次会出现两次RS2 页面  一次RS1页面

查看当前链接统计

[root@1inux ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  172.16.66.10:80                    21      105      105    13330     9625
  -> 192.168.100.11:80                   7       35       35     4452     3549
  -> 192.168.100.12:80                  14       70       70     8878     6076
[root@1inux ~]# 

由上面的可以看到  192.168.100.12 的conns数是 192.168.100.11 的两倍

                

本文转自 1inux 51CTO博客,原文链接:http://blog.51cto.com/1inux/1659048


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
负载均衡 应用服务中间件 Linux
企业实战(13)LVS负载均衡NAT(网络地址转换)模式实战详解(一)
企业实战(13)LVS负载均衡NAT(网络地址转换)模式实战详解(一)
184 0
|
负载均衡 应用服务中间件 Linux
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
Nginx系列教程(14) - LVS+KeepAlived+Nginx实现高性能负载均衡集群
1379 0
|
4天前
|
负载均衡 算法 Linux
LVS+Keepalived:实现高效软负载均衡的利器
本文介绍了如何使用LVS(Linux Virtual Server)和Keepalived搭建高可用负载均衡集群。LVS通过不同调度算法将请求转发给后端服务器,而Keepalived基于VRRP协议实现服务高可用,避免IP单点故障。具体步骤包括环境准备、安装配置ipvsadm和Keepalived、启动服务及测试。文中还详细解释了配置文件中的关键参数,并提供了故障转移测试方法。最后,文章简要对比了软件、硬件和云负载均衡方案的特点,帮助读者选择合适的负载均衡策略。
53 4
|
3月前
|
运维 负载均衡 网络协议
LVS+Keepalived 负载均衡
LVS+Keepalived 负载均衡
100 8
LVS+Keepalived 负载均衡
|
3月前
|
域名解析 运维 负载均衡
LVS+Keepalived 负载均衡(二)28-1
【8月更文挑战第28天】LVS+Keepalived 负载均衡 配置 LVS VIP
76 5
|
7月前
|
负载均衡 网络协议 算法
LVS 负载均衡部署的三种模式 与搭建dr模式具体步骤
LVS 负载均衡部署的三种模式 与搭建dr模式具体步骤
|
4月前
|
负载均衡 网络协议
使用LVS搭建集群实现负载均衡(二)安装使用
【8月更文挑战第8天】使用LVS搭建集群实现负载均衡(二)安装使用
83 5
|
4月前
|
存储 负载均衡 算法
使用LVS搭建集群实现负载均衡(一)
【8月更文挑战第8天】使用LVS搭建集群实现负载均衡
187 5
|
4月前
|
缓存 负载均衡 算法
在Linux中, LVS负载均衡有哪些策略?
在Linux中, LVS负载均衡有哪些策略?
|
5月前
|
负载均衡 网络协议 算法
使用IPVSADM配置LVS负载均衡
使用IPVSADM配置LVS负载均衡