高可用系列之Nginx

1.1Keepalived高可用软件

Keepalived起初是专为LVS设计的,专门用来监控LVS集群系统中各个服务节点的状态,后来又加入了VRRP的功能,因此除了配合LVS服务外,也可以作为其他服务(Nginx,Haproxy)的高可用软件,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由出现的单点故障问题,它能够保证网络的不间断、稳定的运行。所以,keepalived以方面具有LVS Cluster nodes
healthchecks功能,另一方面也具有LVS directors failover功能。

1.1.1LVS
Directors failover功能

Ha failover功能:实现LB Master主机和Backup主机之间故障转义和自动切换。

这是针对有两个负载均衡器Director同时工作而采取的故障转移措施。当主负载均衡器(MASTER)失效或出现故障时,备份负载均衡器(BACKUP)将自动接管主负载均衡的所有工作(vip资源及相应服务)一旦主负载均衡器(MASTER)故障修复,MASTER又会接管回它原来处理的工作,而备份负载均衡器(BACKUP)会释放master失效时它接管的工作,此时两者将恢复到最初各自的角色状态。

1.1.2Lvs
cluster nodes healthchecks功能

1、keepalived.conf里配置就可以实现LVS功能。

2、keeplaived可以对LVS下面的集群节点做健康检查。

Rs healthcheck功能:负载均衡定期检查RS的可用性决定是否给其分发请求。

当虚拟服务器中的某一个甚至是几个真实服务器同时发生故障无法提供服务时,负载均衡器会自动将失效的RS服务器从转发队列中清除出去,从而保证用户的访问不受影响:当故障的RS服务器被修复以后,系统又会自动地把它们加入转发队列,分发请求提供正常服务。

1.2Keeplaived故障切换转移原理介绍

Keepalived
Directors高可用对之间的故障切换转移,是通过VRRP协议(Virtual Router
Redundancy Protocol 中文虚拟路由器冗余协议)来实现的。

在Keepalived
Directors正常工作时,主Director节点会不断的向备节点广播心跳消息,用以告诉备节点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的IP资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时自身接管的IP资源及服务,恢复到原来的自身备用角色。

1.3VRRP协议简单介绍

VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台物理的机器并不同时工作,而是由一台称为Master的负责路由工作,其他的都是Backup,Master并非一成不变,VRRP协议让每个VRRP路由器参与竞选,最终获胜的就是Master。Master有一些特权,比如拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的Master要负责转发发送给网关地址的包和响应ARP请求。

VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包(多播地址224.0.0.18)形式发送的。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址。所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称为VIP)。客户端主机并不需要因为Master的改变而修改自己的路由配置,对他们来说,这种主从的切换是透明的。

在一个虚拟路由器中,只有作为Master的VRRP路由器会一直发送VRRP广告包(VRRP Advertisement message),Backup不会枪占Master,除非它的优先级(priority)更高。当Master不可用时(Backup收不到广告包),多台Backup中优先级最高的这台会被枪占为Master。这种枪占是非常快速的(<1s),以保证服务的连续性。

由于安全性考虑,VRRP包使用了加密协议进行加密。

1.4Keepalived工作原理小结

1.4.1VRRP协议介绍

1、VRRP协议,全称Virtual Router Redundancy Protocol,中文名,虚拟路由器冗余协议,VRRP的出现就是为了解决静态 的单点故障。

2、VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器。

3、VRRP是通过IP多播的方式实现通信。

4、主发包,备接包,当备接不到主发的包的时候,就启动接管程序接管主的资源。备可以由多个,通过优先级竞选。

5、VRRP使用加密协议。

1.4.2Keepalived工作原理

Keepalived高可用之间是通过VRRP协议通信的,VRRP协议是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会获得所有的资源,备节点处于等待状态,当主挂了时候,备节点,接管主节点的资源,然后顶替主节点对外提供服务。

VRRP协议是通过IP多播包的方式(224.0.0.18)发送。

在keepalived之间,只有作为主的服务器会一直发送VRRP广播包,告诉备他还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性,接管的速度可以小于1秒,VRRP使用加密协议加密发送广播包。

1.5Keepalived+Nginx高可用实践

1.5.1高可用环境准备

[root@lb-node1 ~]# cat /etc/redhat-release  #查看系统版本

CentOS release 6.7 (Final)

[root@lb-node1 ~]# uname -r #查看内核版本

2.6.32-573.el6.x86_64

[root@lb-node1 ~]# getenforce #确认Selinux关闭状态

Disabled

[root@lb-node1 ~]# /etc/init.d/iptables status#确认Iptables关闭状态

iptables: Firewall is not running.

1.5.2安装Nginx web服务

yum install openssl openssl-devel pcre pcre-devel
-y

mkdir -p /home/oldboy/tools

cd /home/oldboy/tools

wget -q
http://nginx.org/download/nginx-1.6.3.tar.gz

ls -l nginx-1.6.3.tar.gz

useradd nginx -s /sbin/nologin -M

tar xf nginx-1.6.3.tar.gz

cd nginx-1.6.3

./configure--user=nginx --group=nginx --prefix=/application/nginx-1.6.3
--with-http_stub_status_module--with-http_ssl_module

make

make install

ln -s /application/nginx-1.6.3 /application/nginx

1.5.3安装Keepalived高可用

[root@lb01 ~]#yum -y install keepalived  #lb01端安装keepalived

[root@lb02 ~]#yum -y install keepalived  #lb02端安装keepalived

1.5.4配置Master_Keepalived

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf  #Master
Keepalived配置文件

!
Configuration File for keepalived

global_defs {

notification_email {

liangwei.xu@foxmail.qq.com

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id Nginx_01

}

vrrp_instance VI_1 {

state
MASTER

interface eth0

virtual_router_id 51

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.11/24

}

}

1.5.5配置Backup_Keepalived

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf #Backup Keepalived配置文件

!
Configuration File for keepalived

global_defs {

notification_email {

liangwei.xu@foxmail.qq.com

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id Nginx_02

}

vrrp_instance VI_1 {

state
Backup

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.11/24

}

}

1.5.6Keepalived主备配置比较

主从单实例keepalived.conf配置差别项

Keepalived配置参数

Master节点特殊参数

Backup节点特殊参数

route_id(唯一标识)

route_id lb01

route_id lb02

state(角色状态)

state Master

state Backup

priority(竞选优先级)

priority 150

priority 100

1.5.7启动keepalived服务

[root@lb01 ~]# /etc/init.d/keepalived start #启动lb01上Master_keepalived

[root@lb02 ~]# /etc/init.d/keepalived start #启动lb02上Master_keepalived

1.5.8检测IP地址是否漂移

[root@lb01 ~]# ip addr|grep 10.0.0.11 #查看是否有VIP地址

inet
10.0.0.11/24 scope global secondary eth0

[root@lb01 ~]# /etc/init.d/keepalived stop #停止Master上Keepalived

[root@lb01 ~]# ip addr|grep 10.0.0.11 #VIP已经从Master端移除

[root@lb02 ~]# ip addr|grep 10.0.0.11 #Backup上Keepalived接管资源

inet
10.0.0.11/24 scope global secondary eth0

[root@lb01 ~]# /etc/init.d/keepalived start #启动Master_keepalived

[root@lb01 ~]# ip addr|grep 10.0.0.11 #Master继续接管资源

inet
10.0.0.11/24 scope global secondary eth0

1.5.9Keepalived配置文件详解

1 !
Configuration File for keepalived
#注释

2

3
global_defs {

4    notification_email {

5      acassen@firewall.loc #5-7发邮件给谁

8    }

9    notification_email_from Alexandre.Cassen@firewall.lo #发邮件发件人

10    smtp_server 192.168.200.1 #邮件服务器地址

11    smtp_connect_timeout 30 #超时时间

12    router_id Nginx_01 #主备ID不能一样

13 }

15 vrrp_instance VI_1 {  #实例名称(建议不修)

16     state MASTER #服务器的状态(仅仅是傀儡)

 17     interface eth0 #通信端口

 18     virtual_router_id 51 #实例的ID

 19     priority 150 #优先级,主备之间最好相差50

20     advert_int 1 #心跳间隔(如果一秒没通信备节点马上接管)

21     authentication {

22         auth_type PASS #PASS认证类型,此参数备节点设置和主节点相同

23         auth_pass 1111 #密码是1111,此参数备节点设置和主节点相同

24     }

25     virtual_ipaddress { #vip(可以多个)

 26       10.0.0.11/24 #26-28配置vIP地址,绑定在eth0  因为(interface
eth0)

29     }

30 }

q全局定义块部分:主要设置Keepalived的通知机制和标识

1、第4-9行是email通知参数。作用:当LVS发生切换或RS等有故障时,会发邮件报警。这是可选配,notifucation_email指定在keepalived发生事件时,需要发给的email地址,可以有多个,每行一个。

2smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail,就可以使用上面默认配置实现邮件发送。

3、第10行是Lvs负载均衡器标示(rote_id)。在一个局域网内,它应该是唯一的。

4、大括号”{}” 用来分隔定义块,因此必须成对出现。如果漏写了,keepalived运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。

qVRRP定义块

1、第13行为VRRP实例vrrp_instance,每个Vrrp实例可以认为是一个keepalived实例,在配置中VRRP实例可以有多个。

(1)14行实例状态state.只有MasterBackup两种状态,并且需要大写这些单词。其中MASTER为工作状态。BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的系统会自动把它的状态有BACKUP变换成MASTER,当失效的MASTER所在的系统恢复时,BACKUPMASTER恢复到BACKUP状态。

(2)通信接口interface。对外提供服务的网络结构,如eth0,eth1当前主流的服务器有2个或2个以上的网络接口,在选择服务器接口时,一定要搞清楚了。

(3)lvs_sync_daemon_interface。负载均衡器之间的监控接口,类似于HA
HeartBeat
的心跳线。

(4)16行为虚拟路由标示virtual_route_id是一致的,同时在整个keepalived内是唯一的。

(5)17行为优先级priority,这是一个数字,数值愈大,优先级越高。在同一个vrrp_instance里,MASTER的优先级
BACKUP
。若MASTERpriority值为150,那么BACKUPpriority只能在149或者跟小的数值(官方建议相差50)

(6)18行同步通知间隔advert_intMASTERBACKUP负载均衡器之间同步检查的时间间隔,单位为秒。

(7)19-22行验证authentication.包含验证类型和验证密码。类型主要有PASSAH两种,通常使用的类型为PASS,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTERBACKUP使用相同的密码才能正常通信,这里官方推荐用明文即可。

2、第23-27行为虚拟ip地址virtual_ipaddress。可以配置多个IP地址,每个地址占一行,需要指定子网掩码。

注意:这个ip必须与我们在lvs客户端设定的vip相一致。

1.5.10keepalived日志文件

[root@lb01 ~]#sed
-i '14 s#KEEPALIVED_OPTIONS="-D"#KEEPALIVED_OPTIONS="-D -d -S
0"#g' /etc/sysconfig/keepalived #指定文件接收Keepalived服务日志

[root@lb-node1 conf]# echo -e "local0.* \t
/var/log/keepalived.log" >>/etc/rsyslog.conf  #配置至rsyslog

[root@lb-node1 conf]# tail -1 /etc/rsyslog.conf  #检查是否配置成功

local0.*/var/log/keepalived.log

[root@lb-node1 conf]# /etc/init.d/rsyslog restart  #重新启动rsyslog

Shutting down system logger:                               [  OK  ]

Starting system logger:                                [  OK  ]

1.6Keepalived+Nginx高可用多实例实践

1.6.1Master_keepalived多实例

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf #这上面第一个实例是Master 第二个实例修改为Backup

vrrp_instance VI_1 {

state
MASTER

interface eth0

virtual_router_id 51

priority 150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.11/24

}

}

vrrp_instance VI_2 {

state BACKUP

interface eth0

virtual_router_id
52

priority
100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.12/24

}

}

1.6.2Backup_keepalived多实例

[root@lb02 ~]# cat /etc/keepalived/keepalived.conf #这上面第一个实例是Backup,第二个实例修改为Backup

vrrp_instance
VI_1 {

state
Backup

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.11/24

}

}

vrrp_instance VI_2 {

state MASTER

interface eth0

virtual_router_id
52

priority
150

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.0.0.12/24

}

}

1.6.3检测多实例IP地址是否漂移

[root@lb-node1 ~]# ip addr|grep 10.0.0.11

inet
10.0.0.11/24 scope global secondary eth0

[root@lb-node2 ~]# ip addr|grep 10.0.0.12

inet
10.0.0.12/24 scope global secondary eth0

[root@lb-node2 ~]# /etc/init.d/keepalived stop

Stopping keepalived:                                       [  OK  ]

[root@lb-node1 ~]# ip addr|grep 10.0.0

inet
10.0.0.11/24 scope global secondary eth0

inet
10.0.0.12/24 scope global secondary eth0

[root@lb-node2 ~]# /etc/init.d/keepalived start

Starting keepalived:                                       [  OK  ]

[root@lb-node2 ~]# ip addr|grep 10.0.0.12

inet
10.0.0.12/24 scope global secondary eth0

[root@lb-node1 ~]# ip addr|grep 10.0.0

inet
10.0.0.11/24 scope global secondary eth0

[root@lb-node1 ~]# tcpdump -n 'host 224.0.0.18'  抓包

1.7keepalived列脑解决

由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并

Nginx宕机keepalived是不会接管的,需要写一个脚本检测nginx是否存活 ,如果不存货就kill nginx和keepalived

1、 可以ping通主,备节点还有VIP就认为列脑  (如果停止主,脚本也会报脑裂)

[root@lb02 ~]# cat check_split_brain.sh

#!/bin/sh

lb01_vip=10.0.0.12

lb01_ip=10.0.0.7

while true

do

ping -c 2 -W 3 $lb01_ip &>/dev/null

if [ $? -eq
0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ]

then

echo
"ha is split brain.warning."

else

echo
"ha is ok"

fi

sleep 5

done

1.8Keepalived常见故障解决

服务器网线松动等网络故障

服务器硬件故障发生损坏现象而崩溃

Nginx服务死掉

[root@lb01 scripts]# cat nginx_pid.sh

#!/bin/sh

while true

do

nginxpid=`ps -C nginx --no-header|wc -l`

if [ $nginxpid -eq 0 ];then

/application/nginx/sbin/nginx

sleep 5

nginxpid=`ps -C nginx --no-header|wc -l`

if [
$nginxpid -eq 0 ];then

/etc/init.d/keepalived stop

exit 1

fi

fi

sleep 5

done

上一篇:OOUnitThreeSummary


下一篇:Correct the classpath of your application so that it contains a single, compatible version of org.ap