18@高可用keepalived

keepalived 高可用

一、什么是高可用

      高可用keepalived一般是指两台机器启动,有着完全相同的业务系统,当期中有一台机器down机了,另外一台机器(服务器)就能够快速的接管,维持正常状态进行,对于正在访问的用户是无感知的。

二、高可用keepalived(可以用什么)

1、硬件通常使用  **F5**
2、软件通常使用  **keepalived**

三、keepalived是怎么实现高可用的

   keepalived软件是基于VRRP协议来实现的,VRRP是虚拟路由冗余协议,主要用于解决单点故障问题
   

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ySR9ECEf-1620666487305)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1620660306316.png)]

#VRRP是如何诞生的,原理又是什么#举例说明
     比如公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了,怎么办?

通常做法是给路由器增加一台北街店,但是问题是,如果我们的主网关master故障了,用户是需要手动指向backup的,如果用户过多修改起来会非常麻烦。

 问题一:假设用户将指向都修改为backup路由器,那么master路由器修好了怎么办?
 问题二:假设Master网关故障,我们将backup网关配置为master网关的ip是否可以?

其实是不行的,因为PC第一次通过ARP广播寻找到Master网关的MAC地址与IP地址后,会将信息写到ARP的缓存表中,那么PC之后连接都是通过那个缓存表的信息去连接,然后进行数据包的转发,即使我们修改了IP但是Mac地址是唯一的,pc的数据包依然会发送给master。(除非是PC的ARP缓存表过期,再次发起ARP广播的时候才能获取新的backup对应的Mac地址与IP地址)
   
   如何才能做到出现故障自动转移,此时VRRP就出现了,我们的VRRP其实是通过软件或者硬件的形式在Master和Backup外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,PC仅会在ARP缓存表中记录VMAC与VIP的信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M3mFCVpk-1620666487308)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1620660354934.png)]

#高可用keepalived核心概念

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

四、keepalived 高可用环境配置

1.准备环境
主机IP身份
lb01172.15.1.5master
lb02172.15.1.6backup
keepaviled192.168.15.4VIP
2.配置nfs挂载点,nginx配置共享目录
#创建挂载点
[root@nfs ~]# vim /etc/exports
172.16.1.0/20(rw,sync,all_squash,anonuid=1000,anongid=1000) #配置文件位置

#挂载
[root@lb01 ~]# mount -t nfs 172.16.1.31:/nfs/keepalived /etc/nginx/conf.d/

# 重启nfs服务
[root@nfs nfs]# systemctl restart nfs-server rpcbind
3.安装高可用keepalived(lb01与lb02)
[root@lb01 ~]# yum install -y keepalived      
[root@lb02 ~]# yum install -y keepalived
4.配置nginx配置文件
# 编写NGINX配置文件
[root@lb02 ~]# cat /etc/nginx/conf.d/hzl.conf 
upstream http {
	server 172.16.1.7:8081;
	server 172.16.1.8:8082;
	server 172.16.1.9:8082;
}


server {
	listen 443 ssl;      #执行https进行访问
	server_name _;
	ssl_certificate /etc/nginx/cert/server.crt;                  #认证证书
	ssl_certificate_key /etc/nginx/cert/server.key;              #认证秘钥
	location / {
		proxy_pass http://hzl;                                   #代理链接池名称   
	}
}

server {
	listen 80;
	server_name 192.168.15.5;
	rewrite (.*) https://$server_name$request_uri;     #匹配所有格式
}



#配置文件检查,重启nginx
[root@lb02 ~]#nginx -t
[root@lb02 ~]# systemctl restart nginx

5.配置keepalived节点
#查看配置keepalived文件
[root@lb01 ~]# rpm -qc keepalived  
/etc/keepalived/keepalived.conf
/etc/sysconfig/keepalived



#配置主节点配置文件master
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {             #全局配置
   router_id lb01         #身份验证
}

vrrp_instance VI_1 {
    state MASTER		        #状态,只有MASTER和BACKUP,MASTER是主,BACKUP是备		
    interface eth0		        #网卡绑定,心跳检测
    virtual_router_id 51		#虚拟路由标识,组id,把master和backup判断为一组
    priority 100		        #优先级(真正判断是主是从的条件)(值越大优先级越高)
    advert_int 3                #检测状态间隔时间(单位是秒)
    # nopreempt		            #表示非抢占式
    authentication {		    #认证
        auth_type PASS		    #认证方式
        auth_pass 1314	        #认证密码指定
    }
    virtual_ipaddress {
        192.168.15.4            #虚拟的VIP地址
    }
}



#配置从节点配置文件backup

[root@lb02 ~]# vim /etc/keepalived/keepalived.conf 
global_defs {             #全局配置
   router_id lb02         #标识身份->名称
}
vrrp_instance VI_1 {
    state BACKUP		  #标识角色状态	
    interface eth0		  #网卡绑定接口
    virtual_router_id 51  #虚拟路由id	
    priority 50		      #优先级
    advert_int 3          #监测间隔时间
    # nopreempt		      
    authentication {      #认证
        auth_type PASS    #认证方式
        auth_pass 1314	  #认证密码
    }
    virtual_ipaddress {     
        192.168.15.4       #虚拟的VIP地址
    }
}



#域名解析(测试访问)
192.168.15.4 www.linux.lb.com
6.配置区别
KEEPALIVED配置区别MASTER主节点BACKUP从节点
router_id(路由唯一标识)lb01lb02
state(角色状态)masterbackup
priority(优先级设定)10050
7.启动keepalived
#启动时查看日志
[root@lb02 ~]# tail -f /var/log/messages
#先启动从
[root@lb02 ~]# systemctl start keepalived

#启动时查看日志
[root@lb01 ~]# tail -f /var/log/messages
#再启动主
[root@lb01 ~]# systemctl start keepalived
8.配置keepalived日志
一、修改 /etc/sysconfig/keepalived
把KEEPALIVED_OPTIONS="-D" 修改为KEEPALIVED_OPTIONS="-D -d -S 0"
#其中-S指定syslog的facility


二、重启keepalived服务
[root@lb01 ~]#service keepalived restart
[root@lb01 ~]#systemctl restart   keepalived



三、设置syslog,修改/etc/syslog.conf,添加内容如下
# keepalived -S 0
local0.*  /var/log/keepalived.log


注:local0是l是字符L的小写

五、高可用keepalived (抢占式与非抢占式)

1、节点启动
#当两个节点都启动时
#由于节点的优先级高于节点backup,所以VIP在节点master上面
[root@lb01 ~]# ip a | grep 192.168.15.4       #master接管(主节点)
    inet 192.168.15.4 scope global eth0
    
    
    
 #停止master主节点的keepalived
 [root@lb01 ~]# systemctl stop keepalived


#节点backup检测不到节点master的心跳,主动接管VIP
[root@lb02 ~]# ip a | grep 192.168.15.4       #backup接管(从节点)
    inet 192.168.15.4/24 scope global eth0
    
    
 #重新启动master主节点 
 [root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ip a | grep 192.168.15.4        #master接管,恢复之前状态
    inet 192.168.15.4/24 scope global eth0
    

2、配置非抢占式nopreempt
1.修改节点状态,两边状态都必须是**backup**
2.两个节点都要加上 **nopreempt**
3.优先级仍保持不同


#注节点配置master
lobal_defs {
   router_id lb01
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 3
     ***nopreempt***
    authentication {
        auth_type PASS
        auth_pass 1314
    }
    virtual_ipaddress {
        192.168.15.4
    }
}


#从节点配置backup
lobal_defs {
   router_id lb02
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 50
    advert_int 3
  ***nopreempt***
    authentication {
        auth_type PASS
        auth_pass 1314
    }
    virtual_ipaddress {
        192.168.15.4
    }
}


3、通过windows验证mac地址切换
#查看VIP在节master上面
[root@lb01 ~]# ip a | grep 192.168.15.4
    inet 192.168.15.4/24 scope global eth0
    

#windows查看mac地址
C:\Users\admin> arp -a



#将节点master的keepalived停止
[root@lb01 ~]# systemctl stop keepalived

#节点backup查看VIP
[root@lb02 ~]# ip a | grep 192.168.15.4
    inet 192.168.15.4/24 scope global eth0
    
#再次查看MAC地址
C:\Users\admin> arp -a

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KF5FeDKj-1620666487312)(C:\Users\86176\AppData\Roaming\Typora\typora-user-images\1620666393395.png)]

4、测试访问
#配置本地hosts
192.168.15.4 www.linux.lb.com

六、高可用keepalived(脑裂)

由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方是否存活,各自去调用资源,分配工作,而此时两台服务器都还活着并且在工作。

1、脑裂的故障
1.服务器网线松动,网络故障
2.服务器硬件发生损坏,硬件故障
3.主备服务器之间开启了防火墙
2.开启防火墙(两台)
[root@lb01 ~]# systemctl start firewalld
[root@lb02 ~]# systemctl start firewalld    
3、访问页面测试
#访问浏览器因为开启防火墙,所以访问不了站点,需要配置开启http服务
[root@lb02 ~]# firewall-cmd --add-service=http
[root@lb02 ~]# firewall-cmd --add-service=https
4、解决脑裂
#脑裂解决案列一:
#干掉一台服务
[root@lb02 ~]# systemctl stop keepalived

#检测(判断是否有脑裂现象)
#先做信任,免密登录
[root@lb01 ~]# ssh-keygen               #生成秘钥
[root@lb01 ~]# sh-copy-id 172.16.1.6
#编写脚本
[root@lb01 ~]# vim check_naolie.sh
#!/bin/sh
vip=192.168.15.4
lb02_ip=172.16.1.6
while true;do
    ssh $lb02_ip 'ip a | grep 192.168.15.4' &>/dev/null
    if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
        echo "ha is split brain.warning."
    else
        echo "ha is ok"
    fi
sleep 3
done

#脚本添加执行权限
[root@lb01 ~]# chmod +x check_naolie.sh





#脑裂解决案列二:
#开启防火墙
[root@lb01 ~]# systemctl start firewalld
[root@lb02 ~]# systemctl start firewalld

# 当主节点和从节点都提供服务的时候(脚本探测)
# 做免密
[root@lb01 ~]# ssh-keygen            #生成秘钥
[root@lb01 ~]# sh-copy-id 172.16.1.6
[root@lb02 ~]# sh-copy-id 172.16.1.5
#脚本编写
[root@lb02 ~]# vim check_naolie.sh 
#!/bin/bash

VIP="192.168.15.4"
MASTERIP="172.16.1.6"
BACKUPIP="172.16.1.5"

while true; do       #循环脚本
    # 探测VIP
    PROBE='ip a | grep "${VIP}"'
    ssh ${MASTERIP}  "${PROBE}" > /dev/null
    MASTER_STATU=$?
    ssh ${BACKUPIP}  "${PROBE}" > /dev/null
    BACKUP_STATU=$?
    if [[ $MASTER_STATU -eq 0 && $BACKUP_STATU -eq 0 ]];then
        ssh ${BACKUPIP}  "systemctl stop keepalived.service"
    fi
    sleep 3
done


#脚本添加执行权限
[root@lb01 ~]# chmod +x check_naolie.sh




#引用补充:
-eq		等于
-ne		不等于
-ge		大于等于
-gt		大于
-le		小于等于
-lt		小于

七、高可用keepalived和nginx

1.域名解析到VIP
1.nginx默认监听所有IP
2.nginx故障切换脚本
#如果nginx宕机,用户请求页面会失败,但是keepalive没有关闭,VIP仍然在nginx挂掉了的机器上,导致影响业务;
#我们应该编写一个脚本,判断nginx状态,如果nginx挂掉,先尝试重启nginx,如果启动不了则关掉keepalived


# nginx检测脚本一
[root@lb01 ~]# vim /etc/keepalived/check_web.sh 
#!/bin/bash
ps -ef | grep [n]ginx &>/dev/null

if [ $? -eq 1 ];then
    systemctl start nginx &>/dev/null
    sleep 3
    ps -ef | grep [n]ginx &>/dev/null
    if [ $? -eq 1 ];then
        systemctl stop keepalived
    fi
fi


#脚本优化:
[root@lb01 ~]# vim /etc/keepalived/check_web.sh


#!/bin/sh
nginxpid=$(ps -C nginx --no-header|wc -l)

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


[root@lb01 keepalived]# chmod +x check_web.sh






# nginx检测脚本二
[root@lb01 ~]# vim   /etc/keepalived/check_web.sh 
#!/bin/bash

nginxnum=`ps -ef | grep [n]ginx | wc -l`

if [ $nginxnum -eq 0 ];then       
  systemctl start nginx
  sleep 3
  nginxnum=`ps -ef | grep [n]ginx | wc -l`

  if [ $nginxnum -eq 0 ];then
    systemctl stop keepalived.service
  fi
fi



#脚本添加权限
[root@lb01 keepalived]# chmod +x check_web.sh

3.调用脚本
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf 
global_defs {
   router_id lb01
}

#每5秒执行一次脚本,脚本执行完成时间不能超过5秒,否则会重新执行脚本,死循环
vrrp_script check_web {
    script "/etc/keepalived/check_web.sh"
    interval 5
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1314
    }
    virtual_ipaddress {
        192.168.15.4
    }

    #调用计划脚本
	track_script {
    	check_web
	}
}



#给脚本添加权限
[root@lb01 keepalived]# chmod +x check_web.sh

#使用测试访问
192.168.15.4 www.linux.lb.com
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值