Keepalived+Nginx+Tomcat搭建高可用的Web服务(二):双主模式

所有博文均在个人独立博客http://blog.mozhu.org首发,欢迎访问!

前一篇博文中使用keepalived实现nginx的高可用,并且演示的是主备模式,这种方式有一台机器一直作backup使用,有50%的资源被浪费。而双主模式中,两台主机互为主备,同时有两台机器工作,当其中一台机器出现故障,两台机器的请求转移到一台机器负担。

本篇博文将主要演示Keepalived+Nginx的双主模式

Keepalived+Nginx+Tomcat双主模式

环境准备

Ubuntu 16.04 LTS
Keepalived v1.2.19 (03/13,2017)
Niginx nginx/1.10.3
Tomcat v8.0

准备4台虚拟机,两台Nginx和两台Tomcat,另外两个VIP(虚拟IP),192.168.224.150和192.168.224.151

虚拟机 IP 说明
Nginx1+Keepalived (Master) 192.168.224.101 Nginx Server 1 Master for 192.168.224.150,Backup for 192.168.224.151
Nginx2+Keepalived (Master) 192.168.224.102 Nginx Server 2 Master for 192.168.224.151,Backup for 192.168.224.150
Tomcat1 192.168.224.103 Tomcat Web Server 1
Tomcat2 192.168.224.104 Tomcat Web Server 2

其他配置和前篇博文一样,区别只是keepalived配置不一样

101机器中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
48
49
50
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" //检测nginx进程的脚本
interval 2
weight -20
}

global_defs {
notification_email {
//可以添加邮件提醒
}
}
vrrp_instance VI_1 {
state MASTER //主服务器
interface ens33
virtual_router_id 51
mcast_src_ip 192.168.224.101
priority 250
advert_int 1

authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.224.150
}
}

vrrp_instance VI_2 {
state BACKUP //从服务器
interface ens33
virtual_router_id 52
mcast_src_ip 192.168.224.101
priority 240
advert_int 1

authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.224.151
}
}

102机器中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
48
49
50
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh" //检测nginx进程的脚本
interval 2
weight -20
}

global_defs {
notification_email {
//可以添加邮件提醒
}
}
vrrp_instance VI_1 {
state BACKUP //从服务器
interface ens33
virtual_router_id 51
mcast_src_ip 192.168.224.102
priority 240
advert_int 1

authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.224.150
}
}

vrrp_instance VI_2 {
state MASTER //主服务器
interface ens33
virtual_router_id 52
mcast_src_ip 192.168.224.102
priority 250
advert_int 1

authentication {
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.224.151
}
}

注意观察配置,我们添加了一个vrrp_instance VI_2,绑定了新的VIP192.168.224.151,然后设置了virtual_router_id为52跟VI_1(51)区分开来,VI_2和VI_1的state两台机器配置刚好相反,互为主备。

两台服务器分别启动keepalived和nginx,观察,VIP(150)已经绑定到101机器上,VIP(151)已经绑定到102机器上
浏览器多次刷新并访问http://192.168.224.150/
可以看到页面上IP交替显式103和104,并且显示NGINX-1,则表明是机器(101)在转发web请求
浏览器多次刷新并访问http://192.168.224.151/
可以看到页面上IP交替显式103和104,并且显示NGINX-2,则表明是机器(102)在转发web请求

关闭101机器上的keepalived和nginx来模拟101宕机,查看102的IP信息,发现150,151都绑定到了102机器上
浏览器多次刷新并访问http://192.168.224.150/和http://192.168.224.151/
可以看到页面上IP交替显式103和104,并且显示NGINX-2,则表明是机器(102)在转发两个VIP的web请求

重新启动101机器上的keepalived和nginx,查看101的IP信息,发现150已经重新绑定到101机器上
浏览器多次刷新并访问http://192.168.224.150/
可以看到页面上IP交替显式103和104,并且显示NGINX-1,则表明是机器(101)在转发web请求

从上面的测试结果可以看出,使用两个VIP,将两台机器互作主备,可以100%利用上两台机器,当其中一台机器挂掉后,两个VIP均能通过另一台机器提供服务,达到服务的高可用性。
我们在用双主模式时,对于每台机器我们也应该给足够的余量,避免一台机器挂之后,另一台机器处理不了所有的请求,导致第二台机器接着挂掉,引起“雪崩效应”。

[参考资料]
http://blog.csdn.net/lexang1/article/details/52386909
https://www.cnblogs.com/kevingrace/p/6146031.html

分享到