使用Nginx+KeepAlived构建高可用的负载均衡系统

时间:2021-09-23 10:36:41

利用Nginx和KeepAlived做7层的负载均衡,并能实现HA,是硬件负载均衡F5的一个替代方案

另外,还可以使用LVS+KeepAlived做4层的转发,实现负载均衡

对于简单的7层转发,我们使用Nginx来处理基本也就够用了

Nginx和KeepAlived的安装就不说了,只说明一下大概的环境和配置

环境:

2台Server,分别有2个网卡,eth0连接内网,IP地址为10.10.79.30/31

eth1连接公网,但没有为其分配静态的公网IP,通过KeepAlived动态绑定公网VIP为220.181.118.3

DNS解析域名到VIP上

配置:

vi  /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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
global_defs {
 
notification_email {
 
yushunzhi@sohu-inc.com
 
}
 
notification_email_from monitor@sohu.com
 
smtp_server 192.168.x.x
 
smtp_connect_timeout 30
 
router_id LVS_DEVEL
 
}
 
 
vrrp_script check_nginx {
 
script "/opt/scripts/keepalived/check_nginx.sh"
 
interval 1
 
}
 
 
vrrp_instance TanChuang_1 {
 
state BACKUP
 
interface eth0
 
virtual_router_id 77
 
priority 80
 
advert_int 1
 
smtp_alert
 
authentication {
 
auth_type PASS
 
auth_pass xxxx
 
}
 
track_script {
 
check_nginx
 
}
 
virtual_ipaddress {
 
220.181.118.3/24 dev eth1
 
}
 
virtual_routes {
 
via 220.181.118.254 dev eth1
 
}
 
notify /opt/scripts/keepalived/send_msg.sh
 
}

几个说明的地方:

1. state BACKUP只是初始的状态,最后2个Server谁能成为Master是由priority决定的

2. interface eth0是KeepAlived之间发送心跳包的网卡,该设备必须得有固定的IP地址,否则2个Server之间无法通信

由于我们的环境中,eth1是没有固定ip的,所以此处只能设置为eth0,否则会报错:

cant do IP_ADD_MEMBERSHIP errno=No such device

3. virtual_router_id为VRID标识,2个Server必须一致

4. track_script自定义测试服务状态的脚本,默认情况下只有Server宕了或者KeepAlived宕了,才会发生IP漂移

我们自定义一个脚本,检测nginx进程是否存活,如果没有了,则kill掉KeepAlived,使状态强制发生转换

5. virtual_routes设置状态切换时,增加和删除的路由。由于eth1上没有固定公网IP,所以,必须在状态切换时,动态增加到公网的默认路由

6. notify为发生切换时的发报警短信的脚本,可自动向脚本传递3个参数,$1(GROUP—INSTANCE),$2(group或instance名称),$3(MASTER—BACKUP—FAULT)

在我们的配置中,只使用了一个公网ip,用它来作为VIP,同时做DNS解析,对外提供服务

 

Nginx+KeepAlived实现高可用性,实际上可以有以下几种模式:

1. 2台Server做了双机热备,正常情况下,只有一台Server对外提供服务,当其中一台Server有问题时,另外一台自动接管服务。我们上面的配置就是这种模式

2. 2台Server互为主备,配置2个Instance,设置2个VIP,做DNS轮询。正常情况下,2台Server都可以对外提供服务,当其中一台Server有问题时,则另外一台会处理所有的请求。这种模式,在并发量很高时,其中一台挂了,所有请求都转发到另外一台上,很有可能造成另外的Server也崩溃

3. 3台Server,2台对外提供服务,同时分别和第3个Server实现备份,这样,当一台Server出现问题时,还能保证有2台Server对外提供服务,增加了系统的稳定性