LVS集群基础(三):DR模型实现

在LVS-DR模型中因为director和realserver在同一个网段中,且都配置的有VIP地址,为了使realserver上不响应vip当然arp广播请求,我们要在realserver上配置arp_ignore和arp_announce两个参数。在内核2.4.26和2.6.4的版本以后,附带了这两个设备标志。

arp_announce:用于定义本地主机,在向外通告本机所配置ip地址的限定级别的。

0:表示把本地主机上所有网卡的所有ip地址都通告给所练网络
1:表示尽量避免要不在同网络的ip地址告诉不是同网络的主机。
2:表示避免把不在同网络的ip地址告诉不是本网络的主机。

arp_ignore:用于定义收到广播通知时的动作

0:表示收到arp请求中ip地址在本主机上时机响应该arp请求。
1:表示只有收到arp请求的网卡是该arp请求的ip地址才响应。
2.表示只用收到的arp请求的网卡是该arp请求的ip地址且发起该arp的ip地址和请求的地址在同一个网络,才响应。

如下图所示,外网用户直接访问Director上的VIP地址,Director将请求分派给real server 进行处理,当realserver处理后不再经过Director,而是直接送至客户端,绕开了Director,使Director不再成为瓶颈。可以有大量的节点,最多可以有100个节点

LVS集群基础(三):DR模型实现_第1张图片

实验拓扑:

LVS集群基础(三):DR模型实现_第2张图片

说明:路由器采用linux模拟,使用iptables的NAT实现

一、实验环境准备:

1.1 准备虚拟机:
准备四台linux虚拟机(我这里使用centos 6.4 x86_64),并为路由器linux添加两块网卡,一块接外网,一块接内网。其他服务器都只需要一块网卡。router的内网网卡和集群服务器的的网卡需划分到一个独立的vm交换机上,这点需要注意。

具体如下:

LVS集群基础(三):DR模型实现_第3张图片
LVS集群基础(三):DR模型实现_第4张图片

然后启动各虚拟机,按上述拓扑规划配置好IP地址。

1.2 配置路由器(linux)
使用iptables实现NAT配置较为简单,主要如下:

1.2.1 开启转发功能:

[root@router ~]# echo 1 >/proc/sys/net/ipv4/ip_forward

如果需永久修改,则需要修改sysctl.conf文件。并使用sysctl -p 使其立即生效。

1.2.2 配置iptables:
清除所有规则:

[root@router ~]# iptables –F

配置NAT功能:

[root@router ~]# iptables -t nat -A POSTROUTING -o eth0 -s 172.16.1.0/24 -j SNAT --to 192.168.8.254 
[root@router ~]# iptables -t nat -A PREROUTING -d 192.168.8.254 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.253:80

##为了方便使用ssh客户端连接,我还将lvs集群中各服务器的22端口映射到了不同端口,具体如下:

[root@router ~]# iptables -t nat -A PREROUTING -d 192.168.8.254 -p tcp --dport 2022 -j DNAT --to-destination 172.16.1.252:22 
[root@router ~]# iptables -t nat -A PREROUTING -d 192.168.8.254 -p tcp --dport 2122 -j DNAT --to-destination 172.16.1.101:22 
[root@router ~]# iptables -t nat -A PREROUTING -d 192.168.8.254 -p tcp --dport 2222 -j DNAT --to-destination 172.16.1.102:22

配转发功能:

[root@router ~]# iptables -A FORWARD -p ip -j ACCEPT

保存规则:

[root@router ~]# service iptables save

此时,Director和RealServer都已可以正常访问外网。

1.3 配置本地windows,添加路由使其能访问lvs集群:

由于试验中物理主机(windows)和试验用路由器(linux)的默认网关指向的是真实的路由器,因此物理主机(windows)是无法访问lvs集群网络的,为了能让物理机(windows)访问到集群网络方便后面测试,因此需要添加路由,命令如下:

C:\windows\system32>route add 172.16.1.0/24 192.168.8.254
操作完成!

二、配置Director

2.1 启用转发

[root@lvs ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

如果想永久生效,则需要修改/etc/sysctl.conf文件。

2.2 配置VIP和路由:

配置路由:

[root@lvs ~]# route add -host 172.16.1.253 dev eth0:0

配置VIP:

[root@lvs ~]# ifconfig eth0:1 172.16.1.253 netmask 255.255.255.255 up

2.3 清除原有iptables和ipvs规则:

[root@lvs ~]# iptables -F

[root@lvs ~]# iptables -Z

[root@lvs ~]# ipvsadm -C

2.4 配置集群服务:

[root@lvs ~]# ipvsadm -A -t 172.16.1.253:80 -s wlc

2.5 添加RS至集群服务:

[root@lvs ~]# ipvsadm -a -t 172.16.1.253:80 -r 172.16.1.101 -g

[root@lvs ~]# ipvsadm -a -t 172.16.1.253:80 -r 172.16.1.102 -g

2.6 将上述过程编写为一个服务脚本,直接在Director上实现开机启动:

#!/bin/bash 
# 
# LVS script for VS/DR 
# chkconfig: - 90 10 
# 
. /etc/rc.d/init.d/functions 
# 
VIP=172.16.1.253 
DIP=172.16.1.252 
RIP1=172.16.1.101 
RIP2=172.16.1.102 
PORT=80 
RSWEIGHT1=5 
RSWEIGHT2=5

# 
case "$1" in 
start)          

  /sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up 
  /sbin/route add -host $VIP dev eth0:1

# Since this is the Director we must be able to forward packets 
  echo 1 > /proc/sys/net/ipv4/ip_forward

# Clear all iptables rules. 
  /sbin/iptables -F

# Reset iptables counters. 
  /sbin/iptables -Z

# Clear all ipvsadm rules/services. 
  /sbin/ipvsadm -C

# Add an IP virtual service for VIP 192.168.0.219 port 80 
# In this recipe, we will use the round-robin scheduling method. 
# In production, however, you should use a weighted, dynamic scheduling method. 
  /sbin/ipvsadm -A -t $VIP:80 -s wlc

# Now direct packets for this VIP to 
# the real server IP (RIP) inside the cluster 
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w $RSWEIGHT1 
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w $RSWEIGHT2

  /bin/touch /var/lock/subsys/ipvsadm &> /dev/null 
;;

stop) 
# Stop forwarding packets 
  echo 0 > /proc/sys/net/ipv4/ip_forward

# Reset ipvsadm 
  /sbin/ipvsadm -C

# Bring down the VIP interface 
  /sbin/ifconfig eth0:0 down 
  /sbin/route del $VIP 
  
  /bin/rm -f /var/lock/subsys/ipvsadm 
  
  echo "ipvs is stopped..." 
;;

status) 
  if [ ! -e /var/lock/subsys/ipvsadm ]; then 
    echo "ipvsadm is stopped ..." 
  else 
    echo "ipvs is running ..." 
    ipvsadm -L -n 
  fi 
;; 
*) 
  echo "Usage: $0 {start|stop|status}" 
;; 
esac

将上述内容保存在/etc/init.d/lvs-director文件中,然后添加到服务:

[root@lvs ~]# chmod +x /etc/init.d/lvs-director

[root@lvs ~]# chkconfig --add lvs-director

[root@lvs ~]# chkconfig lvs-director on

[root@lvs ~]# /etc/init.d/lvs-director start 
[root@lvs ~]# /etc/init.d/lvs-director status 
ipvs is running ... 
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags 
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn 
TCP  172.16.1.253:80 wlc 
  -> 172.16.1.101:80              Route   5      0          0         
  -> 172.16.1.102:80              Route   5      0          0

三、配置RS:

3.1 配置ARP广播:

[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

3.2 配置VIP和路由:

[root@rs1 ~]# ifconfig lo:0 172.16.1.253 netmask 255.255.255.255 up

[root@rs1 ~]# route add -host 172.16.1.253 dev lo:0

3.3 编写为脚本:

#!/bin/bash 
# 
# Script to start LVS DR real server. 
# chkconfig: - 90 10 
# description: LVS DR real server 
# 
.  /etc/rc.d/init.d/functions

VIP=172.16.1.253

host=`/bin/hostname`

case "$1" in 
start) 
       # Start LVS-DR real server on this machine. 
        /sbin/ifconfig lo down 
        /sbin/ifconfig lo up 
        echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
        echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
        echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
        echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up 
        /sbin/route add -host $VIP dev lo:0

;; 
stop)

        # Stop LVS-DR real server loopback device(s). 
        /sbin/ifconfig lo:0 down 
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
        echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce 
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore 
        echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

;; 
status)

        # Status of LVS-DR real server. 
        islothere=`/sbin/ifconfig lo:0 | grep $VIP` 
        isrothere=`netstat -rn | grep "lo:0" | grep $VIP` 
        if [ ! "$islothere" -o ! "isrothere" ];then 
            # Either the route or the lo:0 device 
            # not found. 
            echo "LVS-DR real server Stopped." 
        else 
            echo "LVS-DR real server Running." 
        fi 
;; 
*) 
            # Invalid entry. 
            echo "$0: Usage: $0 {start|status|stop}" 
            exit 1 
;; 
esac

保存至/etc/init.d/lvs-rs,并赋予执行权限,然后添加为开机启动:

[root@rs1~]# chmod +x /etc/init.d/lvs-rs

[root@rs1 ~]# chkconfig --add lvs-rs

[root@rs1 ~]# chkconfig lvs-rs on

[root@rs1 ~]# /etc/init.d/lvs-rs start

3.4 在RS2上采用相同的配置即可
至此就全部完成了lvs的DR模型配置。

4. 测试LVS集群

4.1 配置web服务器:
4.1.1 为rs1节点添加web主页:

[root@rs1 ~]# service httpd start 
正在启动 httpd:httpd: apr_sockaddr_info_get() failed for rs1 
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName 
                                                           [确定] 
[root@rs1 ~]# echo "This is RS1..." >/var/www/html/index.html

4.1.2 为rs2节点添加web主页:

[root@rs2 ~]# echo "This is RS2..." >/var/www/html/index.html

4.2 访问测试:
访问时观察ipvs状态:

Every 1.0s: ipvsadm -L -n                                                                        Tue Oct  8 19:58:42 2013

IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags 
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn 
TCP  172.16.1.253:80 wlc 
  -> 172.16.1.101:80              Route   5     2          8 
  -> 172.16.1.102:80              Route   5     1          8

你可能感兴趣的:(LVS集群基础(三):DR模型实现)