架构环境:
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 图像 304](https://i-blog.csdnimg.cn/blog_migrate/037a2cbbc5b286095c360dddb2ff8031.png)
二、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 图像 306](https://i-blog.csdnimg.cn/blog_migrate/fc0438b0c601a6c936d7eb810efb5ffe.png)
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 图像 308](https://i-blog.csdnimg.cn/blog_migrate/ad04fa26c0fe64c37e19c7174abfc68c.png)
四、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 图像 309](https://i-blog.csdnimg.cn/blog_migrate/a40842fa3bdb93d7ea3744536301583b.png)
至此我们的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 图像 311](https://i-blog.csdnimg.cn/blog_migrate/0f5aa8ba271dfbdb1cf5f959ee686439.png)
![图像 313 图像 313](https://i-blog.csdnimg.cn/blog_migrate/24c602fd410834a132d9de72e4ca5adc.png)
然后把DS1上的keepalive.conf复制到DS2上,并把其中的stata改成BACKUP,priority修改为100,其他的保存不变
![图像 312 图像 312](https://i-blog.csdnimg.cn/blog_migrate/d11d752ce24492f2527583f0fc6f8c15.png)
至此我们的DS高可用已经设置完了,启动keepalive测试下效果吧
DS1和DS2上分别开启keepalive服务
service keepalived start
![图像 315 图像 315](https://i-blog.csdnimg.cn/blog_migrate/b2bfb6a596a6c1b9ebf1157e96b15734.png)
此时利用vip访问一下我们的web服务,看看能否正常不吧
![图像 318 图像 318](https://i-blog.csdnimg.cn/blog_migrate/48a6ea74319c57b75a05723d7fd29db2.png)
下面模拟一下DS1宕掉吧~看看其vip能否否自动漂移
在DS1上停止keepalive服务
service keepalived stop
![图像 316 图像 316](https://i-blog.csdnimg.cn/blog_migrate/d3a8cef274494f7b54ea74d205fecee9.png)
DS2上查看下地址是否漂移过来了吧!
![图像 317 图像 317](https://i-blog.csdnimg.cn/blog_migrate/cbc02d6cc39659893eca3565928f3591.png)
此时的vip进行web访问
![图像 319 图像 319](https://i-blog.csdnimg.cn/blog_migrate/9e9e9225beed89f9b1d510ff96e46021.png)
五、web服务的高可用集群
通过上面的相关配置,我们利用keepalive实现了DS的高可用,然后利用LVS的DR模型实现了web服务的负载均衡,那下面我们就通过keepalive的相关功能来实现web服务的高可用!这里keepalive通过调用相关的脚本进行对服务器的相关操作!其架构图如下
![图像 320 图像 320](https://i-blog.csdnimg.cn/blog_migrate/4c3ce2508e3aac149e65e39dadac326c.png)
⑴在DS1和DS2上分别安装httpd服务,并设设置主页内容
yum –y install httpd
echo "DS1.chris.com" > /var/www/html/index.html
启动服务进行测试
service httpd start
![图像 321 图像 321](https://i-blog.csdnimg.cn/blog_migrate/39edea89a6a27f65f1a69a728fbee409.png)
⑵、配置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 图像 322](https://i-blog.csdnimg.cn/blog_migrate/9fc5f6fa5be269375ad036cd9ca860a2.png)
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服务,并进行查看相关信息
![图像 323.png](https://i-blog.csdnimg.cn/blog_migrate/2a3ec96bbe7341e2f118c2103798056e.png)
![图像 324 图像 324](https://i-blog.csdnimg.cn/blog_migrate/4600598be88f1c7ca992293fcaf81854.png)
下面我们访问一下web服务吧~使用vip地址!
![图像 325 图像 325](https://i-blog.csdnimg.cn/blog_migrate/319924cfb930cf56448efc57acdc8464.png)
下面假设DS1服务器宕掉了,看看vip是否能自动漂移并启动DS2上的web服务,我们在脚本内定义了利用在/etc/keepalived/目录下down文件是否存在来实现测试吧
![图像 326 图像 326](https://i-blog.csdnimg.cn/blog_migrate/f3fd9379befd8ee12287b955843b9f44.png)
看下DS2上和web服务
![图像 328 图像 328](https://i-blog.csdnimg.cn/blog_migrate/a7578f8f1afde05a6118663f8a98755c.png)
此此,我们的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 图像 331](https://i-blog.csdnimg.cn/blog_migrate/75afb309fe263ce19897a9a7df1eadb7.png)
然后配置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"
}
|
然后重启keepalive服务,查看DS1和DS2
![图像 336 图像 336](https://i-blog.csdnimg.cn/blog_migrate/728fcf2cc13873969c6bb5b4d7698561.png)
![图像 335.png](https://i-blog.csdnimg.cn/blog_migrate/75b4176976074fb7d1ae26c78f0a43ee.png)
测试web
![图像 337 图像 337](https://i-blog.csdnimg.cn/blog_migrate/9e7ee2052829a0c5edd677ba7a3b9cad.png)
此时可以把DS1宕掉,测试
![图像 339 图像 339](https://i-blog.csdnimg.cn/blog_migrate/48815d3271c8f70c60431e194ce2b403.png)
![图像 340 图像 340](https://i-blog.csdnimg.cn/blog_migrate/f39b2766fa568052affa696ae12b623f.png)
此时测试web服务,其都是DS2上的了
![图像 341 图像 341](https://i-blog.csdnimg.cn/blog_migrate/a0167730b09ff38050dfd7e5d373b221.png)
至此我们实现了基于keepalive的web双主高可用集群!
总结:通过以上实验我们了解了keepalive实现高可用,并利用lVS实现web负载均衡的架构全部过程,最后利用keepalive的双主模型实现了web服务的高可用架构!
内容比较多,写的比较乱,还望各位见谅,其中错误望各位指正~~谢谢
chrinux—chris linux
本文出自 “Chris On the way” 博客,请务必保留此出处http://chrinux.blog.51cto.com/6466723/1201652