keepwww808888webcomalived18669144449LVS

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继续对外提供服务,以此保证了服务的持续可用性,即所谓的高可用

扫描二维码关注公众号,回复: 5717998 查看本文章

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 { # 报警通知联系人,该段可直接注释不用

[email protected]

}

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 {

[email protected]

}

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 ^_^

猜你喜欢

转载自blog.51cto.com/14265687/2371690
lvs