未经博主允许,禁止转载本博客任何内容,如需转载或内容雷同请留言,谢谢合作,不胜感激!

均衡负载之LVS

LVS 毛竹、 1846℃ 0评论

LVS:linux virtual server(调度器)

是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,
    它的官方网是 http://www.linuxvirtualserver.org
    现在 LVS 已经是 Linux内核标准的一部分。使用 LVS 可以达到的技术目标是:
    通过 LVS 达到的负载均衡技术和Linux 操作系统实现一个高性能高可用的 Linux服务器集群,它具有良好的可靠性、可扩展性和可操作性。
    从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,
    LVS架构从逻辑上可分为调度层、Server集群层和共享存储。

一、集群概念

        Cluster类型:集群,多个主机组合起来对外提供服务
            LB:lodad balancing 均衡负载(均摊不严格),MYSQL主从复制(主宕机,从不能主动提升为主);LVS
            HA:high高可用,MYSQL的MHA高可用(主服务器宕机,从自动提升为主解决单点失败)
                A值(无故障比率)越高,可用性越高,按年计算
            HPC:高性能
        分布式系统:减少备份的冗杂和提高工作效率(raid)
            集群和分布式区别:一堆全栈工程师和(前端工程师+后端工程师搭配)    
        Cluster分类:
            基于设备
                硬件几十万,长的像交换机
                软件:lvs、nginx、haproxy....
            基于协议:
                传输层:只识别传输层以下协议,DPORT(公网---->私网);DNAT不支持访问道多个服务器端口
                应用层:proxy功能多,性能强
        Cluster相关:
            会话:
                1)对号入座,session绑定
                2)session复制;
                3)专有session服务器;Memcached、redis;
        HA集群实现方案:
            keepalived解决单点失败

二、LVS介绍(内核直接支持)

            VS:Virtual Server,调度器/虚拟服务器
            RS:Real Server,上游服务器nginx
            CIP:Client Server IP
            RIP:Real Server IP,一般为私网地址
            VIP:Virtual Server IP,外网
            DIP:Director Server IP,内网
            流程:CIP<-->VIP==DIP<-->RIP
            IPVS:IPVS基本上是一种高效的Layer-4交换机,它提供负载平衡的功能。
        LVS工具:
            ipvsadm/ipvs
            ipvsadm:用户空间的命令行工具,规则管理器 
                    用于管理集群服务及RealServer 
            ipvs:工作于内核空间netfilter的INPUT钩子上的框架
        LVS集群类型:
            LVS-NAT:多IP多端口的DNAT,中间(LVS和SERVER)可以加路由器,一般是交换机
                本质是替换多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
                (1)RIP和DIP应在同一个IP网络不是一定,且应使用私网地址,用公网地址会浪费资源;RS的网关要指向DIP
                (2)请求报文和响应报文都必须经由Director(lvs)转发,Director压力太大;
                (3)支持端口映射,可修改请求报文的目标PORT
                (4)VS必须是Linux系统,RS可以是任意OS系统 
                要启动ip_forward功能
            ★LVS-DR:直接路由
                (1)Director和各RS都配置有VIP,回去不经过LVS
                (2)确保前端路由器将目标IP为VIP的请求报文发往Director
                (3)请求报文必须经过LVS,响应报文不用经过(NAT要经过,是因为要做IP地址转换)
                    ★多个主机配置VIP地址避免冲突的手段:
                        思路:多台RS都拥有VIP的原理:ARP时,第一别人问RS不搭理,第二对外不宣称,RS默默拥有VIP的地址,所以ARP时才不会被收集也不会产生地址冲突;将VIP绑定在lo网卡上(eth0的RIP需要响应ARP)
                        1、在前端网关做静态绑定VIP和Director的MAC地址
                        2、在RS上使用arptables工具
                            arptables -A IN -d $VIP -j DROP
                            arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
                        3、在RS上修改内核参数以限制arp通告及应答级别
                            /proc/sys/net/ipv4/conf/all/arp_ignore 1  /proc/sys/net/ipv4/conf/all/arp_announce 2
                (4)三次握手,第一次转发两次,第二次到client,第三次再到RS;抓包可以看到
                (3)RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络; RIP的网关不能指向DIP,以确保响应报文不会经由Director
                (4)RS和Director要在同一个物理网络;路由器有两个网卡(公和私)
                (5)请求报文要经由Director,但响应报文不经由Director,而由RS直接发往 Client
                (6)不支持端口映射(端口不能修败),全程只改了数据链路层头部(MAC)
                (7)RS可使用大多数OS系
                不用启动ip_forward功能
            LVS-TUN:修改报文头部,跨异地机房,大企业使用,容错高
            LVS-FULLNAT:源IP和目标IP都替换,而LVS-NAT只替换了目标IP,内核不支持
        调度:ipvs scheduler,根据协议来
            静态:只考虑本身算法
                RR:轮询
                WRR:按高低比例能者多劳
                SH:源地址哈希,SIP和RIP一一对应,只认这一个客户端,相同源地址调度到始终认的主机
                DH:目标地址哈希调度,正向代理(离客户端近),只认这一个主机,VIP,后端是缓存服务器;
            动态:考虑RS负载,有权重
                LC:负载值越小越被用来调度,但没有考虑到性能
                WLC:默认,值小优先
                SED:第一次连接权重大优先
                NQ:第一次均匀分再SED
                LBLC:动态DH,均衡
                LBLCR:LBLC+复制,重-->轻
LVS基本原理图:

三、实现LVS

        集群:-A/-D
        集群服务:加入RS -a/-e
            NAT模式实现HTTP集群均衡负载:相同端口:1、不加路由2、加路由
                                不同端口:
                保存默认反向解析,-Sn
            NAT模式实现HTTPS集群均衡负载:
            实现单网络的DR的LVS:
                ★:SIP和回环网卡上添加VIP的操作;lvs的网关随便配;tcpdump和ip的用法
            ★实现跨网络的DR的LVS:
            有可能出现单点失败问题,可用keepalived解决
    四、FireWall Mark数据报文打标签;将不同集群服务统一调度
            需要搭建HTTPS
        持久连接 -p,但宕机还是会往指定服务上调度
            默认360s在同一RS调度
            端口:
            防火墙:    
        ldirectord:解决lvs健康性检查问题,监控lvs运行状态,将故障规则清理,不用手写
        需要在网上找资源下载安装,将配置模版文件复制给主配置文件并修改以下配置并重启服务
            checktimeout=3      检查时间间隔
            checkinterval=1     
            autoreload=yes 配置文件设置完是否自动加载
            logfile=“/var/log/ldirectord.log“ #日志文件,启动
            quiescent=no #down时yes权重为0,no为删除
            virtual=5(防火墙标签) #指定VS的FWM或IP:port,用这一项要注释iprotocol项
                real=192.168.32.7:80 gate 2 DR    
                real=192.168.32.17:80 gate 1 DR
                fallback=127.0.0.1:80 gate #sorry server
                service=http
                scheduler=wrr
                checktype=negotiate
                checkport=80
                request="index.html"
                receive=“Test Ldirectord"
LVS-NAT原理图:

LVS-DR原理图:

网络拓扑图:

原理思路:MAC替换过程:MACcip-->MACroute左;MACroute右-->MACvip;MACdip-->MACrip;MACrip-->MACroute右;MACroute左-->MACcip
拓扑图配置
client:bridge
    cip:172.20.222.1;route add -net 10.0.0.0/8 gw 172.20.222.2
    cip需要访问10.0.0.0网络需要加路由,直连的网络默认添加该网段路由,而它不是直连的
router:host
    左口:172.20.222.2,右口:10.0.0.171/8、192.168.71.200/24,设置路由转发ip_forward=1
    这里右口需要公网和私网两个地址是为了和后面的lvs使用公网通信,私网也可以但是意义不大
LVS配置及命令:host
    vip:10.0.0.71/32,192.168.71.100/24,gw 192.168.71.200
    运行下面的LVS脚本配置来生成VIP地址以及解决VIP地址多主机冲突问题
RS配置及命令:host
    RS1:vip:10.0.0.71/32,192.168.71.7/24,gw 192.168.71.200
    system start httpd   echo RS1 > /var/www/html/index.html
    RS2:vip:10.0.0.71/32,192.168.71.17/24,gw 192.168.71.200
    system start httpd   echo RS1 > /var/www/html/index.html
    最后分别为RS1和RS2运行下面的RS脚本,用于执行lvs的策略
LVS脚本配置:
#!/bin/bash
vip=10.0.0.71
iface='lo:1' 
mask='255.255.255.255' 
port='80' 
rs1='192.168.71.7' 
rs2='192.168.71.17' 
scheduler='wrr' 
type='-g' 
case $1 in 
start) 
     ifconfig $iface $vip netmask $mask #broadcast $vip up 
     iptables -F 
     ipvsadm -A -t ${vip}:${port} -s $scheduler 
     ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1 
     ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1 
 ;; 
stop) 
     ipvsadm -C 
     ifconfig $iface down 
 ;; 
*) 
     echo "Usage $(basename $0) start|stop"
     exit 1 
esac 
vip掩码为32是因为该网段只有自己一个网络,这里不需要网关是行不通的,lvs不用再返回到route右口,但网络认为该网卡没有网关无法与它通信,192.168.71的网关随便配,
RS配置及命令:
rp1(eth0):192.168.71.7,gw 192.168.71.200;vip(lo):10.0.0.71
systemctl restart httpd vim /var/www/html/index.html  rp1
rp2(eth0):192.168.71.17,gw 192.168.71.200;vip(lo)10.0.0.71
systemctl start httpd   vim /var/www/html/index.html  rp1
以上将rp的地址绑定在lo网卡是为了避免eth0网卡宕机下还能通过本地lo网卡继续使用
RS脚本配置:
#!/bin/bash
vip=10.0.0.71
mask='255.255.255.255' 
dev=lo:1 
case $1 in 
start) 
     echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
     echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
     echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
     echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
     ifconfig $dev $vip netmask $mask #broadcast $vip up 
 #route add -host $vip dev $dev 
 ;; 
stop) 
     ifconfig $dev down 
     echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore 
     echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
     echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce 
     echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce 
 ;; 
*)  
     echo "Usage: $(basename $0) start|stop" 
     exit 1 
 ;; 
esac
最后在172.20.222.1主机上curl http://10.0.0.71的结果会显示出lvs的效果;该实验网络的连通是成功搭建LVS的关键!!

转载请注明:黑夜 » 均衡负载之LVS

喜欢 (8)or分享 (0)

您必须 登录 才能发表评论!