(一) 网络架构
    

    D1: (LVS_MASTER)
    eth1:192.168.1.111
    D2:(LVS_BACKUP)
    eth2: 192.168.1.113
    R1: (web_server1)
    eth1:192.168.1.214 
    R2: (web_server2)
    eth1:192.168.1.215 
    VIP:192.168.1.200 (网站对外提供的虚拟ip地址,域名是解析到这个ip地址)

(二) 安装keepalived (D1,D2服务器都要安装keepalived)

[root@D1 kernels]# ls /usr/src/kernels/ (如果发现没有2.6.32-504.3.3.el6.x86_64这种文件是因为系统缺少包文件 [root@D1 kernels]#  yum -y install kernel-devel 即可解决 )
[root@D1 ~]# mkdir -p /data/software
[root@D1 ~]# mkdir -p /data/apps
[root@D1 ~]# mkdir -p /data/apps/keepalived  # 创建安装目录
[root@D1 software]# cd /data/software/
[root@D1 software]# tar -zxvf keepalived-1.2.13.tar.gz 
[root@D1 software]# cd keepalived-1.2.13
[root@D1 keepalived-1.2.13]#  ./configure --sysconf=/data/conf/ --prefix=/data/apps/keepalived/ --with-kernel-dir=/usr/src/kernels/2.6.18-194.el5PAE-i686  # 如果出现!!! OpenSSL is not properly installed on your system. !!! 则执行yum -y install openssl-devel
[root@D1 keepalived-1.2.13]# make 
[root@D1 keepalived-1.2.13]# make install
[root@D1 sbin]# /data/apps/keepalived/sbin/keepalived --help  (说明安装完成)
Usage: /data/apps/keepalived/sbin/keepalived [OPTION...]
  -f, --use-file=FILE          Use the specified configuration file
  -P, --vrrp                   Only run with VRRP subsystem
  -C, --check                  Only run with Health-checker subsystem
  -l, --log-console            Log messages to local console
  -D, --log-detail             Detailed log messages
  -S, --log-facility=[0-7]     Set syslog facility to LOG_LOCAL[0-7]
  -V, --dont-release-vrrp      Don't remove VRRP VIPs and VROUTEs on daemon stop
  -I, --dont-release-ipvs      Don't remove IPVS topology on daemon stop
  -R, --dont-respawn           Don't respawn child processes
  -n, --dont-fork              Don't fork the daemon process
  -d, --dump-conf              Dump the configuration data
  -p, --pid=FILE               Use specified pidfile for parent process
  -r, --vrrp_pid=FILE          Use specified pidfile for VRRP child process
  -c, --checkers_pid=FILE      Use specified pidfile for checkers child process
  -v, --version                Display the version number
  -h, --help                   Display this help message
[root@D1 ~]# ln -s /data/apps/keepalived/sbin/keepalived /sbin/keepalived
[root@D1 ~]# cp /home/data/conf/rc.d/init.d/keepalived  /etc/rc.d/init.d/
[root@D1 ~]# cp /home/data/conf/sysconfig/keepalived /etc/sysconfig/
[root@D1 ~]# mkdir /etc/keepalived
[root@D1 ~]# cp /home/data/conf/keepalived/keepalived.conf /etc/keepalived/
# 开启路由功能
[root@D1 ~]# echo "1" >/proc/sys/net/ipv4/ip_forward

(三) 安装ipvs管理软件(D1,D2服务器都要安装)
1: 检查kernel是否已经支持LVS的IPVS模块

[root@D1 keepalived]# modprobe -l | grep ipvs
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
kernel/net/netfilter/ipvs/ip_vs_sh.ko
kernel/net/netfilter/ipvs/ip_vs_sed.ko
kernel/net/netfilter/ipvs/ip_vs_nq.ko
kernel/net/netfilter/ipvs/ip_vs_ftp.ko
kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko
如果有类似上面的输出则说明内核已经支持

2: 安装ipvs
可以从http://www.linuxvirtualserver.org/software/ipvs.html 下载源码安装
这里我使用yum安装

[root@D1 software]# yum -y install ipvsadm
[root@D1 software]# ipvsadm --help  (看到参数信息则说明安装成功)

(四) web服务器搭建
1 环境安装与搭建(略)
2 建立虚拟主机用于测试
R1,R2 上配置相同

server {
        listen       80;
        server_name  img.fangwentest.com;
        root /data/wwwroot/web/fangwentest.com/;
        access_log /data/wwwroot/log/img.fangwentest.com-access.log main_zdy;
        error_log /data/wwwroot/log/img.quwenjiemi.com-error.log;
        location / {
                index  index.html index.htm index.php;
        }
}
[root@R1 fangwentest.com]# service nginx restart
R1上
[root@R1 sites-available]# cd /data/wwwroot/web/fangwentest.com/
[root@R1 fangwentest.com]# echo "

R1_Server

" > index.html R2上 [root@R2 sites-available]# cd /data/wwwroot/web/fangwentest.com/ [root@R2 fangwentest.com]# echo "

R2_Server

" > index.html

(五) 配置keepalived
D1 上配置

[root@D1 software]# vi /etc/keepalived/keepalived.conf 
# 这里我只列出改动了的部分
vrrp_instance VI_1 {
    state MASTER # 指定角色MASTER表示此主机是主服务器
    interface eth1 # 表示网络监听的接口
    virtual_router_id 51 # 标识数字,主从必须一样
    priority 100 # 优先级,数字越大,优先级越高。主优先级必须大于从
    advert_int 1 # 设置主从负载均衡器之间同步检查的时间间隔,单位为秒
    authentication {  # 设定验证类型和密码
        auth_type PASS # 设置验证类型 主从必须设置相同才能通信
        auth_pass 123456 # 设置验证密码 主从必须设置相同才能通信
    }
    virtual_ipaddress {
        192.168.1.200  # 对外的虚拟ip地址
    }
}
virtual_server 192.168.1.200 80 {  # 设置虚拟服务器,需要指定虚拟ip地址和服务器端口,ip与端口之间用空格隔开
    delay_loop 6    # 设置运行情况检查时间,单位是秒
    lb_algo rr        # 设置负载均衡算法,这里设置为rr,即轮询算法
    lb_kind DR        # 设置LVS实现负载均衡的机制,有NAT,TUN,DR 三种模式,这里选用DR
    persistence_timeout 50 # 会话保持时间,50秒,这个选项对动态网页是非常有用,为集群系统中session共享提供了一个很好的解决方案,有了这个会话保持功能,用户的请求会被一直分发到某个服务器节点,知道超过这个会话的保持时间
    protocol TCP # 指定特定的协议类型,有TCP和UDP
    real_server 192.168.1.214 80 {  # 配置服务器节点1,需要指定real server 的真实IP地址和端口。ip和端口之间用空格隔开
        weight 1    # 配置权值,权值大小用数字表示,数字越大,权值越高,设置权值的大小可以为不同性能的服务器分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能低的服务器设置相对较低的权值,这样才能合理的利用和分配系统资源。0
        TCP_CHECK {        # real_server的状态检测设置部分,单位为秒
            connect_timeout 3 # 表示3秒无响应则超时
            nb_get_retry 3    # 表示重试次数
            delay_before_retry 3 # 表示重试间隔
        }
    }
    
    real_server 192.168.1.215 80 {    # 配置主节点2
        weight 1
        TCP_CHECK {        # real_server的状态检测设置部分,单位为秒
            connect_timeout 3 # 表示3秒无响应则超时
            nb_get_retry 3    # 表示重试次数
            delay_before_retry 3 # 表示重试间隔
        }
    }
}
D2上配值和D1基本相同只是state MASTER改成state BACKUP,priority 100 改成 priority 80,interface eth1 改成 interface eth2 (主要是我在BACKUP上使用的网卡是eth2)

(六) Real_Server上的配置  (R1,R2上执行相同的操作)
# 在LVS的DR模式下,用户的访问请求到达Real Server 后,是直接返回给用户的,不再经过前端的Director Server,因此,需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户

[root@R1 ~]# chmod 777 /etc/rc.d/init.d/functions 
[root@R1 ~]# vi /etc/init.d/lvsrs
#!/bin/bash
#如果想启动LVS Server执行:/etc/init.d/lvsrs start
#如果想停止LVS Server执行:/etc/init.d/lvsrs stop
VIP=192.168.1.200   #虚拟IP,视具体情况而变
. /etc/rc.d/init.d/functions     # 如果提示权限不够,那么先在命令行执行: chmod 777 /etc/rc.d/init.d/functions
case "$1" in
start)
        /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
        /sbin/route add -host $VIP dev lo:0
        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
        sysctl -p >/dev/null 2>&1
        echo "RealServer Start OK"
        ;;
stop)
        /sbin/ifconfig lo:0 down
        route del $VIP >/dev/null 2>&1
        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 "RealServer Stoped"
        ;;
        *)
        echo "Usage: $0 {start|stop}"
        exit 1
esac
exit 0

[root@R1 ~]# chmod 755 /etc/init.d/lvsrs
[root@R1 ~]# service lvsrs start

(七) 管理lvs (以下D1,D2上都执行)
1)启动lvs调度器
[root@D1 ~]# service keepalived start
# 开启路由功能
[root@D1 ~]# echo "1" >/proc/sys/net/ipv4/ip_forward
2) 关闭lvs调度器
[root@D1 ~]# service keepalived stop
# 开启路由功能
[root@D1 ~]# echo "0" >/proc/sys/net/ipv4/ip_forward

(八) 管理真实服务器 (以下R1,R2都适用)
1) 启用lvs功能
[root@R1 ~]# service lvsrs start
2) 停用lvs功能
[root@R1 ~]# service lvsrs stop

(九) 人为去除一台真实服务器(比如R2)
vi /etc/keepalived/keepalived.conf 找到相应部分把
weight 1 把weight 改为 0