天天看点

lvs

lvs是linux virtual server的简称,也就是linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在lvs已经是 linux标准内核的一部分,在linux2.4内核以前,使用lvs时必须要重新编译内核以支持lvs功能模块,但是从linux2.4内核以后,已经完全内置了lvs的各个功能模块,无需给内核打任何补丁,可以直接使用lvs提供的各种功能。

lvs

lvs:四层路由,四层交换

         根据目标ip和port实现请求转发至后端的多个主机中的一个(根据挑选法则)

         借助于netfilter

         查看内核是否编译进来lvs命令

         grep –i “ipvs”  /boot/config-version,否则重新编译内核

lvs:

         ipvsadm:用户空间用于转发规则的程序

         ipvs:工作于内核空间的input链根据规则完成请求调度的程序

         支持的协议:tcp udp sctp ah esp ah_esp

lvs中常用术语

director:主要作用类似于一个路由器,它含有完成lvs功能所设定的路由表,通过这些路由表把用户的请求分发给server array层的应用服务器(real server)上。同时,在director server上还要安装对real server服务的监控模块ldirectord,此模块用于监测各个real server服务的健康状况

real  server:real server可以是web服务器、mail服务器、ftp服务器、dns服务器、视频服务器等

client ip:cip

director ip:dip

director virtual   ip:vip

real server ip:rip

lvs类型

        lvs-nat:

                1、rs应用使用私有地址;rs的网关必须指向dip;

                2、请求和响应都要经过director;高负载场景中,director易成为性能瓶颈;

                3、支持端口映射;

                4、rs可以使用任意

                5、rip和dip要在同一网段

        lvs-dr:修改目标mac,直接送给网卡驱动,目标mac是基于调度方法选出某rs的网络接口的mac地址

            1、保证前端路由将目标地址为vip的报文统统发往directory,而不能是rs;

                解决方案:

                    (1) 静态地址绑定:在前端路由器上操作

                        问题:未必有路由操作权限

                    (2) aprtables

                    (3) 修改rs上内核参数,将rs上的vip配置在lo接口的别名上,并限制其不能响应对vip地址解析请求;

            2、rs可以使用私有地址;但也可以使用公网地址,此时可通过互联网通过rip对其直接发起管理访问;

            3、rs跟directory必须在同一物理网络中;

            4、请求报文经由director,但响应报文必须不能经过director;

            5、不支持端口映射;

            6、rs可以是大多数常见的os;

            7、rs的网关绝不允许指向dip;

        lvs-tun:不修改请求报文ip首部,通过隧道机制在ip首部外部再封装一个ip首部(sip:dip,dip:rip),进过网络发往服务器

                1、rip、vip、dip全部是公网地址;

                2、rs的网关不会也不可能指向dip;

                3、请求报文经由director,但响应报文必须不能经过director;

                4、不支持端口映射;

                5、rs的os必须支持隧道功能;

        lvs-fullnat:

lvs scheduler:wlc默认调度算法

        # grep -i 'vs' /boot/config-version

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

            rr: round robin,轮流,轮询,轮叫

            wrr: weighted round robin, 加权轮询

            sh: source hashing,源地址hash,表示来源于同一个cip的请求将始终被定向至同一个rs;session保持;

            dh: destination hashing, 目标地址hash,

        动态方法:根据算法及各rs当前的负载状况进行调度

            lc: least connection,最少连接

                overhead=active*256+inactive

            wlc: weighted lc

                overhead=(active*256+inactive)/weight 

            sed: shortest expection delay

                overhead=(active+1)*256/weight 

     lvs调度基于定义的集群服务进行的。

            定义集群服务

            为集群添加各rs

ipvsadm用法:

         管理集群服务:

                ipvsadm -a|e -t|u|f service-address [-s scheduler]

                ipvsadm -d -t|u|f service-address

                       -a:添加

                       -e:修改

                       -d:删除

                       -t:tcp协议

                       -u:udp协议

                       -f:fwm,防火墙标记,标记用数字表示,将多个端口绑定在一起定义成一个集群服务时使用

                     service-address:

                         -t|u: vip:port

                         -f: #

            向一个已经存在集群服务添加一个rs:

                ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]

                ipvsadm -d -t|u|f service-address -r server-address

                       -a:添加rs

                       -e:修改rs

                       -d:删除rs

                       -r server-address:rs的地址 ip[:port]port省略默认使用相同端口

                       -g:gateway

                        -i:ipip

                        -m:masquerade

                        -w:权重

          查看已经定义的集群服务及rs:

                 ipvsadm -l -n

                     -c: 查看各连接

                     --stats: 统计数据

                     --rate: 速率

                     --exact: 精确值

          清空所有的集群服务:

                 ipvsadm -c

           保存集群服务定义:

                 ipvsadm -s > /path/to/some_rule_file

                 ipvsadm-save > /path/to/some_rule_file

             让规则文件中的规则生效:

                 ipvsadm -r < /path/from/some_rule_file

                 ipvsadm-restore < /path/from/some_rule_file

rs: 配置内核参数

    arp_ignore: 如何响应接收arp地址请求;默认0;1表示仅在请求的地址配置在请求报文的接口进行响应;

    arp_announce: 如何通告本地地址;默认0;2表示仅通过网络直连的接口的地址;

rs:首先配置内核参数

    配置vip时使用:

    ifconfig lo:0 vip netmask 255.255.255.255 broadcast vip up

    route add -host vip dev lo:0

keepalived:

结合netfilter来实现一种集群服务定义机制;

                (1) 在mangle表的prerouting链定义规则,实现指定防火墙标记;

                # iptables -t mangle -a prerouting -d vip -p {tcp|udp} --dport port -j mark --set-mark #

                (2) 基于此前的标记定义集群服务;

                # ipvsadm -a -f # [-s method]

                # ipvsadm -a -f # -r rs [options]

            功能:将同属于同一组应用的多个不同端口的服务定义成一个集群服务,统一调度;

lvs持久连接功能:

            无论使用什么调度方法,持久连接功能都能保证在指定的一段时间内,来自同一个用户的请求始终被定向至同个rs;其调度基准为集群服务;

            持久连接的类型:

                pcc:

                    在基于tcp或udp定义集群服务时,其端口为0,格式为vip:0,表示将来自于用户请求的任何一种请求(无论请求指定协议的哪个端口)统统转给后端的rs;基于持久连接时,来自于同一个client的所有请求统统被转发至同一个rs;

                  ipvsadm –a –t ip:0    –s rr –p  300

                  ipvsadm –a –t  ip:0 –r rip –g -w

                ppc:每端口持久

                    持久机制;单服务调度;各集群服务分开调度

                pfm:单服务调度;可以通过防火墙标记将多个协议定义为同一个服务;

ipvs:对rs的健康状态检查可以借助于keepalived实现

                 检查思路:

                     1.ip:icmp

                     2.传输层:端口开放状态

                      3.应用层:请求关键性资源

rs的健康状态检测:

            1、自动上下线各rs;

                如果状态发生了改变:

                    online --> fail

                        探测三次及以上;

                    offline --> ok

                        一次即可;

            2、所有rs均故障时,应该提供一个back server; 

            如何检测rs的健康状态:

                利用集群服务依赖的协议进行检测

                利用端口扫描或探测类工具对指定协议的端口进行探测

                在网络层探测 

继续阅读