LVS

LVS 类型:NAT(-m地址转换)、DR(-g直接路由)、TUN(-i隧道),一般使用DR类型。

    NAT

        集群节点跟director必须在同一个IP网络中;
        RIP通常是私有地址,仅用于各集群节点间的通信;
        director位于client和real server之间,并负责处理进出的所有通信;
        realserver必须将网关指向DIP;支持端口映射;realserver可以使用任意OS;
        较大规模应该场景中,director易成为系统瓶颈;

    DR:集群节点跟director必须在同一个物理网络中;
        RIP可以使用公网地址,实现便捷的远程管理和监控;
        director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
        realserver不能将网关指向DIP;不支持端口映射;

    TUN:集群节点可以跨越Internet;RIP必须是公网地址;
        director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
        realserver网关不能指向director;只有支持隧道功能的OS才能用于realserver;
        不支持端口映射;

LVS调度方式:rr(轮询)、wrr(加权轮询)、dh(目标地址hash)、sh(源地址hash);

        lc(最少连接)、wlc(加权最少连接)、sed(最短期望延迟)、nq(永不排队)

        LBLC(基于本地的最少连接)、LBLCR(基于本地的带复制功能的最少连接)

        默认调度方式:wlc

一、以DR类型为例配置LVS服务器集群系统。

Director

VIP:192.168.1.30

DIP:192.168.1.50

realserver

RIP1:192.168.1.31

RIP2:192.168.1.32


1、Realserver配置。

[root@localhost ~]# sysctl -w net.ipv4.conf.eth0.arp_announce=2
[root@localhost ~]# sysctl -w net.ipv4.conf.all.arp_announce=2
[root@localhost ~]# sysctl -w net.ipv4.conf.all.arp_ignore=1
[root@localhost ~]# sysctl -w net.ipv4.conf.eth0.arp_ignore=1
arp_ignore: 定义接收到ARP请求时的响应级别;
            0:只要本地配置的有相应地址,就给予响应;
            1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应;

arp_announce:定义将自己地址向外通告时的通告级别;
            0:将本地任何接口上的任何地址向外通告;
            1:试图仅向目标网络通告与其网络匹配的地址;
            2:仅向与本地接口上地址匹配的网络进行通告;
[root@localhost ~]# ifconfig lo:0 192.168.1.50 broadcast 192.168.1.50 netmask 255.255.255.255 up
[root@localhost ~]# route add -host 192.168.1.50 dev lo:0
[root@localhost ~]# echo "server1.example.com" >/var/www/html/index.html

2、LVS服务器配置。

[root@localhost ~]# ntpdate us.pool.ntp.org  #同步网络时间
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1  #打开IP转发功能
[root@localhost ~]# curl http://192.168.1.31
server1.example.com
[root@localhost ~]# curl http://192.168.1.32
server2.example.com
[root@localhost ~]# ifconfig eth0:0 192.168.1.50/24 up
[root@localhost ~]# route add -host 192.168.1.50 dev eth0:0
[root@localhost ~]# ipvsadm -A -t 192.168.1.50:80 -s wlc
[root@localhost ~]# ipvsadm -a -t 192.168.1.50:80 -r 192.168.1.31 -g -w 3
[root@localhost ~]# ipvsadm -a -t 192.168.1.50:80 -r 192.168.1.32 -g -w 1
[root@localhost ~]# service ipvsadm save
[root@localhost ~]# ipvsadm -L -n --stats 
#查看状态的几个参数 --rate --timeout --sort --daemon

3、Realserver健康状态检查脚本,检查Realserver服务状态,自动增删。

#!/bin/bash
#
VIP=192.168.10.3
CPORT=80
FAIL_BACK=127.0.0.1
RS=("192.168.10.7" "192.168.10.8")
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
  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
    let COUNT++
  done 
  sleep 5
done

4、LVS持久连接

    无论使用算法,LVS持久都能实现在一定时间内,将来自同一个客户端请求派发至此前选定的RS。
    持久连接模板(内存缓冲区):

[root@localhost ~]# ipvsadm -A -t 192.168.1.50:80 -s rr -p 600  #持久端口连接
[root@localhost ~]# ipvsadm -A -t 192.168.1.50:0 -s rr -p 600  #持久客户端连接

        timeout: 持久连接时长,默认300秒;单位是秒;
    在基于SSL,需要用到持久连接;
    PPC:将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS;持久端口连接
    PCC:将来自于同一个客户端对所有端口的请求,始终定向至此前选定的RS;持久客户端连接;把所有端口统统定义为集群服务,一律向RS转发;
    PNMPP:持久防火墙标记连接,把若干个端口标记为一个集群资源,例:

[root@localhost ~]# iptables -t mangle -A PREROUTING -d 192.168.1.50 -i eth0 -p tcp --dport 80 -j MARK --set-mark 10
[root@localhost ~]# iptables -t mangle -A PREROUTING -d 192.168.1.50 -i eth0 -p tcp --dport 443 -j MARK --set-mark 10
[root@localhost ~]# ipvsadm -A -f 10 -s rr
[root@localhost ~]# ipvsadm -a -f 10 -r 192.168.1.31 -g
[root@localhost ~]# ipvsadm -a -f 10 -r 192.168.1.32 -g


你可能感兴趣的:(LVS,DR,vip)