扩大
缩小

LINUX负载均衡LVS-DR搭建

1.搭建前的规划工作

这里从lvs官方网站找了一个nat模型的图,如下:

 

我这里使用虚拟机模拟出了4台rhel6机器。一台服务器作为lvs调度器(和宿主机桥接),3台服务器作为具体的web服务器(使用桥接模式),我本是的宿主机就是作为web测试机器。

具体配置如下

机器名称 eth0 eth0:0 备注信息
lvs调度器 192.168.168.200 192.168.168.20  
RS1 192.168.168.201    
RS2 192.168.168.202    
RS3 192.168.168.203    
宿主机  192.168.168.10(windows)    

2.检查操作系统支持lvs情况

[root@localhost ~]# grep -i 'vs' /boot/config-2.6.32-279.el6.i686      #有输出说明支持,我们使用的rhel6,默认的编译就有lvs模块。

3.安装ipvsadm工具

[root@localhost ~]# yum -y install ipvsadm

4.ipvsadm工具的简单使用

复制代码
ipvsadm:
    管理集群服务
        添加:-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 172.16.100.1:80 -s rr

    管理集群服务中的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 172.16.100.1:80 -r 192.168.10.8 -m 
        # ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -m
    查看
        -L|l
            -n: 数字格式显示主机地址和端口
            --stats:统计数据
            --rate: 速率
            --timeout: 显示tcp、tcpfin和udp的会话超时时长
            -c: 显示当前的ipvs连接状况

    删除所有集群服务
        -C:清空ipvs规则
    保存规则
        -S 
        # ipvsadm -S > /path/to/somefile
    载入此前的规则:
        -R
        # ipvsadm -R < /path/form/somefile
复制代码

5.设置arp响应配置并配置VIP

#下面的四个都需要在三个rs服务器上执行。
[root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost ~]# ifconfig lo:0 192.168.168.200 broadcast 192.168.168.200 netmask 255.255.255.255 up

6.测试arp配置正确性

在宿主机上,我们执行

C:\Windows\system32>ping 192.168.168.200             #先ping下

正在 Ping 192.168.168.200 具有 32 字节的数据:
来自 192.168.168.200 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.168.200 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.168.200 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.168.200 的回复: 字节=32 时间<1ms TTL=64

192.168.168.200 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms
C:\Windows\system32>arp -a 192.168.168.200        #这里查看下arp解析的mac地址是不是和lvs的mac地址一致,而不是3个rs服务器上的mac地址。

接口: 192.168.168.10 --- 0x18
  Internet 地址         物理地址              类型
  192.168.168.200       00-0c-29-d7-4a-43     动态

C:\Windows\system32>arp -d #情况arp解析信息。 我们这里清空,确保每次都是可以获取的是lvs的mac地址,而不是3个rs的mac地址

C:\Windows\system32>ping 192.168.168.200 #ping下

正在 Ping 192.168.168.200 具有 32 字节的数据:
来自 192.168.168.200 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.168.200 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.168.200 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.168.200 的回复: 字节=32 时间<1ms TTL=64

192.168.168.200 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms
C:\Windows\system32>arp -a 192.168.168.200 #查看arp信息,这里可以看到,每次的结果都是lvs的mac地址是一致的。
接口: 192.168.168.10 --- 0x18
  Internet 地址         物理地址              类型
  192.168.168.200       00-0c-29-d7-4a-43     动态

 7.添加路由信息

#三个rs服务器都需要添加如下的路由信息
[root@localhost ~]# route add -host 192.168.168.200 dev lo:0
#lvs服务器上添加
[root@localhost ~]# route add -host 192.168.168.200 dev eth0:0

 

8.给那个RS服务器安装http服务并测试

 

复制代码
[root@localhost ntpstats]# yum install httpd              #每个rs服务器都安装httpd服务
[root@localhost ntpstats]# service httpd restart          #每个rs服务器都重新启动
[root@localhost ntpstats]# echo rs1> /var/www/html/index.html  #给rs1服务器创建一个主页,只在rs1上执行
[root@localhost ntpstats]# echo rs2> /var/www/html/index.html  #给rs2服务器创建一个主页,只在rs2上执行
[root@localhost ntpstats]# echo rs2> /var/www/html/index.html  #给rs3服务器创建一个主页,只在rs3上执行
#接下来使用在调度器lvs服务器先测试下各个页面是否可以正常访问
[root@localhost ~]# elinks -source 192.168.40.201
rs1
[root@localhost ~]# elinks -source 192.168.40.202
rs2
[root@localhost ~]# elinks -source 192.168.40.203
rs3
复制代码

 

9.创建LVS

 

[root@localhost ~]# ipvsadm -A -t 192.168.168.200:80 -s rr              #创建一个集群服务,调度算法rr,
[root@localhost ~]# ipvsadm -a -t 192.168.168.200:80 -r 192.168.40.201 -g    #添加rs1 dr方式
[root@localhost ~]# ipvsadm -a -t 192.168.168.200:80 -r 192.168.40.202 -g    #添加rs2 dr方式
[root@localhost ~]# ipvsadm -a -t 192.168.168.200:80 -r 192.168.40.203 -g    #添加rs3 dr方式

 

10.我们使用宿主机进行测试

浏览器输入http://192.168.168.200,不断刷新,就可以看到如下的三个图片信息。测试成功后,就可以把三个RS服务器页面做成一样的啦。

11.在最后,给出一个脚本吧。 是马永亮老师讲课整理的脚本

Director脚本:
#!/bin/bash
#
# LVS script for VS/DR
#
. /etc/rc.d/init.d/functions
#
VIP=192.168.0.210
RIP1=192.168.0.221
RIP2=192.168.0.222
PORT=80

#
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 1
  /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 2

  /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:1 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


RealServer脚本:

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

VIP=192.168.0.219
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

 

posted on 2017-04-30 12:54  LinuxPanda  阅读(1197)  评论(0编辑  收藏  举报

导航