0x01 关于 keepalived
早期是专为 LVS
设计的,主要用来监控LVS集群中各个节点状态
内部基于 VRRP协议
实现,即虚拟路由冗余协议
,从名字不难看出,协议本身是用于保证实现路由节点高可用的
0x02 所谓的 VRRP 协议
简单来讲,即将N台提供相同功能的路由器组成一个路由器组,在这个组里有一个master和多个backup
一般情况下,master是由选举算法产生的,另外需要注意的是,只有在 master 上才有一个用于对外提供服务的虚拟ip
其它的backup都是没有的,当master在对外提供服务时,其它的backup又在干什么呢
很简单,当master在对外提供服务时,它同时也在不停的向所有的backup发送VRRP状态信息 说白点儿就是心跳包
告诉所有backup们,说,'我还没累死,你们先歇着,等我挂了,你们再上',然后,所有的backup就会一直在那儿闲着不停地接收这样的状态信息
当某一时刻,backup突然没再接到这样的状态回应时,就说明master已经光荣牺牲了
所有的backup会再重新用选举算法,把优先级最高的backup升级为master继续对外提供服务,以此保证了服务的持续可用性,即所谓的高可用
0x03 借助 keepalived 在web上的高可用实现
首先,在所有需要进行高可用的web节点机器上部署好keepalived,并在节点中设置一个master,其它的则全部设为backup
一旦backup接收不到来自master的心跳数据,即认为master已挂掉,backup随即就会接管master的所有资源数据
当master状态恢复时,backup会把所有的资源数据再移交给master处理,此,即为最简单的web高可用实现
演示环境
Lvsip: 192.168.3.75 虚拟ip: 192.168.3.2 对应域名: reverse.org为keepalived 的MASTER节点
NginxHttpip: 192.168.3.49 对应域名: reverse.org 为keepalived 的BACKUP节点
OldLampip: 192.168.3.45 对应域名: www.bwapp.cc
OldLnmpip: 192.168.3.42 对应域名: test.bwapp.org
0x04 务必保证 Lvs 和 NginxHttp 两台机器上的nginx配置是完全一致的,且nginx服务已处于成功启动状态,具体如下
cat /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream default_pools{
server test.bwapp.org:80 weight=2;
server www.bwapp.cc:80;
}
upstream static_pools {
server test.bwapp.org:80;
}
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
ps -ef | grep keepalived看到同时有三个keepalived进程起来,则说明安装成功
/etc/init.d/keepalived stop之后再停掉keepalived,继续后面的配置
0x06 接着,再来配置master节点的 keepalived.conf,注意,里面只需保留如下配置,其余默认的配置可暂时先全部删掉
vi /etc/keepalived/keepalived.conf
global_defs { # 全局配置
notification_email { # 报警通知联系人,该段可直接注释不用
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_01# 类似mysql的server id
vrrp_skip_check_adv_addr
! vrrp_strict# 开启表示严格执行VRRP协议规范,此模式不支持节点单播,默认是开启的,建议关闭,否则你会发现绑不上虚拟ip
vrrp_garp_interval 0
vrrp_gna_interval 0
}
keepalived的一个实例配置
vrrp_instance VI_1 { # 设置实例名称
state MASTER # 当前实例角色,如,MASTER,BACKUP
interface eth0 # 发送心跳的网卡接口
virtual_router_id 51 # 该实例id,MASTER和BACKUP端要保持一致,否则会出现裂脑
priority 150 # 优先级设置,高的为MASTER,建议节点之间优先级步长为50
advert_int 1 # 心跳包发送时间间隔,默认为1秒
authentication { # MASTER和BACKUP通信验证
auth_type PASS # 使用PASS方式
auth_pass 1111 # 默认密码为1111
}
virtual_ipaddress { # 绑定虚拟ip,相当于 ip addr add 192.168.3.2/24 dev eth0
的效果
192.168.3.2/24
}
}
scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived/keepalived.conf
/etc/init.d/keepalived start
ip addr | grep "192.168.3.2/24"先等一会儿,看下虚拟ip到底vi /etc/keepalived/keepalived.conf
global_defs {
notification_email {
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_02 # 务必保证id的唯一性,类似mysql的server id
vrrp_skip_check_adv_addr
! vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 { # 两边使用同一个实例
state BACKUP # 角色要改
interface eth0
virtual_router_id 51
priority 100 # 优先级要小50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.3.2/24
}
}
/etc/init.d/keepalived start
ip addr | grep "192.168.3.2/24" 这个ip只有在master挂掉的时候才会有
下面是自动飘ip的实际效果,此时再配合着回想VRRP协议是不是更好理解些呢
keepalived + nginx 初步实现高可用
下面则是模拟keepalived配合nginx 实现web高可用的效果,当MASTER机器不幸down掉时,BACKUP几乎会瞬间接管,以此来保证web服务的持续可用,具体如下
keepalived + nginx 初步实现高可用
注意,keepalived默认只对系统级别的宕机才会主动接管,对于各类常规服务它是不会自动接管的,解决办法很简单,写个脚本,手动把它俩关联上就好了,此处的所有脚本仅做demo参考,有兴趣请自行加强,如下
vi keepalived_nginx_check.sh
chmod +x keepalived_nginx_check.sh
#!/bin/bash
while true
do
NginxPid=ps -C nginx --no-header |wc -l
if [ $NginxPid -eq 2 ]
then# 检查worker数
/etc/init.d/keepalived stop &>/dev/null # 如果发现worker对不上,就自动让另一台backup去接管
fi
sleep 1# 可以时间隔短点,不然,down半天了,那边还没反应
done
keepalived_nginx_check.sh &
ps -ef | grep "keepalived_nginx_check"
keepalived + nginx 初步实现高可用
0x08 高可用的裂脑问题,所谓的裂脑,即只要backup收不到master发过来的状态信息就以为master挂掉了,但实际上master并没有挂,只是由于一些别的原因导致master和backup之间没法正常的通信,而backup却直接粗暴的理解成master挂掉了,随后就直接就接管资源,这也就导致了裂脑问题的发生,下面是一个检测裂脑的小脚本,原理比较简单,如果我发现master能ping通,但backup本地又有虚拟ip存在,则说明已经裂脑了,用法很简单,直接在backup节点上后台运行该脚本即可
#!/bin/bash
check keepalived status
while true
do
addr=ip addr | grep "192.168.3.2/24" | wc -l
ping -c 5 -W 3 192.168.3.75 &>/dev/null
if [ $? -eq 0 -a $addr -eq 1 ] ;then
echo "ha is brain."
else
echo "ha is ok"
fi
sleep 2
done
keepalived + nginx 初步实现高可用
0x09 keepalived默认的日志在/var/log/messages文件中,不利于分析,所以,实际中最好改下keepalived的默认日志路径,方便后续排查问题,如下
KEEPALIVED_OPTIONS="-D -S 0 -d"
keepalived + nginx 初步实现高可用
后话:
篇幅限制,这里仅仅只做了nginx的高可用,关于和LVS的配合应用我们会再单做说明,至于其它的一些基础服务高可用部署方式基本都大同小异,工具比较简单,此处不再赘述,有空的话,大家倒是可以去深入了解下 VRRP ^_^