小Q: 一直努力着,努力着,偶尔停下来歇歇,又要振作精神,继续努力着,

           努力着,实现我的愿望;不敢奢望。

前面我们用heartbeat配置了高可用集群,用Lvs配置了负载均衡集群;而现在我们可以将两者的功能合二为一,用前面介绍高可用的时候讲到了另一个开源软件keepalived和LVS的ipvsadm合作完成;


-------------------------简介---------------------------

keepalived是一个类似于layer3, 4 & 7交换机制的软件,也就是我们平时说的第3层、第4层和第7层交换。作用是检测web服务器的状态,如果有一台web服务器工作出现故障,Keepalived会将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,全自动;

ipvs称为IP虚拟服务器(IP Virtual Server,简写为IPVS)。是运行在LVS下的提供负载平衡功能的一种技术,而且LVS核心软件就是ipvsadm。

因为我么搭建了负载均衡集群后,不能保证没一台都那么高效的工作,如果其中一台两台多台real server故障后,客户端请求的时候就会一直显示连接错误,那怎么办?

如果我们负载均衡机出故障,客户将一直连接不到服务,那怎么办?

可能你会想到前面的heartbeat高可用不就是解决这种问题的嘛,但是他无法实现负载集群功能,我们可不能为每一台机子都配置heartbeat主机热备;于是keepalived应运而生,他同时拥有高可用的主机热备和负载均衡的调解功能;而且它可以无缝扩展realserver,只需更改keepalived配置和增加机子的启动脚本。


-------------------------前期准备-----------------------

我们至少需要四台机子才可搭建这种高可用+负载均衡服务;但鉴于我们是做实验,三台就可以了,rs2与备机共用一台机子;实际上备机要是单独的机子。

director+主机  :192.168.11.190        
real server 1  :192.168.11.20         
real server+备 :192.168.11.30
虚拟主机VIP    :192.168.11.100               因为用的DR模式,所以要配置vip

更改主机名为dir  rs1  rs2:  hostname  dir    >>>   bash            rs1与rs2同理更改

清空以前的规则:ipvsadm  -c             iptables  -t  net  -F

                            $ipv -C              ifconfig eth0:0  down

dir主机和rs2备机:

yum   install  -y  keepalived

所有机子(三台):

yum   install  -y  ipvsadm

yum   install  -y  nginx                         也可以是别的服务,也可以源码包安装,端口打开就好


-------------------------文件配置-----------------------

dir主机:

vim   /etc/keepalived/keepalived.conf      //加入如下:

vrrp_instance VI_1  {
    state   MASTER                      #备用服务器上为 BACKUP,状态
    interface   eth0                    #  监听VIP的网卡
    virtual_router_id   51           
    priority 100                         #   备用服务器上为90    启动优先级,越大越高
    advert_int 1                                   
    authentication {                       #  集群通信的认证机制
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {                          #   VIP
        192.168.11.110
    }
}
virtual_server 192.168.11.100 80  {                                   
    delay_loop 6                              # (每隔10秒查询realserver状态)
    lb_algo wlc                              #    (lvs 算法)
    lb_kind DR                              #    (Direct Route)
    persistence_timeout 60                 #(同一IP的连接60秒内被分配到同一台realserver)
    protocol TCP                              #  (用TCP协议检查realserver状态)
    real_server 192.168.11.20 80 {                                   real  server1                
        weight 100                             #    (权重)
        TCP_CHECK {
        connect_timeout 10                     # (10秒无响应超时,超时断开连接)
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
real_server   192.168.11.30 80 {
        weight   100
        TCP_CHECK {
        connect_timeout   10
        nb_get_retry  3
        delay_before_retry  3
        connect_port   80
        }
     }
}

主从双机热备在系统配置上几乎是一样的,只是几个选项配置不一样,只不过这次的备机是建立在了real server上,所以还要加点real server应该有的内容;

从机上的配置通上,需要更改的两处,文件中已经标出,主机超级复制过去即好;

scp   文件路径      主机名@从机IP:存放的路径


配置完keepalived后,需要开启端口转发(主从都要做):

echo 1  >  /proc/sys/net/ipv4/ip_forward

我们配置负载均衡的时候把端口转发等配置规则写到了lvs_dr.sh脚本中,而这次规则由keepalived制定了,另外的只需要执行端口转发就好;其实说白了这种高可用的负载集群就是让keepalived帮LVS配置了应该ipvsadm配置的规则。


rs1与rs2:都是作为real server ,配置都一样

vim /usr/local/sbin/lvs_dr.sh

#! /bin/bash
vip=192.168.11.100
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up 
route add -host $vip 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

启动:bash(/bin/bash)   /usr/local/sbin/lvs_dr.sh   其实不用

启动主从双机keepalived:(先主后从)

/etc/init.d/keepalived     start

另外,需要注意的是,启动keepalived服务会自动生成vip和ipvsadm规则,不需要再去执行上面提到的/usr/local/sbin/lvs_dr.sh 脚本。

查看方式:可在任意时段查询明确过程

查看 IP :   ip     addr                           ifconfig查不到虚拟IP,因为虚拟IP配置到了eth0上

查看集群     ipvsadm   -ln            


----------------------测试---------------------

为了易于观察,还是去更改一下nginx的默认页面显示,方法前面提到过两次了;

rs1上: echo "rs1rs1" >/usr/share/nginx/html/index.html

rs2上: echo "rs2rs2" >/usr/share/nginx/html/index.html  

可以到浏览器看,但是总出问题,不推荐;去windows上的命令行或者另找一台服务器 ping  192.168.11.100


宕掉 rs1 :ifdown   eth0           或     /etc/init.d/nginx     stop      

查看dir  : ipvsadm   -ln           或    ip  addr                 会发现192.168.11.20 不见了  

                   而且ping的时候,会一直链接rs2,并不显示rs1连接不上;

                   当把 rs1恢复后,一切又恢复正常了;

宕掉dir : ifdown   eth0           或     /etc/init.d/nginx     stop    

查看rs2:  我们在dir主机上查看不到什么了,但是在rs2上(代用备机)可以查到原本在dir上显示的内容; 此时我们在其他机子ping的时候,正常显示;


扩展:haproxy+keepalived实现高可用负载均衡

                     http://www.cnblogs.com/dkblog/archive/2011/07/06/2098949.html 

比较清晰      http://s2t148.blog.51cto.com/3858027/888263 

wKioL1Ybpw_C8MXLAAJli6-NZgA887.jpg