keepalived

小结

高可用:
	一般是指2台机器启动着'完全相同'的业务系统,当有一台机器down机了,另外一台服务器就能快速的接管,对于访问的用户是无感知的。
	硬件:F5
	软件:keepalived(VRRP协议)(Virtual Router Redundancy Protocol),vrrp协议即虚拟路由冗余协议,主要用于解决集群单点故障,只适用于企业机房
VRRP协议实现了故障自动转移,VRRP其实是通过软件或者硬件的形式在Master和Backup外面'增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP)',那么在这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,'PC仅会在ARP缓存表中记录VMAC与VIP的信息'。	

Keepalived
	是一个免费开源的,用C编写的类似于layer3,主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能
	负载均衡实现'需要依赖'Linux的虚拟服务内核模块(ipvs),而'高可用是通过VRRP协议'实现多台机器之间的故障转移服务。
任何服务的高可用都可以使用keepalived来做,但是keepalived存在脑裂问题,而且一般每个服务都有自己的高可用的方式,所以,keepalived一般只做七层负载均衡的高可用,不支持高可用的服务,才使用keepalived
相同的虚拟路由ip等,'某一服务相同的配置',keepalived才有意义

keepalived解决了一个域名绑定在多个公网ip上,第二,实现了自动切换

静态资源放到文件服务器里面(cdn,web,nfs),图片动图文章视频音乐
静态页不等于静态资源

sersync怎么监控多个目录(不能监控多个目录,但是可以将多个目录放到一个目录下)

mysql的主从复制

一台服务器可以认为是一个节点

客户端浏览器的缓存会记录服务器(代理机)的ip和Mac地址(通过arp -a 可以查看)
arp -a 查看arp缓存表(ip与Mac地址映射)(存在生存时间)

#防火墙相关命令
firewalld-cmd --list-all
firewalld-cmd --add-serveice=http
firewalld-cmd --add-port=8080

#mha可以做数据库的高可用

企业中虚拟ip'是也必须是一个公网ip',因为只有公网ip才能被用户直接访问

如果lb是物理机,可以使用keepalived做负载均衡的高可用
如果lb是云主机(阿里云),不可以使用keepalived做负载均衡的高可用,因为阿里云禁用了vrrp协议,只能用阿里云自己做的相关服务

很多服务都有自己的高可用,除了nfs没有,云服务器不用nfs做共享存储

#虚拟的VIP地址,(节点设置必须相同,是公网ip),可以设置多个virtual_ipaddress,每个大括号一个,
那vip是公网ip,两个负载的eth0网卡也都需要公网ip

用户--3,4--路由器(网关)(wifi)-->网卡-->数据

路由器上也有全球唯一的mac地址

修改虚拟机分配内存的大小,可以增加虚拟集群的虚拟机数量

系统只认识uid gid,系统通过uid gid判断不同用户用户组

'虚拟ip'可以理解为keepalived服务器优先级高的 生成的ip,随所生成服务器的存在而存在
ARP是'地址解析协议'的简称,与ARP对应的是RARP,'RARP是反向地址解析协议的简称'。
C:\Users\Administrator>arp -a #自动在缓存中,读取IP地址和mac地址的对应关系表;
接口: 10.0.0.1 --- 0xd
  Internet 地址         物理地址              类型
  10.0.0.5              00-0c-29-45-6a-b7     动态
  10.0.0.6              00-0c-29-8d-16-b0     动态

arp -d  	#删除所有ARP记录

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

其实是不行的,因为'PC第一次通过ARP广播寻址'找到Master网关的MAC地址与IP地址后,会将信息写到'ARP的缓存表'中,那么'PC之后连接都是通过那个缓存表的信息去连接',然后进行数据包的转发,即使我们修改了IP但是Mac地址是唯一的,pc的数据包依然会发送给master。(除非是PC的ARP缓存表过期,再次发起ARP广播的时候才能获取新的backup对应的Mac地址与IP地址)

QQ截图20200605155814.png

img

keepalived官网

Keepalived高可用安装配置

keepalived可以做任何服务的高可用,使用ip addr可以查看虚拟ip,通过后端服务器的状态可以验证VIP是否可用


环境准备

作用 IP 角色
lb01 10.0.0.5 Master
lb02 10.0.0.6 Backup
VIP 10.0.0.3(随时被抢占)

关闭iptables和selinux

sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
systemctl enable firewalld

#实际上开着防火墙也可以,不过要开启某些端口(80 443)

安装keepalived,启动Master和Backup节点的keepalived

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

[root@lb01 ~]# systemctl start keepalived.service
[root@lb02 ~]# systemctl start keepalived.service

[root@lb01 ~]# systemctl enable keepalived.service 
[root@lb02 ~]# systemctl enable keepalived.service

#keepalived不能使用restart管理(???)

配置master

#找到配置文件
[root@lb01 ~]# rpm -qc keepalived
/etc/keepalived/keepalived.conf		#配置文件
/etc/sysconfig/keepalived		#keepalived的选项
[root@lb01 ~]# rpm -ql keepalived 
/usr/bin/genhash
[root@lb02 ~]# ps -ef|grep [k]ee
root       2154      1  0 03:28 ?        00:00:00 /usr/sbin/keepalived -D
root       2155   2154  0 03:28 ?        00:00:00 /usr/sbin/keepalived -D
[root@lb02 ~]# netstat -lntup	#keepalived提供服务不需要使用端口

#编辑配置文件
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {                   #全局配置
    router_id lb01              #标识身份->名称(随意写)
}

vrrp_instance VI_1 {		  #标识身份->名称(随意)
    state MASTER                #标识角色状态(随意)
    interface eth0              #网卡绑定接口(错绑后修改后需要重启服务器生效)
    virtual_router_id 50        #虚拟路由id(1-254),多个节点的设置必须一样(注释),不同高可用的keepaliced virtual_router_id不能相同
    priority 150                #优先级(主高备低)(修改后,重启服务器才能生效)
    advert_int 1                #监测间隔时间(不同的节点设置必须相同)(检测同一路由id的keepalived,检测nginx是否存活)
    authentication {            #认证(节点设置必须相同)
        auth_type PASS          #认证方式(相同节点的话,相同)
        auth_pass 1111          #认证密码
    }
    virtual_ipaddress {         
        10.0.0.3                #虚拟的VIP地址,(节点设置必须相同,最好是公网ip),可多设,每行一个,vip必须是公网ip,两个负载的eth0网卡也必须是公网ip
    }
}

配置backup

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

vrrp_instance VI_1 {
    state BACKUP        
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}

#开启过防火墙,再永久关闭,并不能真正的关闭,重启之后才生效
#VIP想要漂移,必须关闭keepalived

对比master与Backup的keepalived配置区别

Keepalived配置区别 Master节点配置 Backup节点配置
route_id(唯一标识) router_id lb01 router_id lb02
state(角色状态) state MASTER state BACKUP
priority(竞选优先级) priority 150 priority 100

tDDH4H.md.png

高可用keepalived抢占式与非抢占式


配置抢占式

所谓的抢占式,就是只要优先级高,那就把VIP抢过来

两个节点都启动

#由于节点1的优先级高于节点2,所以VIP在节点1上面
[root@lb01 ~]# ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global eth0

关闭节点1的keepalived(VIP想要漂移必须关闭keepalived),VIP的漂移只与keepalived的状态有关,所以要把指定的服务的启动和停止与keepalived的启动和停止绑定到一起,keepalived可以做任何服务的高可用,因为他可以通过脚本与任何服务关联

[root@lb01 ~]# systemctl stop keepalived

#节点2联系不上节点1,主动接管VIP
[root@lb02 ~]# ip addr | grep 10.0.0.3
inet 10.0.0.3/32 scope global eth0

此时重新启动Master上的keepalived,会发现VIP被强行抢占

[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ip addr | grep 10.0.0.3
    inet 10.0.0.3/32 scope global eth0

配置非抢占式(优先级高不会抢占优先级低的VIP)

所谓的非抢占式就是,不比较优先级,不会因为优先级的高低而发生VIP的漂移

只看相同路由id不同节点的服务器是否还活着,如果他死了,才会把VIP抢过来

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
    }
    --------------------------------------或者(直接加一个nopreempt)
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
    router_id lb02
}

vrrp_instance VI_1 {
    state BACKUP        
    interface eth0
    virtual_router_id 50
    priority 100
    advert_int 1
    nopreempt
    
    authentication {    
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3
    }
}    
    

通过windows的arp去验证,是否会切换MAC地址

#查看VIP在节点1上面
[root@lb01 ~]# ip addr | grep 10.0.0.3
    inet 10.0.0.3/32 scope global eth0

#windows查看Mac地址
C:\Users\Administrator> arp -a
#将节点1的keepalived停掉
[root@lb01 ~]# systemctl stop keepalived

#节点2接管VIP
[root@lb02 ~]# ip addr | grep 10.0.0.3
    inet 10.0.0.3/32 scope global eth0

#再次查看mac地址(Mac地址不会改变,但是实现了故障转移)
C:\Users\Administrator> arp -a

高可用keepalived故障脑裂

由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳,个字去的资源及服务的所有权,而此时的两台高可用服务器又都还活着。


脑裂故障原因

1、服务器网线松动等网络故障
2、服务器硬件故障发生损坏现象而崩溃
3、主备都开启firewalld防火墙(主备都是虚拟vip,ip地址冲突,无法上外网)

解决脑裂故障方案

#如果发生闹裂,则随机kill掉一台即可
#在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了列脑

#lb02部署脚本如下
[root@lb02 ~]# cat check_split_brain.sh
#!/bin/sh
vip=10.0.0.3
lb_ip=10.0.0.5
while true;do
    ping -c 2 $lb01_ip &>/dev/null
    if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
        pkill keepalived
    else
        echo "没有脑裂现象"
    fi
sleep 5
done

高可用---keepalived与nginx

Nginx默认监听在所有的IP地址上,VIP会飘到一台节点上,相当于那台nginx多了VIP这么一个网卡,所以可以访问到nginx所在机器

但是.....如果nginx宕机,会导致用户请求失败,但是keepalived没有挂掉不会进行切换,所以需要编写一个脚本检测Nginx的存活状态(绑定nginx和keepalived),如果不存活则kill掉keepalived

[root@lb01 ~]# vim check.sh
#!/bin/bash
nginx=$(ps -C nginx --no-header|wc -l)

#1.判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $nginx -eq 0 ];then
    systemctl start nginx
    sleep 3
    #2.等待3秒后再次获取一次Nginx状态
    nginx=$(ps -C nginx --no-header|wc -l) 
    #3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本  
    if [ $nginx -eq 0 ];then
        systemctl stop keepalived
        echo nginx停止服务
   fi
fi
#给脚本增加执行权限(一定要做)
[root@lb01 ~]# chmod +x /tmp/check.sh

这个脚本的作用就是把nginx的状态和keepalived的状态绑定,当keepalived被stop,那么请求将不会被分配到这个节点

在lb01主机的keepalived配置文件中调用此脚本

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

#脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
vrrp_script check {
    script "/tmp/check.sh"
    interval 5
}

vrrp_instance VI_1 {
    state MASTER        
    interface eth0      
    virtual_router_id 50    
    priority 150        
    advert_int 1        
    authentication {    
        auth_type PASS  
        auth_pass 1111  
    }
    virtual_ipaddress { 
        10.0.0.3    
    }
    
	#调用并运行脚本
	track_script {
    	check
	}
}

#在Master的keepalived中调用脚本,抢占式,仅需在'master'配置即可(主从是相对来说的,可以把脚本都部署在所有节点)。(注意,如果配置为非抢占式,那么需要两台服务器都使用该脚本)
#keepalived本身具有wheel循环的特性,所以只需要指定脚本,就可以循环执行

实时监测网站状态

[root@db01 ~]# vim a.sh 
#!/bin/bash

while true ;do
        code_status=$(curl -I -m 10 -o /dev/null -s -w %{http_code} http://cs.wp.com)
        if [ $code_status -eq 200 ];then
                echo $(date +%F-%T)_网站正常 >> /tmp/check
        else
                echo $(date +%F-%T)_网站挂了 >> /tmp/check
        fi
        sleep 1
done

posted @ 2020-06-06 07:20  看萝卜在飘  阅读(438)  评论(0编辑  收藏  举报