Keepalived是一个基于LVS项目开发的开源软件,它提供了负载均衡和高可用性的功能。Keepalived通过使用虚拟路由冗余协议(VRRP)来实现高可用性,同时依赖于Linux内核中的IPVS模块来提供第四层负载均衡。
VRRP原理:
虚拟路由器冗余协议,是一种提供路由器冗余的协议,以确保网络中的主机在默认网关发生故障时能够无缝切换到备用路由器,从而保证网络的连续性和可靠性
虚拟路由器:VRRP通过将多台物理路由器虚拟化为一个路由器,对外表现为一个具有唯一固定IP地址和MAC地址的逻辑路由器。这个虚拟路由器由一个Master路由器和多个Backup路由器组成。角色选举:VRRP通过优先级选举机制确定哪台路由器担任Master角色。Master路由器负责数据包的转发和响应ARP请求。Backup路由器处于待命状态,一旦Master路由器出现故障,立即通过选举机制产生新的Master路由器。状态通告:Master路由器定期发送VRRP通告报文,以公布其配置信息和工作状态。Backup路由器通过接收这些报文来判断Master路由器的工作状态。故障切换:当Master路由器出现故障时,Backup路由器会根据优先级重新选举出新的Master路由器,并接管数据转发任务。这个过程对终端用户是透明的。负载均衡:在VRRP的负载均衡模式下,可以通过将一个虚拟IP地址与多个虚拟MAC地址对应,使得VRRP备份组中的每台路由器都能够转发流量,从而实现负载分担。
认证功能:为了提高安全性,VRRP提供了认证功能,包括无认证、简单字符认证和MD5认证。监视上行链路:VRRP可以监视上行链路的状态,当Master路由器的上行链路出现故障时,可以主动降低自己的优先级,触发新的Master选举。抢占机制:VRRP支持抢占机制,允许优先级更高的Backup路由器在Master路由器出现故障时迅速接管成为新的Master路由器。
Keepalived的一些关键特性和工作原理的讲解:
负载均衡:Keepalived可以配置为负载均衡器,使用IPVS模块在网络的第四层(传输层)上分发流量。它支持多种负载均衡算法,如轮询、加权轮询、最少连接等。
高可用性:Keepalived通过VRRP实现高可用性。VRRP允许多台服务器虚拟成一个路由器,这些服务器之间会选举出一个master节点来处理流量。如果master节点出现故障,备份节点会接管其IP地址和责任,确保服务不中断。
健康检查:Keepalived可以对后端服务器进行健康检查,确保流量只被分发到运行正常的服务器上。健康检查可以通过TCP、HTTP、UDP等协议来实现。
故障转移:当master节点出现故障时,Keepalived能够自动进行故障转移,将流量重定向到备份节点,这个过程对用户来说是透明的。
配置文件:Keepalived的配置文件通常位于/etc/keepalived/keepalived.conf,其中定义了全局参数、VRRP实例和虚拟服务器等。
邮件通知:Keepalived可以配置邮件通知,当发生故障转移或其他重要事件时,系统管理员会收到通知。
体系结构:Keepalived的体系结构包括用户空间和内核空间两部分。用户空间包括I/O复用调度器、内存管理、控制面板和核心组件(Checkers、VRRP Stack等),而内核空间包括IPVS和NETLINK模块。
个人理解:
Master节点正常:
当master节点宕机或收不到VRRP的数据包时:
Keepalived双节点实验高可用
准备两台虚拟机
192.168.128.140 | Master节点 | 主节点 |
192.168.128.141 | Backup节点 | 备份主机 |
1.解决依赖包
在两个节点下下载软件包:
[root@localhost ~]# yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel -y |
为后续下载nginx和keepalived铺路
2.安装nginx并启动
[root@localhost ~]# wget https://nginx.org/download/nginx-1.22.1.tar.gz |
解压nginx
[root@localhost ~]# tar -zxvf nginx-1.22.1.tar.gz -C /usr/local/src |
编译,安装(要提前解决依赖包的问题,不然在进行二进制编译时会发生报错)
[root@localhost nginx-1.22.1]# ./configure --prefix=/usr/local/nginx && make && make install |
(两个节点都下载安装nginx)
安装好后,为了在实验过程中实验效果明显,更改nginx的index.html文件中的欢迎界面
[root@localhost ~]# vi /usr/local/nginx/html/index.html |
关闭防火墙和selinux后,执行命令启动nginx
[root@localhost ~]# /usr/local/nginx/sbin/nginx |
启动成功后可进行浏览器访问是否启动成功;
3.下载并编辑keepalived配置文件
将yum源更新为阿里源后,下载keepalived
[root@localhost ~]# yum -y install keepalived |
(两个节点都下载安装)
安装完成后,编辑配置文件,keepalived的配置文件在/etc/keepalived/keepalived.conf
主节点: [root@localhost ~]# vi /etc/keepalived/keepalived.conf |
! Configuration File for keepalived global_defs { #全局变量 notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } #keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。 vrrp_script chk_nginx { #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务 script "/etc/keepalived/nginx_check.sh" #--一定要有检查 interval 1 #检测时间间隔 } vrrp_instance VI_1 { state MASTER #来决定主从 interface ens32 # 绑定 IP 的网卡口,根据自己的机器填写 virtual_router_id 120 # 虚拟路由的 ID 号, 两个节点设置必须一样 mcast_src_ip 192.168.128.140 #填写本机ip priority 100 # 节点优先级,主要比从节点优先级高 advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s authentication { auth_type PASS auth_pass 1111 } # 将 track_script 块加入 instance 配置块 track_script { chk_nginx #执行 Nginx 监控的服务 } virtual_ipaddress { 192.168.128.10/24 # 虚拟ip,通过虚拟Ip切换进行nginx主备切换功能 } } 从节点: [root@localhost ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived vrrp_script chk_nginx { ---指定健康检查脚本 script "/etc/keepalived/nginx_check.sh" #运行脚本,脚本内容下面有,就是起到一个nginx宕机以后,自动开启服务 interval 1 #检测时间间隔 weight -2 #如果条件成立的话,则权重 -2 } vrrp_instance VI_1 { state BACKUP #来决定主从 interface ens32 # 绑定 IP 的网卡名称,根据自己的机器填写 virtual_router_id 120 # 虚拟路由的 ID 号, 两个节点设置必须一样 mcast_src_ip 192.168.128.141 #填写本机ip priority 99 # 节点优先级,主要比从节点优先级高 advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s authentication { auth_type PASS auth_pass 1111 } # 将 track_script 块加入 instance 配置块 track_script { chk_nginx #执行 Nginx 监控的服务 } virtual_ipaddress { 192.168.128.10/24 # 虚拟ip } } |
在这个配置文件当中,必须要注意的是:由state决定谁是主谁是从,网卡名称需要修改,mcast_src_ip需要设置为两台机器自己的网卡ip,nginx_check.sh脚本文件的路径不要写错,主节点的优先级要比备份节点的优先级要高,两台机器的虚拟路由ID号必须一直,组播信息发送间隔两台机器必须一致,虚拟主机IP必须一致。
保存配置文件。
4.添加check脚本文件
Keepalived的check脚本文件是用于健康检查的脚本,它的作用是确保Keepalived监控的服务(如Web服务器、数据库等)是正常运行的。如果服务出现故障,Keepalived可以通过这些脚本检测到,并采取相应的措施,比如将流量从故障的服务转移到健康的服务上,或者通知管理员进行干预。
在/etc/keepalived/下创建nginx的健康脚本文件:
[root@localhost ~]# vi /etc/keepalived/nginx_check.sh |
在此我用了两种脚本文件:
(1)
#!/bin/bash A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx sleep 2 if [ $A -eq 0 ];then killall keepalived fi fi 该脚本文件的意思为:检查后台进程,当后台进程没有发现nginx的进程时,重启nginx,脚本暂停两秒,给nginx重启的时间,若重启失败,则关掉这台机器的keepalived服务。 |
(2)
#!/bin/bash d=$(date --date='today' +'%Y%m%d_%H:%M:%S') n=$(ps -C nginx --no-heading | wc -l) if [ "$n" -eq 0 ]; then systemctl stop keepalived fi 这个脚本做的很绝:当发现后台不存在nginx的进程时,直接关闭keepalived服务。 |
为了实验的效果,我们选取第二种脚本文件,在实际应用过程中,应该选取第一种脚本会比较保守和稳妥,不会造成资源的浪费。
在创建完监控脚本后,要给这个文件写的权限:
[root@localhost ~]# chmod 755 /etc/keepalived/nginx_check.sh |
5.启动keepalived
[root@localhost ~]# systemctl start keepalived |
两个节点启动keepalived服务后,在master节点查看ip,看虚拟ip是否生成
测试一
当master节点nginx宕机
由于我们的健康脚本设置的是当没发现nginx进程后,直接关闭keepalived服务,所以我们应该在关闭nginx服务前,在浏览器中访问虚拟ip会进入master节点的nginx网页,在我们关闭master节点的nginx后,主节点的keepalived服务被关闭,backup节点获得虚拟ip继续运行nginx网页,但,此时访问的网页为backup节点的网页。
(1)关闭nginx前查看网页:
此时网页还是master的网页。
(2)Master节点关闭nginx
[root@localhost ~]# pkill -9 -f nginx |
在关闭nginx后查看master节点的IP发现虚拟IP消失,此时的虚拟IP在backup节点
刷新浏览器查看网页,此时变更为backup节点了。
将master节点的nginx重启,再将keepalived服务启动(脚本关闭了)
重新查看IP地址可以发现,虚拟IP由回到了master节点上,这是由于我们在设置优先级的时候,我们master节点的优先级是高于backup的,所以当master节点恢复正常后,虚拟IP重新交还给master,而backup继续做冗余。
keepalived负载均衡集群搭建完成。