LVS基本知识

 

前言  linux集群类型 

LB -->负载均衡集群(Load Balancing)

         HA-->高可用集群(High Availiablity)

         HP-->高性性集群(High Performance)

         分布式:分布式存储

                      分布式计算

 LB的实现:硬件层和软件层

                    硬件:F5-->BIG IP

                              A10-->a10

                    软件:LVS、nginx、haproxy、ats

一、LVS(linux vitual server )

       LVS 是linux虚拟服务器,在四层协议工作,能使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,有很好的向外扩展性。

           1.lvs组成及相关术语

             lvs--> ipvs 和 ipvsadm

             ipvs :linux基于内核空间上的natfilter和input工作框架;

             ipvsadm :用户空间的命令行工具,规则管理和用于管理集群服务;

            DS--->Director Server 调度器

            RS-->Real Server 后端工作服务器

            CIP-->客户端IP

            VIP-->调度器上外网的IP,用于响应客户请求的IP地址

            DIP-->调度器上与内网通讯的IP

            RIP-->后端服务器上的IP

          2.lvs基本工作原理图

  

 

 

               2.1 当用户发起请求时,VIP将请求发往调度器内核空间;

               2.2  内核空间中路由前进入PREROUTING链,查验是否是本机地址,假如是本机IP,则经路由到IPUT链上;

               2.3  IPUT链上的集群服务(ipvs)将对用户请求检查,是否是定义的规则的内容,如果是IPVS会修改数据报文中的目标IP地址及端口(自己定义的后端服务器);将更改过的数据包发往POSTROUTIN链;

               2.4 POSTROUTIN链检查目标IP是自己能连上的后端服务器,刚通过,发往后端服务器进行处理;

             

3. LVS三种工作模型 及特性

          3.1 LVS-NAT   

                ~ 多目标的DNAT,通过把请求报文中的目标IP和端口修改成后端真实的服务器主机的RIP和PROT来实现转发;

                ~ DIP和RIP在同一网段,应该是私有地址,且RIP的网关指向DIP;

                ~ 支术修改端口,可将请求报文的PROT修改;

                ~ VS必须是linux系统,RS可以是任意系统;

                ~ 打开Director的核心转发功能;

           

           3.2 LVS-DR     

                ~ 通过为请求报文重新封装一个MAC地址进行转发,源MAC 是DIP接口所在的MAC,目标MAC是RS服务器中挑选的一台服务器的MAC,源IP-PROT和目标IP-PROT保持不变;

                ~ 前端路由器能把目标IP的VIP请求报文送到Director----》在RS上修改内核参数以限制arp通告及应答级别:arp_announe (2) apr_ignore (1);

                ~ RS可以使用公网地址,也可以使用私网地址,RIP和DIP在同一IP网络,RIP的网关不能指向DIP以确保响应报文不会经同director; 

                ~ RS和Director要在同一物理网络;

                ~ 请求报文经由Director,但响应报文不能经由Director,由RS直接返回给客户端;

                ~ 不支持端口映射;

            

 

         3.3 LVS-TUN

              ~ 转发时不修改请求报文的IP首部(源CIP,目标为VIP);而是在原来IP首部再封装一个IP首部(源IP为DIP,目标IP为RIP),将请求报文发往

                 挑选的RIP主机。RS直接响应给客户端;

              ~ VIP、DIP、RIP是公网地址;

              ~ RIP的网关不能指向DIP;

             ~ 请求报文经由Director ,响应报文不能经由Director; 

             ~ 不支持端口映射和RS的OS要支持隧道功能;

           

 

            二、LVS(linux vitual server )    调度算法

             1.静态算法  

                             rr---->轮询

                             wrr--->加权轮询

                             sh--->会话邦定(session sticky),将来自同一个IP的会话发往同一台RS;

                              dh--->目标地址哈希,将发往同一个目标的请求始终发往同一RS;

             2.动态算法

                             lc-->最少链接

                             wlc-->加权最少链接

                             lblcr--->带复制功能的LBLC

           三、实验 

                 1. LVS-NAT 

                     实验拓扑:

                               

 

                   配置:

                            1.1 RS1 和 RS2 配置两台web服务器(httpd) ;

                            1.2 配置网关指向Director(192.168.64.130);

                             ~]# route add default gw 192.168.64.130

                            1.3 在Director配置

                            ~]# yum  install ipvsadm -y   #安装管理工具

                            ~]# ipvsadm -A -t 192.168.1.171:80 -s wrr   #设置调度器及算法(加权轮询)

                            ~]# ipvsadm -a -t 192.168.1.171:80 -r 192.168.64.128 -m -w 3     #加入后端主机(.64.128) -m 指nat模式  -w 指加权3

                            ~]# ipvsadm -a -t 192.168.1.171:80 -r 192.168.64.129 -m -w 1    #加入后端主机(.64.129) -m 指nat模式  -w 指加权1

                            

 

                           ~]# echo 1 >  /proc/sys/net/ipv4/ip_forward     #打开核心转发功能

 

            查看调度是否成功 

                               

                             

 

                2. LVS-DR

                     实验拓扑              

                            

 

                         配置:

                               2.1 配置两台Real Server

                                        ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore  # 1-->仅在请求的目标IP配置在本地主机的接收到请求报文接口上,才给予响应;

                                       ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore   

                                       ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #2-->必须避免向非本网络通告;

                                       ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce  

                                      ~]# ifconfig lo:0 192.168.64.131 netmask 255.255.255.0 broadcast 192.168.64.131    #配置loopback地址;

                                      ~]# route add -host 192.168.64.131 dev lo:0    # 配置静态路由

                               2.4 配置Director 上配置 

                                        yum install ipvsadm

                                      ~]# route add -host 192.168.64.131 dev ens34  # 配置静态路由

                                      ~]# ipvsadm -A -t  192.168.64.131:80 -s wrr    #配置ipvs规则 -s wrr (加权轮询算法)

                                      ~]#  ipvsadm -a -t 192.168.64.131:80 -r 192.168.64.128 -g -w 2    #加入后端主机 -g 指DR模式   -w 指加权为2

                                      ~]#  ipvsadm -a -t 192.168.64.131:80 -r 192.168.64.129 -g -w 1    #加入后端主机 -g 指DR模式   -w 指加权为1

                            查看配置结果

                              

 

                        查看调度是否成功            

                         

            DR方案脚本方案:

                       RS配置:

                        #/bin/bash

                         vip="192.168.64.131"

                         mask="255.255.255.255"

                        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 lo:0  ${vip}  netmask ${mask} broadcast ${vip} up

                                       route add -host ${vip} dev lo:0

                                     ;;

                                   stop)

                                           ifconfig lo:0 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 2

                                  ;;

                               esac

                       VS配置:

                                 #!/bin/bash

                                  vip="192.168.64.131"

                                  mask="255.255.255.255"

                                   interface="ens34"

                                   rs1="192.168.64.128"

                                   rs2="192.168.64.129"

                                   scheduler="wrr"

                                   type="-g"

                                   prot="80"

                            case $1 in 

                                    start)

                                               ifconfig ${interface} ${vip} netmask ${mask} broadcast ${vip} up

                                               iptables -F

                                               ipvsadm -A -t ${vip}:${prot}  -s ${scheduler}

                                               ipvsadm -a -t ${vip} -r ${rs1}:${prot}  ${type} -w 3

                                               ipvsadm -a -t ${vip} -r ${rs2}:${prot}  ${type} -w 2

                                         #     route  add ${vip}  dev ${interface}

                                             ;;

                                       stop)

                                                ipvsadm -C

                                                inconfi ${interface} down

                                               ;;

                                          *)

                                                echo "Usage: $(basname $0) start|stop"

                                              ;;

                                           esac

                                                                                       

  网上案例:

lvs-dr模式负载均衡集群,realserver通过80端口提供http服务。

发现通过vip无法访问http服务,而直接访问realserver的IP 的http服务时正常的。这说明realserver的http服务是正常的。
为了排除lvs dr配置的vip 、arp抑制和 路由是正常的,又添加了ipvs规则,监听22端口,并负载分担到realserver。经过测试,22端口的ssh服务正常,可以ssh登陆到后端realserver。所以包括IP、arp、路由等配置的链路本身是正确的。
另外检查了realserver的firewalld是关闭的。iptables也再INPUT链放通了80端口。realserver段检查不出什么问题。因为开始时通过浏览器访问vip的http服务,没有任何错误信息,非常不利于排错,于是又用另一台同网段的linux机器用curl 命令访问vip的http服务,结果报错
curl: (7) Failed connect to 192.168.14.100:80; No route to host
访问vip的http服务时,在director server和 real server上tcpdump抓包,只能在director上能抓到报文,realserver没有报文,这说明问题在director上。于是检查了一下 director server的iptables规则,果然有一条iptables规则 
-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT但是没有80端口的iptablels规则,判断这里缺少放通80端口的iptables规则应该就是问题所在。执行iptables命令,放通INPUT链的80端口之后,果然可以访问vip的http了!^_^
iptables -A IN_public_allow -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT


这次故障是因为不了解ipvs负载均衡是作用在内核的INPUT上,忘了配置相应的iptables规则。
lvs工作机制:
1、当client向vip发送请求时,lvs服务器收到报文,将报文从物理网卡送到内核空间。
2、在系统内核空间匹配netfilter的chain,PREROUTING链首先判断报文目的IP是本机IP,将数据包发往INPUT链。
3、ipvs工作在INPUT链上,并且是在INPUT链匹配accept时,ipvs将报文与定义好的ipvs规则匹配,如果命中ipvs规则,ipvs会强行修改报文的目的ip地址和端口,然后将数据包发往POSTROUTING链。
4. POSTROUTING链再根据目的IP查路由,将报文最终发送给后端服务器。

 

 

 

         

 

                                        

           

 

                           

 

 

                         

                

 

 

             

posted @ 2018-03-10 22:53  冬日的温暖  阅读(315)  评论(0编辑  收藏  举报