Zero's Blog

keepalived高可用

介绍

Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,通过配合Nginx可以实现web前端服务的高可用。

环境介绍

系统版本

1
CentOS 6.5 x86_64

IP信息

主ningx 备nginx
172.16.6.245 172.16.6.246

keepalive

安装依赖软件包

1
yum install -y kernel-devel openssl-devel gcc gcc-c++ autoconf openssl openssl-devel

安装keepalive

1
2
3
4
5
6
7
8
9
10
11
tar -zxf keepalived-1.2.17.tar.gz
cd keepalived-1.2.17
./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-504.23.4.el6.x86_64
make && make install
cd /usr/local/keepalived/
cp etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp $DIR/keepalived.conf /etc/keepalived/
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
chkconfig keepalived on

配置keepalive

主服务器配置文件

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
! Configuration File for keepalived
global_defs {
notification_email {
charlie.cui@zerounix.com \\设置报警邮件地址,可以设置多个,每行一个,需要开启sendmail服务,根据实际情况配置
notification_email_from mail.zerounix.com
smtp_server mail.zerounix.com
smtp_connect_timeout 30
router_id LVS_DEVEL \\ 节点名标识
}
vrrp_script chk_https_port { \\ 服务检查脚本
script "/root/nginx_check"
interval 2 \\检查间隔
weight 2 \\权重
}
vrrp_instance VIP { \\vrrp实例定义部分
state MASTER \\ 标示状态为MASTER 指定Keepalived的角色(MASTER主,BACKUP备)
interface eth0 \\HA通信网卡
virtual_router_id 128 \\ 虚拟路由标,同一个vrrp实例使用唯一的标识,即同一个vrrp_instance下的MASTER和BACKUP必须一致
mcast_src_ip 172.16.6.245 \\vrrp实体服务器的IP 发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
priority 100 \\MASTER权重要高于BACKUP 数字越大优选级越高
advert_int 1 \\组播信息发送间隔,两个节点设置必须一样
authentication {
auth_type PASS \\主从服务器验证方式 设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
virtual_ipaddress {
172.16.6.250 \\虚拟IP 可以设置多个虚拟IP地址,每行一个
}
track_script {
chk_https_port \\调用检测脚本
}
track_interface { \\ 健康检测网卡
  eth0
  }
}
}

备服务器配置文件

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
! Configuration File for keepalived
global_defs {
notification_email {
charlie.cui@zerounix.com
}
notification_email_from mail.zerounix.com
smtp_server mail.zerounix.com
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_https_port {
script "/root/nginx_check"
interval 2
weight 2
}
vrrp_instance VIP {
state BACKUP
interface eth0
virtual_router_id 128
mcast_src_ip 172.16.6.246
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.6.250
}
track_script {
chk_https_port
}
track_interface {
  eth0
  }
}
}

服务检查脚本

1
2
3
4
5
6
7
8
9
10
more nginx_check
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi

运行keepalive

配置完成后就可以运行看下效果了,分别在主从服务器上启动nginx和keepalived

1
service keepalived start

启动之后通过ip -a命令查看主服务器的网络信息,可以看到在eth0网卡下生成了172.16.6.250这个虚拟ip,并可通过这个ip访问到nginx

然后我们关闭nginx的进程(如果配置了一次尝试重启那要注意下),然后我们可以通过ps -e查看keepalived进程是否关闭,正常情况下查看网络信息中,可以看到eth0网卡下的虚拟ip已经解除,然后在从服务器的网络信息中可以看到从服务器的eth0网卡绑定了虚拟ip,通过这个ip就访问到了从服务器的nginx去了,这是我们重新启动主服务器的nginx和keepalieved,我们可以发现虚拟ip就绑回到了主服务器。

小结

  • keepalived通过虚拟路由实现双机热备,相比其他方案具有一定的优越性
  • 因为是固定主从热备,该方案比较适合两个互备服务器性能有差异的情况
  • Keepalived同样可以实现双主互备,通过设置互为主备,然后通过DNS负载均衡到不同vip就可以实现