02架构 06 Keepalived 高可用

高可用keepalived

什么是高可用?

一台服务器出现问题,另一台机器自动接管,不影响业务的使用

keepalived原理

keepalived基于VRRP协议
VIP漂移,VMAC地址通知ARP协议修改

高可用使用的软件 keepalived

1.keepalived协议

keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议

2.keepalived使用场景

通常业务系统需要保证7×24小时不DOWN机,比如公司内部的OA系统,每天公司人员都需要使用,则不允许Down机,作为业务系统来说随时都可用

3.高可用keepalived核心概念

1、如何确定谁是主节点谁是备节点(选举投票,优先级)
2、如果Master故障,Backup自动接管,那么Master恢复后会夺权吗(抢占试、非抢占式)
3、如果两台服务器都认为自己是Master会出现什么问题(脑裂)

搭建keepalived

1.安装keepalived

[root@lb01 ~]# yum install -y keepalived
[root@lb02 ~]# yum install -y keepalived

2.配置keepalived

#主节点配置
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
   router_id lb01			#身份识别
   script_user root			#脚本执行用户,如果没有会报错
}
vrrp_instance VI_1 {
    state MASTER			#默认身份是master
    interface eth0			#VIP加在哪块网卡
    virtual_router_id 51	#分组
    priority 150			#优先级
    advert_int 3			#沟通间隔
    authentication {
        auth_type PASS		#认证方式 以明文密码的方式
        auth_pass 1111		#密码是多少
    }
    virtual_ipaddress {
        10.0.0.2			#VIP的地址
    }
}

#备节点配置
global_defs {
   router_id lb02
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 3
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.2
    }
}


全局定义块

1、email通知(notification_email、smtp_server、smtp_connect_timeout):用于服务有故障时发送邮件报警,可选项,不建议用。需要系统开启sendmail服务,建议用第三独立监控服务,如用nagios全面监控代替。 
2、lvs_id:lvs负载均衡器标识,在一个网络内,它的值应该是唯一的。 
3、router_id:用户标识本节点的名称,通常为hostname 
4、花括号{}:用来分隔定义块,必须成对出现。如果写漏了,keepalived运行时不会得到预期的结果。由于定义块存在嵌套关系,因此很容易遗漏结尾处的花括号,这点需要特别注意。

VRRP实例定义块

vrrp_sync_group:同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪
group:至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致
vrrp_instance:vrrp实例名 
1> state:实例状态,只有MASTER 和 BACKUP两种状态,并且需要全部大写。抢占模式下,其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的服务会自动把它的状态由BACKUP切换到MASTER状态。当失效的MASTER所在的服务恢复时,BACKUP从MASTER恢复到BACKUP状态。 
2> interface:对外提供服务的网卡接口,即VIP绑定的网卡接口。如:eth0,eth1。当前主流的服务器都有2个或2个以上的接口(分别对应外网和内网),在选择网卡接口时,一定要核实清楚。 
3>mcast_src_ip:本机IP地址 
4>virtual_router_id:虚拟路由的ID号,每个节点设置必须一样,可选择IP最后一段使用,相同的 VRID 为一个组,他将决定多播的 MAC 地址。 
5> priority:节点优先级,取值范围0~254,MASTER要比BACKUP高 
6>advert_int:MASTER与BACKUP节点间同步检查的时间间隔,单位为秒 
7>lvs_sync_daemon_inteface:负载均衡器之间的监控接口,类似于 HA HeartBeat的心跳线。但它的机制优于 Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在 DR 模式中,lvs_sync_daemon_inteface与服务接口interface使用同一个网络接口 
8> authentication:验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用PASS类型,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTER与BACKUP使用相同的密码才能正常通信。 
9>smtp_alert:有故障时是否激活邮件通知 
10>nopreempt:禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。 
11>virtual_ipaddress:虚拟IP地址池,可以有多个IP,每个IP占一行,不需要指定子网掩码。注意:这个IP必须与我们的设定的vip保持一致。

在keepalived.conf配置文件中加入以下内容

1.notify_master“想要执行的脚本路径” #表示当切换到master状态时,要执行的脚本

2.notify_backup “想要执行的脚本路径”#表示当切换到backup状态时,要执行的脚本

3.notify_fault“想要执行的脚本路径”#表示切换出现故障时要执行的脚本
Keepalived配置区别Master节点配置Backup节点配置
route_id(唯一标识)router_id lb01router_id lb02
state(角色状态)state MASTERstate BACKUP
priority(竞选优先级)priority 150priority 100
10.0.0.310.0.0.4

3.启动keepalived

systemctl start keepalived
#查看VIP在哪台负载均衡上起作用
hostname -I
10.0.0.3 10.0.0.2 172.16.1.3

4.高可用keepalived的抢占式与非抢占式

1)抢占式
master节点出现故障,keepalived关闭,backup节点自动接管VIP,如果master修复则抢回VIP,VIP回到master节点
#在Master的keepalived中调用脚本,抢占式,仅需在master配置即可。
2)非抢占式
master节点出现故障,keepalived关闭,backup节点自动接管VIP,如果master修复,VIP任然在backup节点,当backup出现故障,master再将VIP切换
3)配置非抢占式
1、两个节点的state都必须配置为BACKUP
2、两个节点都必须加上配置 nopreempt
3、其中一个节点的优先级必须要高于另外一个节点的优先级。
两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级

Master配置
    vrrp_instance VI_1 {
        state BACKUP
        priority 150
        nopreempt
    }

Backup配置
    vrrp_instance VI_1 {
        state BACKUP
        priority 100
        nopreempt
    }

4.高可用keepalived的脑裂故障

由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。
1)产生脑裂的原因
1、服务器网线松动等网络故障
2、服务器硬件故障发生损坏现象而崩溃
3、主备都开启firewalld防火墙
2)模拟脑裂
#将节点1和节点2的防火墙都打开
[root@lb01 ~]# systemctl start firewalld
[root@lb02 ~]# systemctl start firewalld
3)检查是否脑裂办法
#如果发生脑裂,则随机kill掉一台即可
#在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了列脑
[root@lb02 ~]# cat check_split_brain.sh
#!/bin/sh
vip=10.0.0.2
lb01_ip=10.0.0.3
while true;do
	#在 lb02 主机ping lb01 主机
    ping -c 2 $lb01_ip &>/dev/null
    #如果能ping通,且,lb02 主机上有VIP
    if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
    	systemctl restart keepalived
        echo "发生了脑裂"
    else
        echo "哈哈没事"
    fi
sleep 5
done

keepalived 与 nginx

# keepalived 只是解决 nginx 单点故障问题,下面是非抢占式配置

1.在web服务器上写检测脚本

#lb01 lb02 2台主机都配置脚本
[root@lb01 ~]# vim check_web.sh
#!/bin/sh
nginxpid=$(ps -C nginx --no-header|wc -l)

#1.通过pid进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
if [ $nginxpid -eq 0 ];then
    systemctl start nginx
    sleep 3
    # 等待3秒后再次获取一次Nginx状态
    nginxpid=$(ps -C nginx --no-header|wc -l) 
    # 再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本  
    if [ $nginxpid -eq 0 ];then
        systemctl stop keepalived
   fi
fi

nginxport=$(netstat -lntp | grep nginx|wc -l)
#2.通过端口进行判断, 如Nginx还不存活则重启Keepalived,让地址进行漂移,并退出脚本  
if [ $nginxport -eq 0 ];then
    systemctl start nginx
    sleep 3
    # 等待3秒后再次获取一次Nginx状态
    nginxport=$(netstat -lntp | grep nginx|wc -l) 
    # 再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本  
    if [ $nginxpid -eq 0 ];then
        systemctl stop keepalived
   fi
fi

#给脚本增加执行权限
[root@lb01 ~]# chmod +x /root/check_web.sh

2.配置 keepalived 自动执行脚本

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {           
    router_id lb01
    script_user root
}

#每5秒执行一次脚本,脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
vrrp_script check_web {
    script "/root/check_web.sh"
    interval 5
    weight -1
}

vrrp_instance VI_1 {
    state BACKUP        
    interface eth0      
    virtual_router_id 50    
    priority 150        
    advert_int 1
    mcast_src_ip 10.0.0.3		#指定发送组播数据包的源IP地址
    nopreempt
    authentication {    
        auth_type PASS  
        auth_pass 1111  
    }
    virtual_ipaddress { 
        10.0.0.2    
    }
}

#调用并运行脚本
track_script {
    check_web
}

[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {           
    router_id lb02
    script_user root
}

#每5秒执行一次脚本,脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
vrrp_script check_web {
    script "/root/check_web.sh"
    interval 5
    weight -1
}

vrrp_instance VI_1 {
    state BACKUP        
    interface eth0      
    virtual_router_id 50    
    priority 100        
    advert_int 1
    mcast_src_ip 10.0.0.4		#指定发送组播数据包的源IP地址
    nopreempt
    authentication {    
        auth_type PASS  
        auth_pass 1111  
    }
    virtual_ipaddress { 
        10.0.0.2    
    }
}

#调用并运行脚本
track_script {
    check_web
}

注意

1、生产中建议配置非抢占式
2、nginx没启动的时候keepalived 启动不了

指定 keepalived 日志位置

vim /etc/sysconfig/keepalived 
KEEPALIVED_OPTIONS="-D -d -S 0"

vim /etc/rsyslog.conf
#最后添加
local0.*	/var/log/keepalived.log

#重启系统后就可以查看日志了
tail -f /var/log/keepalived.log

注意:
默认情况下,rsyslog是受selinux限制的 
所以日志只能输出到 /var/log/messages里,自定义的目录无效 
例如keepalived,haproxy的日志输出,都依赖于rsyslog 
因此我们要关闭selinux 

keepalived 开机启动不了

由于nginx还没有启动引起keepalived启动不了

解决方法:
vim /lib/systemd/system/keepalived.service
[Unit]
Description=LVS and VRRP High Availability Monitor
After=syslog.target network-online.target nginx.service
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值