linux下负载均衡集群 LVS之NAT和DR模型

1.集群类型分下3种:

LB: Load Balancing,负载均衡

HA:High Availability, 高可用

HP:High Performance, 高性能

2.LB负载均衡四层LVS类型分为以下3种:(Linux Virtual Server)

 NAT:地址转换

 DR: 直接路由

 TUN:隧道

2.1.NAT:

集群节点跟director必须在同一个IP网络中;

RIP通常是私有地址,仅用于各集群节点间的通信;

director位于client和real server之间,并负责处理进出的所有通信;

realserver必须将网关指向DIP;

支持端口映射;

realserver可以使用任意OS;

较大规模应该场景中,director易成为系统瓶颈;

2.2.DR: 常用类型

集群节点跟director必须在同一个物理网络中;

RIP可以使用公网地址,实现便捷的远程管理和监控;

director仅负责处理入站请求,响应报文则由realserver直接发往客户端;

realserver不能将网关指向DIP;

不支持端口映射;

比NAT类型支持更多集群结点

kernel parameter:

 arp_ignore: 定义接收到ARP请求时的响应级别;

0:只要本地配置的有相应地址,就给予响应;

1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应;

 arp_announce:定义将自己地址向外通告时的通告级别;

0:将本地任何接口上的任何地址向外通告;

1:试图仅向目标网络通告与其网络匹配的地址;

2:仅向与本地接口上地址匹配的网络进行通告;

2.3.TUN:

集群节点可以跨越Internet;

RIP必须是公网地址;

director仅负责处理入站请求,响应报文则由realserver直接发往客户端;

realserver网关不能指向director;

只有支持隧道功能的OS才能用于realserver;

不支持端口映射;

比NAT类型支持更多集群结点

3.LVS调度方法: 默认调度方法:wlc

3.1.四种静态调度方法:

 rr:轮询,round-robin

 wrr:加权轮询,Weight round-robin

 dh: 目标地址hash,Destinating Hashing

 sh:源地址hash,Source Hashing

3.2.六种动态调度方法:

lc: 最少连接 Least-connection

  active*256+inactive

wlc: 加权最少连接 Weighted Least-connection

  (active*256+inactive)/weight

sed: 最短期望延迟 Shortest Excepted Delay

 (active+1)*256/weight

nq: never queue

LBLC: 基于本地的最少连接 Locality-Based Least-Connection 

LBLCR: 基于本地的带复制功能的最少连接

Locality-Based Least-Connection with Replication Scheduling 


4.ipvsadm:管理集群服务命令行工具

4.1.管理集群服务

添加:-A -t|u|f service-address [-s scheduler]

    -t: TCP协议的集群 

    -u: UDP协议的集群

    service-address:  IP:PORT

    -f: FWM: 防火墙标记 

    service-address: Mark Number

修改:-E

删除:-D -t|u|f service-address

 例如:# ipvsadm -A -t 202.100.1.8:80 -s rr


4.2.管理集群服务中的RS

添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]

   -t|u|f service-address:事先定义好的某集群服务

   -r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;

   [-g|i|m]: LVS类型

    -g: DR

    -i: TUN

    -m: NAT

    [-w weight]: 定义服务器权重

修改:-e

删除:-d -t|u|f service-address -r server-address

例如:

# ipvsadm -a -t 202.100.1.8:80 -r 1.1.1.19 -m 

# ipvsadm -a -t 202.100.1.8:80 -r 1.1.1.20 -m

查看

 -L|l:列出

 -n: 数字格式显示主机地址和端口

 --stats:统计数据

 --rate: 速率

 --timeout: 显示tcp、tcpfin和udp的会话超时时长

 -c: 显示当前的ipvs连接状况

删除所有集群服务:-C:清空ipvs规则

保存规则:# ipvsadm -S > /指定存储路径

载入还原此前的规则:# ipvsadm -R < /备份的存储路径

5.负载均衡集群 LVS之NAT类型实例背景:

Director调度主机两张网卡,外网卡VIP为202.100.1.8,内网卡DIP为1.1.1.18

两台realserver主机RIP分别为1.1.1.19和1.1.1.20,网关必须指向1.1.1.18,并安装httpd服务

wKiom1eN2HyyY6NuAADzNtE00RM306.jpg-wh_50

5.1.LVS_NAT类型实例web负载均衡,调度方法为rr

Director主机:配置如下

# ipvsadm -A -t 202.100.1.8:80 -s rr

# ipvsadm -a -t 202.100.1.8:80 -r 1.1.1.19 -m

# ipvsadm -a -t 202.100.1.8:80 -r 1.1.1.20 -m

# ipvsadm -L -n 

# ipvsadm -L -n --stats

两台realserver主机仅安装httpd服务并启动...省略

5.2.LVS_NAT类型实例web负载均衡,修改调度方法为wrr,并修改Weight权重比例

Director主机:配置如下

# ipvsadm -E -t 202.100.1.8:80 -s wrr

# ipvsadm -e -t 202.100.1.8:80 -r 1.1.1.19 -w 4 -m

# ipvsadm -e -t 202.100.1.8:80 -r 1.1.1.20 -w 1 -m

# ipvsadm -L -n 

# ipvsadm -L -n --stats

两台realserver主机仅安装httpd服务并启动...省略

6.负载均衡集群 LVS之DR类型实例背景

Director调度主机仅一张网卡,网卡eth0:DIP为1.1.1.18,eth0:0 VIP 1.1.1.100,

 一台realserver主机网卡 eth0:RIP分别为1.1.1.19 和 lo:0 VIP 1.1.1.100,

另一台realserver主机网卡 eth0:RIP分别为1.1.1.20 和 lo:0 VIP 1.1.1.100,

并都安装httpd服务

wKiom1eO6_7zMGlHAAFrNTHCrTs971.jpg-wh_50

Director主机:配置如下

ifconfig eth0 1.1.1.18 netmask 255.255.255.0 up

ifconfig eth0:0 1.1.1.100 netmask 255.255.255.255 broadcast 1.1.1.100 up

route add -host 1.1.1.100 dev eth0:0

ipvsadm -C

ipvsadm -A -t 1.1.1.100:80 -s wlc

ipvsadm -a -t 1.1.1.100:80 -r 1.1.1.19 -g -w 2

ipvsadm -a -t 1.1.1.100:80 -r 1.1.1.20 -g -w 1

ipvsadm -L -n

ipvsadm -L -n --stats

一台realserver主机:

sysctl -w net.ipv4.conf.eth0.arp_ignore=1 

sysctl -w net.ipv4.conf.all.arp_ignore=1 

sysctl -w net.ipv4.conf.all.arp_announce=2

sysctl -w net.ipv4.conf.eth0.arp_announce=2

ifconfig eth0 1.1.1.19 netmask 255.255.255.0 up

ifconfig lo:0 1.1.1.100 netmask 255.255.255.255 broadcast 1.1.1.100 up

route add -host 1.1.1.100 dev lo:0

另一台realserver主机:

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 

echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 

ifconfig eth0 1.1.1.20 netmask 255.255.255.0 up

ifconfig lo:0 1.1.1.100 netmask 255.255.255.255 broadcast 1.1.1.100 up

route add -host 1.1.1.100 dev lo:0


7.realserver健康检查脚本

#!/bin/bash

#

VIP=1.1.1.100

CPORT=80

FAIL_BACK=127.0.0.1

RS=("1.1.1.19" "1.1.1.20")

declare -a RSSTATUS

RW=("2" "1")

RPORT=80

TYPE=g

CHKLOOP=3

LOG=/var/log/ipvsmonitor.log


addrs() {

  ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2

  [ $? -eq 0 ] && return 0 || return 1

}


delrs() {

  ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT

  [ $? -eq 0 ] && return 0 || return 1

}


checkrs() {

  local I=1

  while [ $I -le $CHKLOOP ]; do

    if curl --connect-timeout 1 http://$1 &> /dev/null; then

      return 0

    fi

    let I++

  done

  return 1

}


initstatus() {

  local I

  local COUNT=0;

  for I in ${RS[*]}; do

    if ipvsadm -L -n | grep "$I:$RPORT" &> /dev/null ; then

     RSSTATUS[$COUNT]=1

    else

      RSSTATUS[$COUNT]=0

    fi

  let COUNT++

  done

}


initstatus

while :; do

  let COUNT=0

  let FAIL=0

  for I in ${RS[*]}; do

    if checkrs $I; then

      if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then

         addrs $I ${RW[$COUNT]}

         [ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG

      fi

    else

      if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then

         delrs $I

         [ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG

      fi

    fi

    FAIL=$[$FAIL+${RSSTATUS[$COUNT]}]

    let COUNT++

  done

 #以下部分检查当realserver主机全部掉线,自动切换至Director主机显示维护网页

 #当其中有一台realserver主机上线,立即切换至正常业务,维护网页自动下线

  if [  $FAIL -eq 0 ]; then

      if ! ipvsadm -L -n | grep "$FAIL_BACK:$RPORT" &> /dev/null ; then

         ipvsadm -a -t $VIP:$CPORT  -r $FAIL_BACK:$RPORT

      fi

  else

     if ipvsadm -L -n | grep "$FAIL_BACK:$RPORT" &> /dev/null;then

          ipvsadm -d -t $VIP:$CPORT  -r $FAIL_BACK:$RPORT

     fi

  fi

  sleep 5

done

8.LVS持久连接

定义:无论使用何种算法,LVS持久都能实现在一定时间内,将来自同一个客户端请求派至此前选定的RS

定义格式:ipvsadm -A|E ... -p timeout:

timeout: 持久连接时长,默认300秒;单位是秒;

LVS持久连接可分为以下常用3类:

PPC:将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS;即为:持久端口连接

PCC:将来自于同一个客户端对所有端口的请求,始终定向至此前选定的RS;即为:持久客户端连接

    把所有端口统统定义为集群服务,一律向RS转发;

PNMPP:将部分指定的不同端口集群服务都标记成同一个标号,即为:持久防火墙标记连接

    注意在PREROUTING时就要打上标记

LVS_PPC实例1:

ipvsadm -A -t 1.1.1.100:80 -s rr -p 600

ipvsadm -a -t 1.1.1.100:80 -r 1.1.1.19 -g -w 2

ipvsadm -a -t 1.1.1.100:80 -r 1.1.1.20 -g -w 1

LVS_PCC实例2:

ipvsadm -A -t 1.1.1.100:0 -s rr -p 600

ipvsadm -a -t 1.1.1.100:0 -r 1.1.1.19 -g -w 2

ipvsadm -a -t 1.1.1.100:0 -r 1.1.1.20 -g -w 1

LVS_PNMPP实例3:

iptables -t mangle -A PREROUTING -d 1.1.1.100 -i eth0 -p tcp --dport 80 -j MARK --set-mark 10

iptables -t mangle -A PREROUTING -d 1.1.1.100 -i eth0 -p tcp --dport 443 -j MARK --set-mark 10

iptables -t mangle -A PREROUTING -d 1.1.1.100 -i eth0 -p tcp --dport 23 -j MARK --set-mark 10

ipvsadm -A -f 10 -s rr -p 600

ipvsadm -a -f 10 -r 1.1.1.19 -g -w 3

ipvsadm -a -f 10 -r 1.1.1.20 -g -w 2