1. keepalived需要了解的知识
1.1 业务场景:
如果我们有个网站,最开始只有一台服务器对用户提供服务,业务架构图如下:
当业务量增大时,这台服务器支撑不了那么大的流量,随时会出现宕机的风险,于是优化为分布式架构,并使用了nginx做负载均衡:
有了分布式架构+负载均衡,你的业务可用性越来越强,能承受住很高的流量,但是题出现了:所有流量都打在nginx代理上,你的nginx容易出现性能瓶颈,突然有一天,你的nginx撑不了那么大的流量,出现了宕机故障,那么用户发起的所有请求都到不了你的后端web服务器上,于是又优化为nginx 做成分布式+ keepalived 的方式。
如果nginx master出现宕机,keepalived则会将服务切到nginx slave上,保证业务不受影响,这样就可以避免nginx单机故障,以此来实现高可用。
1.2 Keepalived的理解
Keepalived是linux下一个轻量级的高可用解决方案,可以实现服务或者网络的高可用。
Keepalived主要是通过虚拟路由冗余来实现高可用,功能没有HeartBeat那么强大,但Keepalived的部署和使用都非常简单,所有的配置只需要一个主配置文件即可完成。
Keepalived起初是为了LVS设计的,专门用来监控集群系统中各个服务节点的状态,如果某个服务器节点出现了故障,Keepalived将检测到后自动将节点从集群系统中剔除,而在故障节点恢复正常后,Keepalived又可以自动将此节点重新加入集群中,这些工作自动完成,不需要人工干预,需要人工完成的只是修复出现故障的节点。
后来又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有高可用集群功能。
健康检查和失败切换是keepalived的两大核心功能:
- 健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活
- 而失败切换主要是应用于配置了主备模式的服务器,利用VRRP协议维持主备服务器的心跳,当主服务器出现问题时,由备服务器承载对应的业务,从而在最大限度上减少损失,并提供服务的稳定性
1.3 vrrp协议
在现实的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)来完成的,而主机之间的路由器一旦出现故障,就会通信失败。因此在这种通信模式下,路由器就会有单点的瓶颈问题,为了解决这个问题,我们引入了vrrp协议(虚拟路由冗余协议)
Vrrp协议是一种容错的主备模式的协议,保证当主机的下一条路由出现故障时,由另一个路由器来代替出故障的路由器进行工作,通过vrrp可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信。
Vrrp可以将两台或多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务,而在虚拟路由器内部是多个物理路由器协同工作,vrrp角色如下:
- 虚拟路由器:VRRP组中所有的路由器,拥有虚拟的IP+MAC(00-00-5e-00-01-VRID)地址
- 主路由器(master):虚拟路由器内部通常只有一台物理路由器对外提供服务,主路由器是由选举算法产生,对外提供各种网络功能
- 备份路由器(backup):VRRP组中除主路由器之外的所有路由器,不对外提供任何服务,只接受主路由的通告,当主路由器挂掉之后,重新进行选举算法接替master路由器。
Master路由器由选举算法产生,它拥有对外服务的VIP,提供各种网络服务,如ARP请求、数据转发、ICMP等等,而backup路由器不拥有VIP,也不对外提供网络服务,当master发生故障时,backup将重新进行选举,产生一个新的master继续对外通过服务。
1.4 vrrp工作模式
三种状态:Initialize状态、Master状态、Backup状态
选举机制:抢占模式下,一旦有优先级高的路由器加入,立即成为Master,默认
非抢占模式下,只要Master不挂掉,优先级高的路由器只能等待
简单点说抢占模式就是,当master宕机后,backup 接管服务。
后续当master恢复后,vip漂移到master上,master重新接管服务,多了一次多余的vip切换,而在实际生产中是不需要这样。
实际生产中是,当原先的master恢复后,状态变为backup,不接管服务,这是非抢占模式。
下面重点说明4种情况:
- 两台都为master时,比如server1的优先级大于server2,keepalived启动后server1获得master,server2自动降级为backup。此时server1宕机的话,server2接替 服务,当server1恢复后,server1又变为master,重新接管服务,server2变为backup。属于抢占式。
- server1为master,server2位backup,且master优先级大于backup。keepalived启动后server1获得master,server2为backup。当server1宕机后, server2接管服务。当server1恢复后,server1重新接管服务变为master,而server2变为backup。属于抢占式
- server1为master,server2位backup,且master优先级低于backup。keepalived启动后server2获得master,server1为backup。当server2宕机后, server1接管服务。此时server2恢复后抢占服务,获得master,server1降级将为backup。属于抢占式
以上3种,只要级别高就会获取master,与state状态是无关的
- server1和server2都为backup。我们要注意启动server服务的启动顺序,先启动的升级为master,与优先级无关。且配置nopreempt项
- 比如server1获得master权限,server2为backup。此时server1宕机后,server2接管服务升级为master。当server1恢复后权限将为backup,不会争抢 server2的master权限,server2将会继续master权限。属于非抢占式
- 重点:第4种非抢占式俩节点state必须为bakcup,且必须配置nopreempt
注意:这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了
1.5 Keepalived核心组件
主要有watch dog、Checkers、VRRP Stack、IPVS wrapper、Netlink Reflector
watch dog:
一个极为简单又非常有效的检测工具,针对被监视目标设置一个计数器和阈值,watch dog会自己增加此计数值,然后等待被监视目标周期性的重置该数值,一旦被监控目标发生错误,就无法重置该数值,watch dog就会检测到。Keepalived是通过它来监控Checkers和VRRP进程
Checkers:
实现对服务器运行状态检测和故障隔离
VRRP Stack:
实现HA集群中失败切换功能,通过VRRP功能再结合LVS负载均衡软件即可部署一个高性能的负载均衡集群
IPVS wrapper:
实现IPVS功能,该模块可以将设置好的IPVS规则发送到内核空间并提交给IPVS模块,最终实现负载均衡功能
Netlink Reflector
实现VIP的设置和切换
- keepalived运行时,会启动3个进程:
- core:负责主进程的启动,维护和全局配置文件的加载
- check:负责健康检查
- vrrp:用来实现vrrp协议
2. keepalived安装
keepalived master:11.0.1.17
keepalived backup:11.0.1.16
下载安装包: wget https://keepalived.org/software/keepalived-2.2.7.tar.gz
安装依赖包:yum install -y gcc openssl-devel
解压安装包:tar -zxvf keepalived-2.2.7.tar.gz
指定安装keepalived的位置,进行编译:cd keepalived-2.2.7 && ./configure --prefix=/opt/keepalived
编译安装:make && make install
3.编辑keepalived的核心配置文件
vim /opt/keepalived/etc/keepalived/keepalived.conf
主从节点都需要在/opt/keepalived/etc/keepalived 目录下创建该文件,从节点需要修改router_id、priority、mcast_src_ip 配置项,其中 priority必须比主节点的值小,mcast_src_ip和router_id最好是从节点ip。
将keepalived生成系统服务:
mkdir -p /etc/keepalived
cp ~/keepalived-2.2.7/keepalived/etc/init.d/keepalived /etc/init.d/
cp /opt/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
cp ~/keepalived-2.2.7/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /opt/keepalived/sbin/keepalived /usr/sbin/
4.编写Nginx的重启脚本
mkdir -p /opt/script/keepalived
vim /opt/script/keepalived/check_nginx_pid_restart.sh
5.启动keepalived测试
systemctl daemon-reload
systemctl enable keepalived.service
systemctl start keepalived.service
systemctl status keepalived.spec
ip addr检查是否有VIP
在windows下ping VIP 也能ping通
6.安装nginx
下载安装包:wget https://nginx.org/download/nginx-1.26.1.tar.gz
解压安装包:tar -zxvf nginx-1.26.1.tar.gz
进入目录并生成编译配置:cd nginx-1.26.1 && ./configure --prefix=/opt/nginx
编译以及安装:make && make install
验证版本:/opt/nginx/sbin/nginx -V
修改keepalived master(11.0.1.17)节点的nginx配置文件以及index.htm文
修改keepalived master(11.0.1.16)节点的nginx配置文件以及index.htm文件
7.nginx高可用测试
我们直接用windows访问,此时应该是访问到的keepalived master(11.0.1.17)节点上的nginx
我们手动停止nginx,过3秒检查nginx服务是否启动
我们在模拟主节点keepalived服务宕机,检查从节点是否自动挂载VIP,在keepalived master(11.0.1.17)节点上操作
我们在去keepalived master(11.0.1.16)节点上查看IP
我们在windows上访问
也说明vip已经漂移到11.0.1.16上了