LVS+Keepalived 高可用负载均衡群集

191 阅读6分钟

Keepalived

专为LVS和HA设计的一款健康检查工具
支持故障自动切换(Failover)
支持节点健康状态检查(Health Checking)
●判断LVS负载均衡调度器,节点服务器的可用性,当master主机出现故障及时切换到backup节点保证业务正常,当master故障主机恢复后将其重新加入群集并且业务重新切换回master节点。

Keepalived是用C语言编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础结构提供负载均衡高可用性的简单而强大的功能。
负载平衡框架依赖于提供第4层负载平衡的著名且广泛使用的Linux虚拟服务器(IPVS)内核模块。Keepalived实现了一组VIP功能,以根据其运行状况动态,自适应地维护和管理负载平衡的服务器池。
VRRP实现了高可用性 协议,VRRP是路由器故障转移的基础。
Keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,可以利用其来避免 IP 单点故障,一般与其它负载均衡技术(如 LVS 、HAProxy 、Nginx)一起工作来达到集群的高可用。

Snipaste_2022-10-16_20-12-53.png keepalived原理介绍

VRRP (Virtual Router Redundancy Protocol,虚拟路由器冗余协议) : 在现实的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)完成的, 而主机之间的路由器一旦出现故障,通信就会失败,
因此,在这种通信模式中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了 VRRP 协议。
VRRP 可以将两台或多台物理路由器设备虚拟成一个虚拟路由器,每个虚拟路由器都有一个唯一标识,称为 VRID,一个 VRID 与一组 IP 地址构成了一个虚拟路由器。
这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务。而在虚拟路由器内部,同一时间只有一台物理路由器对外提供服务,这台物理路由器被称为主路由器(处于 MASTER 角色)。
而其他物理路由器不拥有对外的虚拟 IP,也不提供对外网络功能,仅仅接收 MASTER 的 VRRP 状态通告信息,这些路由器被统称为备份路由器(处于 BACKUP 角色)。
当主路由器失效时,处于 BACKUP 角色的备份路由器将重新进行选举,产生一个新的主路由器进入 MASTER 角色继续提供对外服务,整个切换过程对用户来说完全透明。

keepalive使用场景

  • LVS和keepalived可以说是天然的集成, 因为LVS已经集成到linux内核系统中,LVS+keepalived的集成,,只需要在keepalived的配置文件中增加配置就可以;
  • keepalive提供了主从切换的功能, 主从之间有心跳检测, 如果发现主从挂掉, keepalived会自动进行主从的切换;
  • 单体架构中, 我们最常使用lvs+keepalived的功能。

 

keepalive运行原理

keepalived 通过选举(看服务器设置的权重)挑选出一台热备服务器做 MASTER 机器,MASTER 机器会被分配到一个指定的虚拟 ip,即VIP,外部程序可通过该 VIP 访问这台服务器。 如果这台服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等),keepalived 会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做 MASTER 并分配同样的虚拟 IP,充当前一台 MASTER 的角色。 权重越高,备用机器被拉起来的占比就越大,一般的主备就可以满足我们的需求。

  • 主服务器作用:转发数据;发送报文告诉备服务器自己在线。
  • 备服务器作用:监听主服务器发来的数据;收不到消息的时候就接替主服务器。

Keepalived体系主要模块

keepalived体系架构中主要有三个模块,分别是core、check和vrrp。

  • core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。

  • vrrp模块:是来实现VRRP协议的。

  • check模块:负责健康检查,常见的方式有端口检查及URL检查。

搭建部署LVS-Keepalived负载均衡

部署2台web服务器

systemctl stop firewalld.service
setenforce 0

yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs

1. 配置keeplived(主、备DR 服务器上都要设置)
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
......
global_defs {						#定义全局参数
--10行--修改,邮件服务指向本地
	smtp_server 127.0.0.1
--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
	router_id LVS_01
--14行--注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接
	#vrrp_strict
}

vrrp_instance VI_1 {				#定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUP
    state MASTER
--21行--修改,指定承载vip地址的物理接口
    interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致	
    virtual_router_id 10
	#nopreempt		#如果设置非抢占模式,两个节点state必须为BACKUP,并加上配置 nopreempt
--23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
    priority 100
    advert_int 1					#通告间隔秒数(心跳频率)
    authentication {				#定义认证信息,每个热备组保持一致
		auth_type PASS				#认证类型
--27行--修改,指定验证密码,主备服务器保持一致
        auth_pass abc123
    }
    virtual_ipaddress {				#指定群集vip地址
        192.168.142.111
    }
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.142.111 80 {
    delay_loop 6					#健康检查的间隔时间(秒)
    lb_algo rr						#指定调度算法,轮询(rr)
--39行--修改,指定群集工作模式,直接路由(DR)
    lb_kind DR
    persistence_timeout 0			#连接保持时间(秒)
    protocol TCP					#应用服务采用的是 TCP协议
--43行--修改,指定第一个Web节点的地址、端口
    real_server 192.168.142.30 80 {
        weight 1					#节点的权重
--45行--删除,添加以下健康检查方式		
        TCP_CHECK {
			connect_port 80			#添加检查的目标端口
			connect_timeout 3		#添加连接超时(秒)
			nb_get_retry 3			#添加重试次数
			delay_before_retry 3	#添加重试间隔
		}
	}

	real_server 192.168.142.40 80 {		#添加第二个 Web节点的地址、端口
        weight 1
        TCP_CHECK {
			connect_port 80
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 3
		}
	}
##删除后面多余的配置##
}

systemctl start keepalived
ip addr						#查看虚拟网卡vip

2. 启动 ipvsadm 服务
#设置主服务器192.168.142.10的ipvsadm策略
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm

ipvsadm -ln
#如没有VIP 的分发策略,则重启 keepalived 服务,systemctl restart keepalived

#设置备服务器192.168.142.20的ipvsadm策略
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln

3. 调整 proc 响应参数,关闭Linux 内核的重定向参数响应
vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

sysctl -p

配置节点服务器

systemctl stop firewalld
setenforce 0

yum -y install httpd
systemctl start httpd

#配置web1服务器192.168.142.30
echo 'this is abc web!' > /var/www/html/index.html

#配置web2服务器192.168.142.40
echo 'this is cba web!' > /var/www/html/index.html

vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.142.111
NETMASK=255.255.255.255

service network restart 或 systemctl restart network
ifup lo:0
ifconfig lo:0
route add -host 192.168.142.111 dev lo:0

vim /etc/sysctl.conf

net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

sysctl -p

测试验证

image.png