欢迎访问我的网站http://www.fastweb.cc

实验环境:
负载均衡Master 192.168.10.173
负载均衡Backup 192.168.10.174
Realserver1    192.168.8.175
Realserver2    192.168.8.176
VIP:        192.168.8.177

掩码: 255.255.252.0

Master与Backup上安装 ipvsadm   :
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
发现202.206.0.20 这个DNS不能解析,加上另外一个202.106.46.151
ln -sv /usr/src/kernels/2.6.18-164.el5-i686/  /usr/src/linux/    
(两个文件之间加两个空格)  这里很重要,关系到后面keepalived正常启动时有几个进程
tar -zxf ipvsadm-1.24.tar.gz  
cd ipvsadm-1.24
make &&make install

检查
/sbin/ipvsadm
lsmod |grep ip_vs

[root@Master_174 ipvsadm-1.24]# /sbin/ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@Master_174 ipvsadm-1.24]# lsmod |grep ip_vs
ip_vs                  77441  0

--------------------------
LVS客户端

vi /usr/local/bin/lvs_real

#!/bin/bash
#description : start realserver
VIP=192.168.8.177
source /etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REALServer"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 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
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Directorserver"
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
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac

解释:
 VIP(Virtual IP):直接路由模式的VIP必须跟服务器对外提供服务的IP地址在同一个网段,并且LVS负载均衡器和其他所有提供相同功能的服务器都使用VIP。
 VIP被绑定在环回接口lo:0,其广播地址是其本身,子网掩码是255.255.255.255 。这与标准的网络地址设置有很大的不同。采用这种可变长掩码方式把网段划分成只含一个主机地址的目的是避免IP地址冲突。
Echo "1" ,echo "2" 这段的作用是抑制ARP广播。如果不做ARP的抑制,将会有众多的机器 向其他宣称:“嗨 !我是奥巴马,我在这里呢!”,这样就乱套了。

LVS客户端的验证
chmod u+x /usr/local/bin/lvs_real
启动:/usr/local/bin/lvs_real start
验证:
[root@RS_8_175 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet 192.168.8.177/32 brd 192.168.8.177 scope global lo:0   注意这里
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:88:32:bb brd ff:ff:ff:ff:ff:ff
    inet 192.168.8.175/22 brd 192.168.11.255 scope global eth0
    inet6 fe80::20c:29ff:fe88:32bb/64 scope link
       valid_lft forever preferred_lft forever
3: sit0: <NOARP> mtu 1480 qdisc noop
    link/sit 0.0.0.0 brd 0.0.0.0

===============================
加入keepalived  安装于Master 和Backup

下载:wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz
安装:tar -xzf keepalived-1.1.17.tar.gz  cd keepalived-1.1.17 
 ./configure --prefix=/usr/local/keepalived &&make &&make install

keepalived默认检查/etc/keepalived/keepalived.conf 这个配置文件

mkdir /etc/keepalived  cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

配置文件keepalived.conf解释
(此处为原文,未按实际修改)

分为三部分
1.全局定义块
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

-----
email通知:作用是,有故障,发邮件报警。可选项目,建议不用,用nagios代替。

LVS负载均衡器标识(lvs_id)。在一个网络内,它应该是唯一的。

2.VRRP实例定义块
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

---------
同步VRRP组vrrp_sync_group :作用是确定失败切换(FailOver)包含的路由实例个数。即在有两个负载均衡器的场景,一但某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪些。

实例组group :至少包含一个VRRP实例。

VRRP实例vrrp_instance 实例名出自实例组group所包含的那些名字。
 *实例状态state: 只有MASTER和BACKUP两种状态。当MASTER所在的服务器失效时,BACKUP所在的系统会自动把它的状态由BACKUP变换成MASTER;当失效的MASTER所在的系统恢复时,BACKUP从MASTER恢复到BACKUP状态。
 *通信接口interface :对外提供服务的网络接口,如eth0 ,eth1。
 *lvs_sync_daemon_interafce 负载均衡器之间的监控接口中,类似于HA HeartBeat的心跳线。但它的机制优于HeartBeat,因为它没有“裂脑”这个问题,它是以优先级机制来规避这个麻烦的。在DR模式中,lvs_sync_daemon_interface与服务接口interface使用同一个网络接口。
 *虚拟路由标识virtual_router_id :这个标识是一个数字,并且同一个VRRP实例使用唯一的标识。即同一个vrrp_stance、MASTER和BACKUP的virtual_router_id 是一致的,同时在整个VRRP内是唯一的。
 *优先级priority :这是一个数字,数值愈大,优先级越高。在同一个vrrp_instance里,MASTER的优先级高于BACKUP。
 *同步通知间隔advert_int 。MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位为秒。
 *验证authentication :包含验证类型和验证密码。类型主要有PASS、AH两种,通常使用的类型为PASS,所说AH使用时有问题。验证密码为明文,同一VRRP实例MASTER与BACKUP使用相同的密码才能正常通信。

虚拟IP地址vritual_ipaddress 可以有多个地址,每个地址占一行,不需要指定子网掩码。

3.虚拟服务器定义块
virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

-----------
虚拟服务器virtual_server :这个IP来自于VRRP定义块的第“4”步,后面一个空格,然后加上端口号。定义一个VIP,可以实现多个TCP端口的负载均衡功能。
 *delay_loop 健康检查时间间隔,单位为秒
 *lb_algo 负载均衡调度算法,互联网应用常使用wlc或rr 。
 *lb_kind :负载均衡转发的规则,一般包括DR NAT TUN 3种
 *persistence_timeout :会话保持时间,单位为秒。这个选项对动态网站很有用处:当用户从远程用账号登录网站时,有了这个会话保持功能,就能把用户的请求转发给同一个应用服务器。

转发协议 protocol :一般有TCP和UDP两种。

真实服务器real_server :也即服务器池。real_server的值包括IP和端口号。
 *权重 weight 权重值是一个数字,数值越大,权重越高。使用不同的权重值的目的在于为不同性能的机器分配不同的负载。
 *TCP检查tcp_check


================
本实验中的配置:
MASTER 的keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id LVS_CNC_1
}

vrrp_sync_group VGM {
    group {
        VI_CACHE
    }
}


vrrp_instance VI_CACHE {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.8.177
    }
}

virtual_server 192.168.8.177 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.252.0
    persistence_timeout 20
    protocol TCP

    real_server 192.168.8.175 80 {
        weight 100
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
        }
}

    real_server 192.168.8.176 80 {
        weight 100
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
        }
}

BACKUP 的keepalived.conf 配置

! Configuration File for keepalived

global_defs {
   router_id LVS_CNC_2
}

vrrp_sync_group VGM {
    group {
        VI_CACHE
    }
}


vrrp_instance VI_CACHE {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.8.177
    }
}

virtual_server 192.168.8.177 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.252.0
    persistence_timeout 20
    protocol TCP

    real_server 192.168.8.175 80 {
        weight 100
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
        }
}

    real_server 192.168.8.176 80 {
        weight 100
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
        }
}


###MASTER与BACKUP配置文件的差异一共只有3处:全局定义的router_id vrrp_instance state  vrrp_instance 的优先级###
/usr/local/keepalived/sbin/keepalived -D

启动并写入/etc/rc.local

检查:
[root@Backup_174 keepalived-1.1.17]# /usr/local/keepalived/sbin/keepalived -D
[root@Backup_174 keepalived-1.1.17]# ps aux |grep keepalived
root      4117  0.0  0.2   4920   572 ?        Ss   10:55   0:00 /usr/local/keepalived/sbin/keepalived -D
root      4118  0.1  0.5   4988  1508 ?        S    10:55   0:00 /usr/local/keepalived/sbin/keepalived -D
root      4119  2.5  0.4   4988  1024 ?        S    10:55   0:00 /usr/local/keepalived/sbin/keepalived -D
正常启动应该有三个进程。

检查ipvsadm能否识别机器
[root@Master_173 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.8.177:80 rr persistent 20
  -> 192.168.8.176:80             Route   100    0          0        
  -> 192.168.8.175:80             Route   100    0          0

------------
测试效果:

把persistence_timeout 20 MASTER和BACKUP这行注释掉

在8.175 8.176上安装80服务并设置不同的页面

访问http://192.168.8.177

在MASTER和BACKUP上执行
watch -n 0.1 ipvsadm -ln

挺简单的东西,实践一下也得好久,不要认为“这个小实验我会”。