包括阿里云在内的很多云环境,因为不支持浮动IP广受诟病。目前阿里云在VPC网络下发布了HAVIP,能够实现arp宣告IP。这样也就让自己搭建HA成为了可能,有幸拿到了内测权限体验了一下。(classical网络依然不支持)
测试环境:
1
2
3
4
5
6
|
VPC:
192.168.1.0
/
24
ECS
:
nginx1:
192.168.1.1
nginx2
:
192.168.1.2
HAVIP
:
192.168.1.3
绑定到
havip的公网
EIP:
121.43.187.37
|
配置完毕后的拓扑如下:
环境搭建完毕后,登陆主备ECS服务器,分别配置nginx+keepalived
1
|
[
root
@
Nginx1
~
]
# yum install nginx keepalived -y
|
MASTER服务器(nginx1)配置文件/etc/keepalived/keepalived.conf内容以及解释如下:
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
|
!
Configuration
File
for
keepalived
#配置global_defs,主要用于标示机器,以及故障时通知
global_defs
{
router_id
Nginx1
}
#配置vrrp_script,主要用于健康检查,以及检查失败后执行的动作。
vrrp_script
chk_nginx
{
#健康检查脚本,当脚本返回值不为0时认为失败
script
"/etc/keepalived/ck_ng.sh"
#检查频率,以下配置每2秒检查1次
interval
2
#当检查失败后,将vrrp_instance的priority减小5
weight
-
5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
fall
3
#连续监测2次成功,就认为成功。但不调整优先级
rise
2
}
#定义对外提供服务的VIP vrrp_instance配置
vrrp_instance
VI_1
{
#指定vrrp_instance的初始状态,是MASTER还是BackUP主要还是看优先级。
state
MASTER
#指定vrrp_instance绑定的网卡,最终会通过指定的网卡宣告VIP
interface
eth0
#发送心跳包的源IP,可使用绑定的网卡IP,也可以使用本服务器上的其他IP
uni
cast_src
_ip
192.168.1.1
#相当于VRID,用于在一个网内区分组播,需要组播域内内唯一。
virtual_router
_id
55
#本机的优先级,VRID相同的机器中,优先级最高的会被选举为MASTER
priority
101
#心跳间隔,下面配置,MASTER会每隔1秒发送一个报文高职组内其他机器,自己还活着。
advert
_int
1
#定义主从的验证方式以及密码,一般使用PASS(最长8位,超过了只会识别前8位作为密码)
authentication
{
auth_type
PASS
auth_pass
aliyun
}
#VIP,在阿里云下就是刚才创建的HAVIP
virtual_ipaddress
{
192.168.1.3
}
#本vrrp_instance所引用的脚本配置,名称就是vrrp_script 定义的容器名
track_script
{
chk
_nginx
}
}
|
BACKUP服务器(nginx2)的配置需要修改:
1
2
3
|
state
MASTER改为
state
BACKUP
unicast_src_ip 192.168.1.1改为
backup服务器实际的
IP
uni
cast_src
_
ip
192.168.1.2
priority
101改小一些,比如
priority
100
|
其它保持一致即可
为了实现nginx服务异常的时候能够自动切换,需要自己写一个脚本,脚本没有硬性的要求,能够实现目标即可,这里 监控nginx进程数为例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
vim
/
etc
/
keepalived
/
ck_ng
.sh
#!/bin/bash
#检查nginx进程是否存在
count
=
$
(
ps
-
C
nginx
--
no
-
heading
|
wc
-
l
)
#进程数等于0的时候
if
[
"${count}"
=
"0"
]
;
then
#尝试启动一次nginx,停止2秒后再次检测
service
nginx
start
sleep
2
count
=
$
(
ps
-
C
nginx
--
no
-
heading
|
wc
-
l
)
if
[
"${count}"
=
"0"
]
;
then
#如果启动没成功,就杀掉keepalive触发主备切换
/
etc
/
init
.d
/
keepalived
stop
fi
fi
#增加脚本的执行权限
chmod
+
x
vim
/
etc
/
keepalived
/
ck_ng
.sh
|
1
2
3
4
|
#分别启动nginx1和nginx2的nginx&keepalived服务:
[
root
@
Nginx1
~
]
# /etc/init.d/nginx start;/etc/init.d/keepalived start
Starting
nginx
:
[
OK
]
Starting
keepalived
:
[
OK
]
|
测试:
NGINX1/192.168.1.1的priority 为101,NGINX2/192.168.1.2的priority为100,这时候访问HAVIP绑定的EIP:http://121.43.187.37/可以看到访问到了服务器NGINX1,如下:
这时候访问 http://121.43.187.37/,可以看到访问自动切换到了NGINX2
重新访问http://121.43.187.37/测试,重新访问到了服务器NGINX1,到HAVIP控制台查看,192.168.1.1的服务器重新夺回了控制权,成为了为主服务器
查看日志,发送了移除VIP的报文:
1
2
3
|
Oct
23
17
:
20
:
01
iZ239aqzdi7Z
Keepalived_vrrp
[
25019
]
:
VRRP_Instance
(
VI_1
)
sending
0
priority
Oct
23
17
:
20
:
01
iZ239aqzdi7Z
Keepalived_vrrp
[
25019
]
:
VRRP_Instance
(
VI_1
)
removing
protocol
VIPs
.
Oct
23
17
:
20
:
01
iZ239aqzdi7Z
Keepalived_healthcheckers
[
25018
]
:
Netlink
reflector
reports
IP
192.168.1.3
removed
|
这时候访问 http://121.43.187.37/,可以看到访问自动切换到了NGINX2
到HAVIP控制台查看,192.168.1.2的服务器为主服务器
重新启动nginx1的nginx和keepalive服务
查看日志可以看到keepalive重新发送了IP宣告的报文
1
2
3
4
5
|
Oct
23
17
:
22
:
14
iZ239aqzdi7Z
Keepalived_vrrp
[
25610
]
:
VRRP_Instance
(
VI_1
)
Entering
MASTER
STATE
Oct
23
17
:
22
:
14
iZ239aqzdi7Z
Keepalived_vrrp
[
25610
]
:
VRRP_Instance
(
VI_1
)
setting
protocol
VIPs
.
Oct
23
17
:
22
:
14
iZ239aqzdi7Z
Keepalived_vrrp
[
25610
]
:
VRRP_Instance
(
VI_1
)
Sending
gratuitous
ARPs
on
eth0
for
192.168.1.3
Oct
23
17
:
22
:
14
iZ239aqzdi7Z
Keepalived_healthcheckers
[
25609
]
:
Netlink
reflector
reports
IP
192.168.1.3
added
Oct
23
17
:
22
:
19
iZ239aqzdi7Z
Keepalived_vrrp
[
25610
]
:
VRRP_Instance
(
VI_1
)
Sending
gratuitous
ARPs
on
eth0
for
192.168.1.3
|
重新访问http://121.43.187.37/测试,重新访问到了服务器NGINX1,到HAVIP控制台查看,192.168.1.1的服务器重新夺回了控制权,成为了为主服务器
这样就实现了阿里云环境下的HA切换。
实际测试,阿里云的多个HAVIP可以绑定到同样的两台机器,可以配置多组vrrp_instance来实现双主。或者两台服务器同时为两个业务服务,避免资源浪费。同时能够做到主备