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地址)
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 |
高可用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