一、Keepalived

   keepalived前提准备见上文 --> 

二、keepalived高可用LVS

  keepalived能够根据配置文件生成ipvs规则,同时可以对后端各RS做健康状态检测

  1、实验清单

  director1: node1 192.168.0.40

  director2: Nginx 192.168.0.108

  Vip:192.168.0.80

  RS1(httpd):192.168.0.100

  RS2(httpd):192.168.0.101

  2、配置文件

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
74
[root@Nginx ~]
# cd /etc/keepalived/
[root@Nginx keepalived]
# vim keepalived.conf
! Configuration File 
for 
keepalived
 
global_defs {
   
notification_email {
    
root@localhost
   
}
   
notification_email_from kaadmin@localhost
   
smtp_server 127.0.0.1
   
smtp_connect_timeout 30
   
router_id LVS_DEVEL
}
vrrp_script chk_mt {
    
script 
"[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
    
interval 1
    
weight -2
}
vrrp_instance VI_1 {
    
state MASTER               
#node1须修改为BACKUP
    
interface eth0
    
virtual_router_id 51
    
priority 100               
#node1降低优先级
    
advert_int 1 
    
authentication {
        
auth_type PASS
        
auth_pass 71988d704dcae985
    
}
    
virtual_ipaddress {
        
192.168.0.80
/32
    
}
    
track_script {
    
chk_mt 
    
}
    
notify_master 
"/etc/keepalived/notify.sh master"
    
notify_backup 
"/etc/keepalived/notify.sh backup"
    
notify_fault 
"/etc/keepalived/notify.sh fault"
}
 
virtual_server 192.168.0.80 80 {
    
delay_loop 6     
#服务器轮询6次超时           
    
lb_algo rr       
#LVS调度算法
    
lb_kind DR       
#LVS转发方法
    
nat_mask 255.255.255.0     
#掩码
    
persistence_timeout 50     
#长链接时间
    
protocol TCP               
#tcp协议
    
ha_suspend                 
#在无vip情形下,不再进行健康状态检测
    
sorry_server 127.0.0.1 80        
#当RS全宕机时,sorry_server提供错误页面
    
real_server 192.168.0.100 80 {          
#RS的ip,端口
        
weight 1                            
#权重
        
HTTP_GET {                          
#检测类型,这里是HTTP_GET
            
url {                           
#检测请求的类型,这里是状态检测
              
path /
          
status_code 200
            
}
            
connect_timeout 3               
#连接超时时间
            
nb_get_retry 3                  
#重试次数
            
delay_before_retry 3            
#重试前延迟时间
        
}
    
}
   
real_server 192.168.0.101 80 {
        
weight 2
        
HTTP_GET {
            
url {
              
path /
              
status_code 200
            
}
            
connect_timeout 3
            
nb_get_retry 3
            
delay_before_retry 3
        
}
    
}
 
}

 3、定义状态转变后发邮件的notify脚本(来自马哥文档)

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
#!/bin/bash
 
vip=192.168.0.80
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

二、高可用Nginx

   1、在Nginx主机上配置反向代理upstream

1
2
3
4
5
6
7
8
9
10
11
12
http区段配置    
    
upstream nodeserver{
       
server 192.168.0.30;
       
server 192.168.0.40;
    
}
server区段配置
    
location / {
         
proxy_pass http:
//nodeserver
;
         
proxy_set_header Host    $host;
         
proxy_set_header X-Real-IP  $remote_addr;
         
add_header X-Cache $upstream_cache_status;
         
}

   2、配置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
global_defs {
   
notification_email {
    
root@localhost
   
}
   
notification_email_from kaadmin@localhost
   
smtp_server 127.0.0.1
   
smtp_connect_timeout 30
   
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
    
script 
"killall -0 nginx &> /dev/null"
    
interval 1
    
weight -10
}
 
vrrp_instance VI_1 {
    
state MASTER
    
interface eth0
    
virtual_router_id 51
    
priority 100
    
advert_int 1
    
authentication {
        
auth_type PASS
        
auth_pass 71988d704dcae985
    
}
    
virtual_ipaddress {
        
192.168.0.80
/32
    
}
    
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"
}