wangyp

博客园 首页 联系 订阅 管理

简介

The Linux Virtual Server is a highly scalable and highly available server built on a cluster of real servers, with the load balancer running on the Linux operating system. The architecture of the server cluster is fully transparent to end users, and the users interact as if it were a single high-performance virtual server. For more information, click here.
 
层次
 
lvs需要有ipvs模块进行支持,一般Linux内核2.4之后都会存在此模块,可通过lsmod查看。ipvs实现了负载调度的功能,工作在内核层次
[root@salt-node01 ~]# lsmod | grep ip_vs
ip_vs_rr               12600  0 
ip_vs                 141092  2 ip_vs_rr
nf_conntrack          111302  7 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_conntrack_ipv4,nf_conntrack_ipv6
libcrc32c              12644  2 xfs,ip_vs
You have new mail in /var/spool/mail/root

 

管理工具(均可通过yum来安装):

ipvsadm、keepalived、 Piranha(RedHat提供的)

 

术语:

CIP、VIP、DIP、RIP

 

集群组成:

利用LVS搭建的集群系统由3部分组成:最前端的是负载均衡层,中间层是服务器集群层,最后层是共享存储层。共字存储层是为所有Real Server提供共亨存储空问和内容一致性的存储区域,一般由磁盘阵列设备组成。为了提俱内容的一致性,一般可以通过NFS网络义件系统共 亨数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件 系统,例如Red Hat的GFS文件系统,Oracle提供的OS2文件系统等。此文章不对共享存储层做详细介绍,详情可参照后边的文章。如下图所示

 

模式:

A.NAT 作用于4层,传输层

流程:初始是CIP:VIP  经过LB时,LB根据调度算法选择合适的后端RealServer,并将数据包的vip修改为realserver的ip地址,并写到hash记录表中;此时数据包变为了CIP:RIP。将数据包发送给RIP,RIP进行处理后将数据包(RIP:CIP)发送给LB,LB根据hash记录表,将RIP修改为VIP,然后将数据包发送给CIP。来访问是DNAT的过程,返回是SNAT的过程。

LB:需要在指定网卡绑定vip

RS:需要将网关设置为LB的IP地址

优点:可对指定后端rs的端口,即可以更改端口

缺点:进出数据包都会经过LB,LB的网卡流量会是瓶颈

适用场景:非高并发请求场景,10个RS以内;可隐藏内部的DIP和RIP地址;

B.DR 作用于二层,数据链路层

流程:初始数据包目标MAC地址是LB的MAC,经过LB时,LB根据调度算法选择合适的后端RealServer,并将数据包的目标MAC地址修改为realserver的MAC地址,此时数据包的目标地址是RS的MAC,数据包在LB经过泛洪,发送到RS,RS处理时,发现数据IP是自己Lo的IP地址,所以可以进行处理不会丢弃;RS处理数据包后,将数据包VIP:CIP直接发送给CIP

LB:需要在指定网卡绑定VIP

RS:需要抑制ARP,且LB和RS要在一个广播域

缺点:不能更改端口,LB和RS必须在一个广播域,需要关闭RS的arp解析,绑定vip

优点:负载能力比NAT强,LB流量不会是瓶颈

场景:因为响应报文不经过Director,极大的减轻了Director的负载压力,故Director可以支持更大的并发访问,一般RS在100台以内;

C.IP TUN

D.FULLNAT

 调度算法:

--scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
                                      the default scheduler is wlc.
 静态算法:
rr:Round Robin # 即轮询
wrr:Weighted RR # 即加权轮询
sh:Source Hashing # 即来源IP地址hash
dh:Destination Hashing # 即目标地址hash(不常用,仅用于前端多防火墙的场景,保证防火墙的连接追踪功能有效)

 动态算法:

lc:Least Connection
# 评判标准:Overhead=Active*256+Inactive
# Overhead最小者胜出
wlc:Weighted LC
# 评判标准:Overhead=(Active*256+Inactive)/weight
# Overhead最小者胜出
sed:Shortest Expect Delay
# 评判标准:Overhead=(Active+1)*256/weight
# Overhead最小者胜出
nq:Never Queue # 集群开始时工作时,每台服务器都至少分配一个连接请求,然后再根据sed算法调度;
lblc:Locality-based Least Connection # 类似于dh+lc
lblcr:Relicated and Locality-based Least Connection # 主要用于后端服务器是缓存服务器时

IPVSADM命令参数详解:

ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
ipvsadm --stop-daemon
ipvsadm -h
命令选项解释:
有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可以。
-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。  修改定义过的集群服务
-D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear 清除内核虚拟服务器表中的所有记录。
-R --restore 恢复虚拟服务器规则
-S --save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list 显示内核虚拟服务器表 userver 列表;
-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
--set tcp tcpfin udp 设置连接超时值
--start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。
--stop-daemon 停止同步守护进程
-h --help 显示帮助信息
其他的选项:
-t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]
-u --udp-service service-address 说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]
-f --fwmark-service fwmark 说明是经过iptables 标记过的服务类型。通常用于将两个或两个以上的服务绑定为一个服务进行处理时使用;
-s --scheduler scheduler 使用的调度算法,有这样几个选项 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是:wlc.
-p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。 持久连接;
-M --netmask netmask persistent granularity mask
-r --real-server server-address 真实的服务器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式) DR模型
-i --ipip 指定LVS 的工作模式为隧道模式
-m --masquerading 指定LVS 的工作模式为NAT 模式
-w --weight weight 真实服务器的权值
--mcast-interface interface 指定组播的同步接口
-c --connection 显示LVS 目前的连接 如:ipvsadm -L -c
--timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon 显示同步守护进程状态
--stats 显示统计信息 ipvsadm –Ln  --state 总共的数量
--rate 显示速率信息 ipvsadm –Ln  --rete 平均值
--sort 对虚拟服务器和真实服务器排序输出
--numeric -n 输出IP 地址和端口的数字形式

集群相关参数:

-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]
-u --udp-service service-address 说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]
-s --scheduler scheduler 使用的调度算法,有这样几个选项 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是:wlc.
-p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。 持久连接;
-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。  修改定义过的集群服务
-D :删除指定集群服务

RS相关参数:

-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器         向指定的CS中添加RS
-r --real-server server-address 真实的服务器[Real-Server:port],只有支持端口映射的LVS类型才允许此处使用跟集群服务中不同的端口
LVS 类型:
-g : gateway,DR # 指定集群类型为LVS/DR
-i ipip,TUN  # 指定集群类型为LVS/TUN
-m:masquerade,NAT # 指定集群类型为 NAT
-w:指定RS权重:
-e:修改指定的RS属性
-d :从指定的集群服务中删除某RS

  

DR模式配置实例:

LB:lvs服务端启停脚本

[root@salt-node01 sbin]# cat ipvs

##CONSTANT
VIP=192.168.142.140
INTERFACE=ens33
SUBINTERFACE=$INTERFACE:`echo ${VIP} | awk -F "." '{print $4}'`
PORT=80
METHOD=rr
RETVAR=0

RIPS=(
192.168.68.150
192.168.68.152
)


##COMMAND OF ABS PATH
IP=/usr/sbin/ip
IPVSADM=/usr/sbin/ipvsadm

. /etc/init.d/functions

function Usage(){


  echo "Usage: $0 {start|stop|status|restart}"
  return 1

}

function ipvsStart(){

  $IP addr add $VIP/24 dev ${INTERFACE}  label $SUBINTERFACE
  $IPVSADM -C
  #add vip instance
  $IPVSADM -A -t $VIP:$PORT -s $METHOD
  #echo ${#RIPS[*]}
  for((i=0;i<`echo ${#RIPS[*]}`;i++))
        do
      $IPVSADM -a -t $VIP:$PORT -r ${RIPS[$i]}:$PORT -g
    done
  RETVAR=$?

  if [ $RETVAR -eq 0 ]
    then
      action "Ipvsadm started sucessed"  /bin/true
  else
    action "Ipvsadm started failed"   /bin/false
  fi
}

function ipvsStop(){

        #clear virtual server
        $IPVSADM -C
        #clear number of connection
        $IPVSADM -Z
        $IP addr del $VIP/24 dev ${INTERFACE}  label $SUBINTERFACE &>/dev/null

        RETVAR=$?

        if [ $RETVAR -eq 0 ]
                then
                        action "Ipvsadm stopped" /bin/true
        else
                action "Ipvsadm stopped" /bin/false
        fi

        return $RETVAR
}


main(){

#Judge argv num
if [ $# -ne 1 ];
     then
       Usage $0
fi
echo $1
case "$1" in
    start)
    ipvsStart
    ;;
    restart)
    ipvsStop
    ipvsStart
    ;;
    *)
    Usage $0
    ;;
esac
}


main  $*

  

 健康检查:

本身无健康检查功能,需要自己写自定义脚本(nmap实现)
 
配合keepalived使用
 
案例汇总:
Q:lvs rr算法,但是请求不均,
调整会话保持时间:lvs会话保持时间和后端RS的会话保持时间
Q: 更换防火墙IP,造成旧节点无法访问
IDC机房刷新arp缓存表时间较长
Q:LVS RS下架,用作其他服务用;lo口绑定vip
完善下线机制

 

 

posted on 2017-05-23 11:40  wangyp  阅读(263)  评论(0编辑  收藏  举报