基于keepalive+LVS的高可用集群来实现web服务负载均衡集群的架构

架构环境:

RedHat Linux Enterprise 5.8           keepalive                        LVS-DR

注意:1、事先配置好yum源,利用yum进行相关的软件安装,其可以很好的解决依赖关系

            yum利用DVD光盘配置即可!其详细配置可以参考我的博文“Linux系统常用的软件管理工具rpm、yum及软件源码编译安装”

    2、事先关闭掉相关的iptables规则和selinux


1
2
3
4
[root@node1 ~]# getenforce  #查看selinux的设置permissive|
[root@node1 ~]# setenforce  0 | 1   #关闭或开启selinux功能
[root@node1 ~]# vim /etc/selinux/config  #selinux的配置文件
SELINUX=disabled|permissive|enforcing #禁止|禁用|启用selinux

相关服务和名字的定义:

1
2
3
4
5
Director:负载调度集群的主机,也简称DR
VIP:Virtual IP,向外提供服务的IP
RIP:Real Server IP,内部真正提供服务的
DIP:与内部主机通信的IP,在DR主机上
CIP:客户端IP


一、架构设计

     利用keepalive来实现lvs的Directory Server的高可用集群,然后在利用keepalive和lvs的高可用来实现web服务的负载均衡!其架构图如下:

图像 304

二、keepalive的介绍

⑴、keepalive的基本工作机制和应用场景

     keepalive是一个可以提供vrrp已经health-check功能的服务软件,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。同时我们还可以利用LVS+Keepalived基于完整开源软件的架构可以为你提供一个负载均衡及高可用的服务器。

    在本博文中Keepalived的主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

   Keepalived是一个基于VRRP协议来实现的WEB 服务高可用方案,可以利用其来避免单点故障。一个WEB服务至少会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

⑵、VRRP协议

    上面我们提到keepalive利用vrrp来进行health-check功能的,那么VRRP到底是什么那?我们下面来说说VRRP协议吧!

    VRRP:Virtual Router Redundancy Protocol,是虚拟路由冗余协议,通过此协议我们可以把多个路由器做成一个虚拟路由器,从而来保证其中某个路由宕掉的时候不会造成我们内部外出网络的全部中断。

    VRRP中的各个路由器都有一个唯一的标识VRID,其范围为0-255,路由器对外表现为唯一的虚拟MAC地址,地址的格式为00-00-5E-00-01-[VRID]。主控路由器负责对ARP请求用该MAC地址做应答。这样,无论如何切换,保证给终端设备的是唯一一致的IP和MAC地址,减少了切换对终端设备的影响。其中的VRID中的0和255是保留的,0用于IP地址所有者主动放弃主控者角色时使用,255用于VRRP路由器的IP地址和虚拟路由器的接口IP地址相同时所拥有!

    由于VRRP协议比较复杂,这里一两句也介绍不清楚,而我理解的也不深,只是一点点而已,但是这并不影响我们下面的使用,所有还望各位谅解不能在此详细介绍,如果有意深入了解可以下载附件内的“h3c_vrrp介绍.pdf”。

三、RS上相关软件的安装和配置

⑴、web服务的安装和配置

1
2
3
web1和web2上分别配置相应的ip地址
RIP1: 172.16 . 7.3 / 16
RIP2: 172.16 . 7.4 / 16

  1、在web1上安装httpd服务并配置RIP和VIP,注意由于是基于LVS的DR模型,我们需要设置本机VIP不能响应外部主机的arp请求。

安装httpd

1
2
yum install httpd –y #安装httpd
echo  "web1.chris.com"  > / var /www/html/index.html  #添加主页内容

配置RIP和设置arp不能被外部主机解析此处使用脚本vipset.sh进行设置,脚本如下:

###########################################################

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/bin/bash  
#   
# Script to start LVS DR real server.   
# description: LVS DR real server   
#   
.  /etc/rc.d/init.d/functions
VIP= 172.16 . 7.5                 #VIP地址  
host=`/bin/hostname`          #定义host变量
case  "$1"  in  
start)                        #start的时候设置本机arp不被外部主机解析   
        # 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
               #配置vip在lo: 0 ,并且设置广播地址和子网掩码,此处使用 32 位是保证此vip不能与其他地址通信。  
         /sbin/route add -host $VIP dev lo: 0       #增加路由
;;  
stop)                                                         #stop的时候恢复到系统的初始化arp参数
         # 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

############################################################

在web1上执行此脚本,来完成vip和arp参数的设置

sh vipset.sh

然后查看相关IP参数信息

ifconfig

图像 306

2、在web2上安装httpd服务并配置RIP和VIP,注意由于是基于LVS的DR模型,我们需要设置本机VIP不能响应外部主机的arp请求。

安装httpd

1
2
yum install httpd –y #安装httpd
echo  "web2.chris.com"  > / var /www/html/index.html #添加主页内容

配置RIP和设置arp不能被外部主机解析此处使用脚本vipset.sh进行设置,基本内容与web1上使用的脚本相同!

图像 308

四、DR上相关软件的安装和配置

⑴、ipvsadm软件安装,用于后面的ipvs规则的查看。

1
2
yum –y install ipvsadm  #安装用户空间工具ipvsadm
ipvsadm –L –n            #查看系统ipvs规则

⑵、安装keepalive软件和设置相关配置

1、安装keepalive软件,这里使用的是已经制作好的rpm包进行安装,如需要请在博文附件内下载。

1
2
3
4
5
6
7
8
9
DS1和DS2上都进行keepalive的安装:
两种方法:
         源码编译安装:
         configure [--enable-vrrp] [--disable-snmp|--enable-snmp]
         make
         make install
rpm包安装:
我这里利用以及编译制作好的rpm包进行安装
yum -y --nogpgcheck localinstall keepalived- 1.2 . 7 - 5 .el5.i386.rpm   #不校验并自动安装

图像 309

至此我们的keepalive软件就安装完毕了,简单吧~下面来看看keepalive的配置文件吧

⑵、keepalive配置文件的详解

keepalive的配置文件是/etc/keepalived/keepalived.conf,其文件内分为:全局配置、vrrp配置、lvs配置、服务程序监控检查

------------------------------------------------------------------------------

全局配置:

1
2
3
4
5
6
7
8
9
10
11
12
! Configuration File  for  keepalived              #注释
global_defs {                                          #全局配置,配置参数为{}内的内容  
    notification_email {                               #keepalive服务服务信息通知邮箱,可以为多个   
      acassen@firewall.loc
      failover@firewall.loc
      sysadmin@firewall.loc
    }   
    notification_email_from Alexandre.Cassen@firewall.loc  #发送信息的时候的发送邮箱   
    smtp_server  192.168 . 200.1                    #smtp服务器   
    smtp_connect_timeout  30                       #连接smtp超时时间   
    router_id LVS_DEVEL                            #keepalive服务器的ID标识,注意每个服务                                                                 要有一个独立的标识   
}

-----------------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vrrp的配置:
vrrp_instance VI_1 {                           # 定义vrrp组,VI_1代表第一个组  
     state MASTER                                 #角色,master|backup,当state指定的instance的初始化状态,在两台DS都启动以后,马上发生竞选,优先级高的成为MASTER,所以这里的MASTER并不是表示此台服务器一直是MASTER   
     interface  eth0                                  #绑定网卡   
     virtual_router_id  51                           #VRID标记( 1 - 244 )   
     priority  100                                       #优先级   
     advert_int  1                                      #检查时间间隔,默认为1s   
     authentication {                                # 认证   
         auth_type PASS                            #认证机制,PASS代表字符串   
auth_pass  1111                             #字符串
     }  
     virtual_ipaddress {                             #指定漂移地址,此处既VIP,可以指定多个。   
         192.168 . 200.16   
         192.168 . 200.17   
         192.168 . 200.18   
     }   
}

-------------------------------------------------------------------------------------

LVS的配置:lvs的配置包括两部分,虚拟主机组和虚拟主机,这些配置都会在传递给ipvsadm作为参数的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
virtual_server  192.168 . 200.100  443  {       #设置VIP port   
     delay_loop  6                                         #多少秒检查一次real server的健康状态    
     lb_algo rr                                             #调度算法    
     lb_kind NAT                                          #lvs模型    
     nat_mask  255.255 . 255.0                        #虚拟VIP的掩码    
     persistence_timeout  50                           #长连接时间    
     protocol TCP                                          #协议类型
     real_server  192.168 . 201.100  443  {          #定义real server   
         weight  1                                             #定义权重    
         SSL_GET {                                        #检查web服务的SSL状况    
             url {    
               path /    
               digest ff20ad2481f97b1754ef3e12ecd3a9cc    
             }    
             url {                                               #检查服务器的web服务状况    
               path /mrtg/    
               digest 9b3a0c85a887a256d6939da88aabd8cd    
             }    
             connect_timeout  3                             #连接超时时间    
             nb_get_retry  3                                  #重试次数    
             delay_before_retry  3                          #重试连接时间间隔    
         }    
     }    
}
⑶、keepalive在DS1和DS2上进行相关配置,并实现VIP的高可用和web集群的负载均衡:
! Configuration File  for  keepalived
global_defs {  
    notification_email {   
      chris@localhost   
    }   
    notification_email_from root@localhsot   
    smtp_server  127.0 . 0.1   
    smtp_connect_timeout  30   
    router_id LVS_DEVEL   
}
vrrp_instance VI_1 {  
     state MASTER   
     interface  eth0   
     virtual_router_id  51   
     priority  101   
     advert_int  1   
     authentication {   
         auth_type PASS   
         auth_pass chris   
     }   
     virtual_ipaddress {   
         172.16 . 7.5   
     }   
}
virtual_server  172.16 . 7.5  80  {  
     delay_loop  6   
     lb_algo rr   
     lb_kind DR   
     protocol TCP
     real_server  172.16 . 7.3  80  {  
         weight  2   
         TCP_CHECK {   
             connect_timeout  3   
             nb_get_retry  3   
             delay_before_retry  1   
             connect_port  80   
             }   
         }   
     real_server  172.16 . 7.4  80  {   
         weight  2   
           TCP_CHECK {   
             connect_timeout  3   
             nb_get_retry  3   
             delay_before_retry  1   
             connect_port  80   
             }   
         }   
}

图像 311

图像 313

然后把DS1上的keepalive.conf复制到DS2上,并把其中的stata改成BACKUP,priority修改为100,其他的保存不变

图像 312

至此我们的DS高可用已经设置完了,启动keepalive测试下效果吧

DS1和DS2上分别开启keepalive服务

service keepalived start

图像 315

此时利用vip访问一下我们的web服务,看看能否正常不吧

图像 318

下面模拟一下DS1宕掉吧~看看其vip能否否自动漂移

在DS1上停止keepalive服务

service keepalived stop

图像 316

DS2上查看下地址是否漂移过来了吧!

图像 317

此时的vip进行web访问

图像 319

五、web服务的高可用集群

    通过上面的相关配置,我们利用keepalive实现了DS的高可用,然后利用LVS的DR模型实现了web服务的负载均衡,那下面我们就通过keepalive的相关功能来实现web服务的高可用!这里keepalive通过调用相关的脚本进行对服务器的相关操作!其架构图如下

图像 320

⑴在DS1和DS2上分别安装httpd服务,并设设置主页内容

yum –y install httpd

echo "DS1.chris.com" > /var/www/html/index.html

启动服务进行测试

service httpd start

图像 321

⑵、配置keepalive服务

1、利用上面实验已经安装好的keepalive进行设置,这里不再重新安装,所以配置之前先把keepalive服务关掉:service keepalived stop

相关配置如下:(配置脚本在附件内-keepalive.conf-webha)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
! Configuration File  for  keepalived
global_defs {  
    notification_email {   
          chrisli129@gmail.com   
          chrinux@ 126 .com   
    }   
    notification_email_from root@chris.com   
    smtp_connect_timeout  3   
    smtp_server  127.0 . 0.1   
    router_id LVS_DEVEL   
}
vrrp_script chk_httpd {  
     script  "killall -0 httpd"     #kill - 0 是模拟kill httpd服务,并不是真的kill,只是检查其服务是否存在   
     interval  2   
         # check every  2  seconds   
     weight - 2   
         if  failed, decrease  2  of the priority   
     fall  2   
         # require  2  failures  for  failures   
     rise  1   
         # require  1  sucesses  for  ok   
}
vrrp_script chk_schedown {  
    script  "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"         #利用/etc/keepalive/下的down文件是否存在来进行服务的关闭   
    interval  2                                                                          #每 2 秒检查一次   
    weight – 2                                                                          #如果存在,权重- 2   
}
vrrp_instance VI_1 {  
     interface  eth0
     state MASTER
     priority  101
     virtual_router_id  51
garp_master_delay  1
     authentication {  
         auth_type PASS   
         auth_pass password   
     }
     track_interface {  
        eth0   
     }   
         # optional, monitor these  as  well.   
         # go to FAULT state  if  any of these go down.
     virtual_ipaddress {  
         172.16 . 7.5 / 16  dev eth0  label  eth0: 0            #配置虚拟VIP,并指定端口和别名   
     }   
         #addresses add|del on change to MASTER, to BACKUP.   
         #With the same entries on other machines,   
         #the opposite transition will be occuring.   
         #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>  label  <LABEL>
     track_script {  
         chk_httpd   
         chk_schedown   
     }
     notify_master  "/etc/keepalived/httpd.sh master"  
     notify_backup  "/etc/keepalived/httpd.sh backup"   
     notify_fault  "/etc/keepalived/httpd.sh fault"   
}

然后把此配置文件复制到DS2 上,并修改其中的

state BACKUP              #修改其为从服务器

priority 100                  #修改优先权低于主服务器的

图像 322

2、增加服务控制脚本—httpd.sh,把其到到配置文件内定义的目录/etc/keepalived/内,其脚本内容如下:(脚本在附件内-httpd.sh)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash  
# Author: MageEdu <linuxedu@foxmail.com>   
# description: An example of notify script   
#
ifalias=${ 2 :-eth0: 0 }  
interface =$(echo $ifalias | awk -F:  '{print $1}' )   
vip=$(ip addr show $ interface  | grep $ifalias | awk  '{print $2}' )   
#contact= 'linuxedu@foxmail.com'   
contact= 'root@localhost'
workspace=$(dirname $ 0 )
notify() {  
     subject= "$ip change to $1"   
     body= "$ip change to $1 $(date '+%F %H:%M:%S')"   
     echo $body | mail -s  "$1 transition"  $contact   
}
case  "$1"  in  
     master)   
         notify master   
         exit  0   
     ;;   
     backup)   
         notify backup   
         /etc/rc.d/init.d/httpd restart   
         exit  0   
     ;;   
     fault)   
         notify fault   
         exit  0   
     ;;   
     *)   
         echo  'Usage: $(basename $0) {master|backup|fault}'   
         exit  1   
     ;;   
esac

⑶、在DS1和DS2上开启keepalive服务,并进行查看相关信息

图像 324

下面我们访问一下web服务吧~使用vip地址!

图像 325

下面假设DS1服务器宕掉了,看看vip是否能自动漂移并启动DS2上的web服务,我们在脚本内定义了利用在/etc/keepalived/目录下down文件是否存在来实现测试吧


图像 326

看下DS2上和web服务

图像 328

此此,我们的web服务的高可用集群已经建立完成,当然这只是比较简单的实验测试,在实际的工作需要中我们可以把web服务的主页放到一个共享存储上,来保证web内容的一致性!

六、双主模型

我们通过定义不同的vrrp_instance来实现两个DS互为双主的架构:

vrrp_instance 1内:

        DS1为主

        DS2为从

vrrp_instance 2内:

         DS1为从

         DS2为主

其设置只需要在前面配置文件下增加如下内容即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
vrrp_instance VI_2 {  
     interface  eth0   
     state BACKUP  # BACKUP  for  slave routers   
     priority  100   100  for  BACKUP   
     virtual_router_id  52   
     garp_master_delay  1
     authentication {  
         auth_type PASS   
         auth_pass password   
     }   
     track_interface {   
        eth0   
     }   
     virtual_ipaddress {   
         172.16 . 7.6 / 16  dev eth0  label  eth0: 1   
     }   
     track_script {   
         chk_httpd   
         chk_mantaince_down   
     }
     notify_master  "/etc/keepalived/httpd.sh master eth0:1"  
     notify_backup  "/etc/keepalived/httpd.sh backup eth0:1"   
     notify_fault  "/etc/keepalived/httpd.sh fault eth0:1"   
}

图像 331

然后配置DS2上的配置文件内增加如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
vrrp_instance VI_2 {  
     interface  eth0   
     state MASTER  # BACKUP  for  slave routers   
     priority  101   100  for  BACKUP   
     virtual_router_id  52   
     garp_master_delay  1
     authentication {  
         auth_type PASS   
         auth_pass password   
     }   
     track_interface {   
        eth0   
     }   
     virtual_ipaddress {   
         172.16 . 7.6 / 16  dev eth0  label  eth0: 1   
     }   
     track_script {   
         chk_httpd   
         chk_mantaince_down   
     }
     notify_master  "/etc/keepalived/httpd.sh master eth0:1"  
     notify_backup  "/etc/keepalived/httpd.sh backup eth0:1"   
     notify_fault  "/etc/keepalived/httpd.sh fault eth0:1"   
}
图像 333

然后重启keepalive服务,查看DS1和DS2

图像 336

测试web

图像 337

此时可以把DS1宕掉,测试

图像 339

图像 340

此时测试web服务,其都是DS2上的了

图像 341

至此我们实现了基于keepalive的web双主高可用集群!

       总结:通过以上实验我们了解了keepalive实现高可用,并利用lVS实现web负载均衡的架构全部过程,最后利用keepalive的双主模型实现了web服务的高可用架构!

      内容比较多,写的比较乱,还望各位见谅,其中错误望各位指正~~谢谢

                                                                   chrinux—chris linux


本文出自 “Chris On the way” 博客,请务必保留此出处http://chrinux.blog.51cto.com/6466723/1201652

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值