使用一个VIP,前端有2台服务器,一主一从,正常情况下是主服务器提供服务只有当主服务器不能正常提供服务之后,从服务器才提供服务,此时总会有一台服务器是空闲状态。
使用两个VIP,前段有2台服务器,互为主从,两台服务器同时工作,不存在资源浪费情况。同时在前段的DNS服务器对网站做多条A记录,实现了Nginx
的负载均衡,当一台服务器故障时候,资源会转移到另一台服务器,继续提供服务,在大型的网站中多数都使用此种架构。在此使用主主模式配置
Nginx+keepalived的高可用性。
VIP:172.16.10.8
VIP:172.16.10.9
Keepalived1:172.16.10.1
Keepalived2:172.16.10.2
Keepalived1:Centos 6.4 x86_64
Keepalived2:Centos 6.4 x86_64
1
2
3
4
5
6
7
8
9
10
11
12
13
|
####keepalived1 server############
sed
-i
's@\(HOSTNAME=\).*@\1keepalived1@g'
/etc/sysconfig/network
hostname
keepalived1
[root@keepalived1 ~]
# echo "172.16.10.1 keepalived1">> /etc/hosts
[root@keepalived1 ~]
# echo "172.16.10.2 keepalived2">> /etc/hosts
[root@keepalived1 ~]
# ssh-keygen -t rs
[root@keepalived1 ~]
# ssh-copy-id -i .ssh/id_rsa.pub keepalived2
[root@keepalived1 ~]
# scp /etc/hosts keepalived1:/etc/
####keepalived2 server############
sed
-i
's@\(HOSTNAME=\).*@\1keepalived2@g'
/etc/sysconfig/network
hostname
keepalived2
[root@keepalived2 ~]
# ssh-keygen -t rsa
[root@keepalived2 ~]
# ssh-copy-id -i .ssh/id_rsa.pub keepalived1
|
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
|
[root@keepalived1 ~]
# yum install openssl-devel pcre-devel gcc -y
[root@keepalived1 ~]
# tar xf nginx-1.4.2.tar.gz -C /usr/local/
[root@keepalived1 ~]
# cd /usr/local/
[root@keepalived1
local
]
# groupadd -r nginx
[root@keepalived1
local
]
# useradd -r -g nginx nginx
[root@keepalived1
local
]
# cd nginx-1.4.2/
[root@keepalived1 nginx-1.4.2]
# ./conf
conf/ configure
[root@keepalived1 nginx-1.4.2]
# ./configure \
> --prefix=
/usr
\
> --sbin-path=
/usr/sbin/nginx
\
> --conf-path=
/etc/nginx/nginx
.conf \
> --error-log-path=
/var/log/nginx/error
.log \
> --http-log-path=
/var/log/nginx/access
.log \
> --pid-path=
/var/run/nginx/nginx
.pid \
> --lock-path=
/var/lock/nginx
.lock \
> --user=nginx \
> --group=nginx \
> --with-http_ssl_module \
> --with-http_flv_module \
> --with-http_stub_status_module \
> --with-http_gzip_static_module \
> --http-client-body-temp-path=
/var/tmp/nginx/client/
\
> --http-proxy-temp-path=
/var/tmp/nginx/proxy/
\
> --http-fastcgi-temp-path=
/var/tmp/nginx/fcgi/
\
> --http-uwsgi-temp-path=
/var/tmp/nginx/uwsgi
\
> --http-scgi-temp-path=
/var/tmp/nginx/scgi
\
> --with-pcre
[root@keepalived1 nginx-1.4.2]
# make && make install
|
注意 在此只上传了keepalived1的代码,keepalived2也需要同样的操作
1
2
3
4
|
###############keepalived1######################
[root@keepalived1 ~]
# echo "<h1>keepalived1</h1>" > /usr/html/index.html
###############keepalived2######################
[root@keepalived2 ~]
# echo "<h1>keepalived2</h1>" > /usr/html/index.html
|
1
2
3
4
|
###############keepalived1######################
[root@keepalived1 ~]
# yum install keepalived -y
###############keepalived2######################
[root@keepalived2 ~]
# yum install keepalived -y
|
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
|
[root@keepalived1 keepalived]
# grep -v "#" /etc/keepalived/keepalived.conf
! Configuration File
for
keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from Alexandre.Cassen@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
#监控nginx脚本
script
"killall -0 nginx"
#监控nginx进程
interval 1
#监控间隔
weight -2
#优先级-2
}
vrrp_instance VI_1 {
state MASTER
#主server
interface eth0
virtual_router_id 80
priority 100
#优先级
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.10.8
#定义vip
}
track_script {
chk_nginx
#跟踪脚本
}
notify_master
"/etc/keepalived/notify8.sh master"
#定义邮件通知
notify_backup
"/etc/keepalived/notify8.sh backup"
notify_fault
"/etc/keepalived/notify8.sh fault"
}
vrrp_instance VI_2 {
state BACKUP
#从server
interface eth0
virtual_router_id 81
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.10.9
}
track_script {
chk_nginx
}
notify_master
"/etc/keepalived/notify9.sh master"
#定义邮件通知
notify_backup
"/etc/keepalived/notify9.sh backup"
notify_fault
"/etc/keepalived/notify9.sh fault"
}
[root@keepalived1 keepalived]
#
|
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
|
#####################notify8.sh##############
[root@keepalived1 keepalived]
# cat notify8.sh
#!/bin/bash
# Author: xiaodong <[email protected]>
# description: An example of notify script
#
vip=172.16.10.8
contact=
'root@localhost'
notify() {
mailsubject=
"`hostname` to be $1: $vip floating"
mailbody=
"`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
echo
$mailbody | mail -s
"$mailsubject"
$contact
}
case
"$1"
in
master)
notify master
/etc/rc
.d
/init
.d
/nginx
start
exit
0
;;
backup)
notify backup
/etc/rc
.d
/init
.d
/nginx
stop
exit
0
;;
fault)
notify fault
exit
0
;;
*)
echo
'Usage: `basename $0` {master|backup|fault}'
exit
1
;;
esac
####################notfiy9.sh#################
[root@keepalived1 keepalived]
# cat notify9.sh
#!/bin/bash
# Author: xiaodong <[email protected]>
# description: An example of notify script
#
vip=172.16.10.9
contact=
'root@localhost'
notify() {
mailsubject=
"`hostname` to be $1: $vip floating"
mailbody=
"`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
echo
$mailbody | mail -s
"$mailsubject"
$contact
}
case
"$1"
in
master)
notify master
exit
0
;;
backup)
notify backup
exit
0
;;
fault)
notify fault
exit
0
;;
*)
echo
'Usage: `basename $0` {master|backup|fault}'
exit
1
;;
esac
[root@keepalived1 keepalived]
# chmod +x notify8.sh
[root@keepalived1 keepalived]
# chmod +x notify9.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
48
49
50
51
52
53
54
55
56
|
[root@keepalived1 keepalived]
# scp -p keepalived.conf notify8.sh notify9.sh keepalived2:/etc/keepalived/
[root@keepalived2 keepalived]
# grep -v "#" /etc/keepalived/keepalived.conf
! Configuration File
for
keepalived
global_defs {
notification_email {
root@localhost
notification_email_from Alexandre.Cassen@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script
"killall -0 nginx "
interval 1
weight -2
}
vrrp_instance VI_1 {
state BACKUP
#改为backup
interface eth0
virtual_router_id 80
priority 99
#改为99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.10.8
}
track_script {
chk_nginx
}
notify_master
"/etc/keepalived/notify.sh master"
notify_backup
"/etc/keepalived/notify.sh backup"
notify_fault
"/etc/keepalived/notify.sh fault"
}
vrrp_instance VI_2 {
state MASTER
#改为MASTER
interface eth0
virtual_router_id 81
priority 100
#改为100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.10.9
}
track_script {
chk_nginx
}
notify_master
"/etc/keepalived/notify9.sh master"
notify_backup
"/etc/keepalived/notify9.sh backup"
notify_fault
"/etc/keepalived/notify9.sh fault"
}
|
注释:此处使用本地的邮件服务器接受邮件,如果需要用其它邮件服务器请修改contact='root@localhost'
1
2
3
4
|
###############keepalived1######################
[root@keepalived1 ~]
# service keepalived start
###############keepalived2######################
[root@keepalived2 ~]
# service keepalived start
|
1
|
[root@keepalived1 keepalived]
# service keepalived stop
|
通过以上测试,节点出现故障的时候,服务可以自动转移到备用节点上
1
2
|
[root@keepalived1 keepalived]
# service keepalived start
[root@keepalived1 keepalived]
# killall nginx
|
通过以上测试,实现了Nginx的高可用性,但是,运维人员是否能第一时间得知服务器出现故障,这时候就需要查看邮件了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@keepalived1 keepalived]
# mail #查看邮件命令
Heirloom Mail version 12.4 7
/29/08
. Type ?
for
help.
"/var/spool/mail/root"
: 1 message 1 new
>N 1 root Wed Sep 25 20:15 18
/728
"keepalived1 to be backup: 172.16.10.8 floating"
& 1
Message 1:
From [email protected] Wed Sep 25 20:15:46 2013
Return-Path: <[email protected]>
X-Original-To: root@localhost
Delivered-To: [email protected]
Date: Wed, 25 Sep 2013 20:15:46 +0800
Subject: keepalived1 to be backup: 172.16.10.8 floating
User-Agent: Heirloom mailx 12.4 7
/29/08
Content-Type: text
/plain
; charset=us-ascii
From: [email protected] (root)
Status: R
2013-09-25 20:15:46: vrrp transition, keepalived1 changed to be backup
& quit
#退出邮件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@keepalived1 keepalived]
# service nginx start
[root@keepalived1 keepalived]
# mail
Heirloom Mail version 12.4 7
/29/08
. Type ?
for
help.
"/var/spool/mail/root"
: 2 messages 1 unread
1 root Wed Sep 25 20:15 19
/739
"keepalived1 to be backup: 172.16.10.8 floating"
>U 2 root Wed Sep 25 20:16 19
/738
"keepalived1 to be master: 172.16.10.8 floating"
&
Message 2:
From [email protected] Wed Sep 25 20:16:22 2013
Return-Path: <[email protected]>
X-Original-To: root@localhost
Delivered-To: [email protected]
Date: Wed, 25 Sep 2013 20:16:22 +0800
Subject: keepalived1 to be master: 172.16.10.8 floating
User-Agent: Heirloom mailx 12.4 7
/29/08
Content-Type: text
/plain
; charset=us-ascii
From: [email protected] (root)
Status: RO
2013-09-25 20:16:22: vrrp transition, keepalived1 changed to be master
|
Nginx+keepalived的高可用负载均衡配置完成,本博客至此结束,如有任何疑问请留言!