LVS类型及工作原理

lvs工作原理

lvs(Linux Virtual Server),工作于layer4,其原理是根据请求报文的目标IP和PORT将其转发至后端主机集群中的某一提供服务的主机,具体转发到哪一台后端主机需要由挑选算法来决定。通俗来说,lvs的功能是通过在内核空间的netfilter上的INPUT链上的ipvs实现的,当报文由物理网络接口进入主机后,ipvs将流经至INPUT链即将进入用户空间的报文强行改变其流向,即PREROUTING-->INPUT-->POSTROUTING

lvs.png

lvs的架构

  • 调度器:director,dispatcher,balancer

  • RS:Real Server

  • CIP:Client IP

  • VIP:Director Virtual IP

  • DIP:Director IP

  • RIP:Real server IP

lvs type

lvs-nat(MASQUERADE)

lvs-nat2.png

实现过程

当客户端发出的请求报文经Director的VIP所在的物理网卡流入主机的内核空间时,报文的源IP是CIP,目标IP是VIP。此时,ipvs将强行改变报文的流经方向,即修改报文的目标IP并经DIP所在的物理网卡调度至后端的Real Server,此时,报文的源IP是CIP,而目标IP是RIP。后端RS接收报文并处理后,构建响应报文(源IP是RIP,目标IP是CIP)将经DIP发送至Director,此时,ipvs将修改报文的源IP为VIP,并经VIP所在的物理网卡发送给客户端。

功能实现的本质

多目标的DNAT(iptables),它通过修改请求报文的目标IP地址(同时可能会修改目标端口实现端口映射) 至挑选出某RS的RIP地址实现转发。

特性

  • RIP和DIP应该使用私网地址,且RS的网关要指向DIP;

  • 请求和相应报文都要经由director转发,极高负载的场景中,director可能会成为系统瓶颈;

  • 支持端口映射;

  • RS可以使用任意OS;

  • RIP和DIP必须在同一物理网络。

lvs-dr(GATEWAY)

lvs-dr2.png

几个理解要点

  • Director和RS只需要一块物理网卡;

  • Director和RS连接至同一台交换机;

  • 每台RS均配置有VIP,并且配置在lo的别名上,如,lo:0

  • 由于RS均有VIP,在路由器进行广播时,为了避免都进行相应,需进行设定,有三种方案

    • 静态绑定:在交换机的配置文件直接进行指定

    • arptables:通过arptables进行设置

    • 修改RS主机内核参数

实现过程

客户端发出的请求报文经过层层路由,到达服务器所在网络的路由器(此时报文的源IP是CIP,目标IP是VIP)。与路由器相连的交换机此时要进行广播获得Director的mac地址,路由器将报文重新进行封装(源mac是路由器的mac地址,目标mac是Director的MAC地址将),并将报文转发至Director。此时,Director亦要进行广播获得RS的mac地址,并重新将报文进行封装(目标mac是RS的mac地址)转发给交换机,交换机收到报文后根据mac转发给对应的RS。报文到达RS后由物理网卡流入内核空间,并再次经lo进入用户空间。报文处理后,构建响应报文(源IP是VIP,目标IP是CIP)经lo到物理网卡转发至路由器,响应给客户端。

实现本质

通过请求报文目标mac地址进行转发。

特性

  • 保证前端路由器将目标IP为VIP的请求发送给director;

  • RIP可以使用私有地址,也可以使用公网地址;

  • RS跟Director必须处于同一物理网络中;

  • 请求报文经Director调度,但相应报文一定不能经由Director;

  • 不支持端口映射;

  • RS可以是大多数的OS;

  • RS的网关不能指向DIP。

lvs-tun(IPIP)

lvs-tun2.png

实现本质

不修改请求报文的ip首部,而是通过在原有的ip首部之外,再封装一个ip首部。需要考虑的问题是再封装后会超出MTU,而再进行报文切片,但是一般情况下请求报文都比较小,不太可能超出MTU。

特性

  • RIP、VIP和DIP全得是公网地址;

  • RS的网关不能指向DIP;

  • 请求报文必须经由Director调度,但相应报文必须不能经由Director;

  • 不支持端口映射;

  • RS的OS必须支持隧道功能。

lvs-fullnat:

lvs-fullnat2.png

实现本质:

Director同时修改请求报文的源地址和目标地址进行转发。但是在内核中并没有支持此种模式,若要使用需要到官方网站下载补丁包。

实现过程

Director收到报文后, 将源IP(CIP)修改为(DIP),目标地址(VIP)修改为(RIP),然后经过层层路由,转发给RIP,。当RS主机收到报文后,回应时,源IP为RIP,目标IP为VIP.Director收到报文后,将源IP修改为自己(VIP), 目标IP修改为CIP。此模型适用与多机房且机房不位于同一地区。

特性

  • VIP是公网地址,RIP和DIP是私网地址,且二者无需在同一网络中;

  • RS接收到的请求报文的源地址是DIP,因此要响应给DIP;

  • 请求报文和响应报文都必须经由Director;

  • 支持断就映射机制;

  • RS可以是任意OS。

lvs scheduler

静态方法:仅根据算法本身进行调度。

  • RR:Round Robin,轮调;

  • WRR:Weighted RR,加权轮调;

  • SH:Source Hash,将来自于同一个ip的请求始终调度至同一RS,实现session保持的机制;

  • DH:Destination Hash,将对同一个目标的请求始终发往同一个RS;

动态方法:根据算法及各RS的当前负载(overhead)状态进行调度。

  • LC:Least Connection,overhead=Active*256+Inactive;

  • WLC:Weighted LC,overhead=(Active*256+Inactive)/weight;

  • SED:Shortest Expection Delay,overhead=(Active+1)*256/weight

  • NQ:Never Queue,SED算法的改进;

  • LBLC:Locality-Based LC,正向代理情况下的cache server调度;

  • LBLCR:Locality-Based Least-Connection with Replication,带复制功能的LBLC算法。

ipvsadm工具的使用

管理集群服务

ipvsadm -A|E -t|u|f service-address [-s scheduler]
ipvsadm -D -t|u|f service-address
    service-address(VIP):
        tcp: -t ip:port
        udp: -u ip:port
        fwm: -f mark
    -s scheduler:
        默认为wlc

管理集群服务中的RS

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
    server-address(RIP):
        ip[:port]
    lvs-type:
        -g: gateway,dr
        -i: ipip,tun
        -m: masquerade,nat

查看和清空

ipvsadm -C
ipvsadm -L|l [options]
    -n: numeric,基于数字 格式显示地址和端口
    -c:connection,显示ipvs连接;
    --stats:显示统计数据;
    --rate:显示速率;
    --exact:显示精确值。

保存和重载–> /etc/sysconfig/ipvsadm

ipvsadm -R --> ipvsadm--restore
ipvsadm -S --> ipvsadm--save

置零计数器

ipvsadm -Z [-t|u|f service-address]

原创文章,作者:Jeason,如若转载,请注明出处:http://www.178linux.com/62278

(0)
JeasonJeason
上一篇 2016-12-05 17:05
下一篇 2016-12-05 17:05

相关推荐

  • N25期第六周作业

    请详细总结vim编辑器的使用并完成以下练习题 1.复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加# sed -r 's/^[^[:space:]]+/#&/g' /tmp/rc.sysinit :%s/^[^[:space:]]\+/#&a…

    Linux干货 2016-12-26
  • AOP面向方面编程

    1.引言         软件开发的目标是要对世界的部分元素或者信息流建立模型,实现软件系统的工程需要将系统分解成可以创建和管理的模块。于是出现了以系统模块化特性的面向对象程序设计技术。模块化的面向对象编程极度极地提高了软件系统的可读性、复用性和可扩展性。向对象方法的焦点在于选择对象作为模块的主要单元,并将对象与系统的…

    Linux干货 2015-04-07
  • 8-16 Shell脚本之循环

    本节主要讲解Shell脚本的循环和软件包的管理 一、用until实现下列作业 1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统。 2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出 3、编写脚本,求100以内所有正整数之和 …

    Linux干货 2016-08-18
  • yum仓库搭建

    两台主机: 一台centos7  客户机 一台centos6  服务器 准备工作 1.查看是否共享服务是否可用 httpd或vsftpd 是否安装。确认安装之后选择vsftpd为共享服务/var/www/html和/var/ftp/pub为共享目录。 这里使用vsftpd,/var/ftp/pub这个目录为共享目录 在这个目录下建立一个独立的文件夹 [roo…

    2017-12-01
  • Redis基于Sentinel哨兵高可用方案

    下载最新redis版本,当前最新版本为  2.8.19  2014-12-30 安装redis 首页地址:http://redis.io/ 最新稳定版下载地址: http://download.redis.io/releases/redis-2.8.19.tar.gz # tar -xvf redis-2.8.19.tar.gz # cd…

    2015-03-03
  • CentOS下命令基础练习

    马哥教育网络班23期+第五周课堂作业 CentOS下命令基础练习 1、显示当前系统上root、fdeora或user1用户的默认shell 2、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello() 3、使用echo命令输出一个绝对路径 使用grep取出其基名 扩展:取出其路径名 (…

    Linux干货 2016-10-24