Keepalived高可用+LVS

keepalived 是一个用于实现高可用性(High Availability, HA)的开源软件,主要用于在 Linux 系统中实现服务的故障转移和负载均衡。它通过在多个服务器之间共享虚拟 IP(VIP)地址和状态信息,确保在某个节点发生故障时,服务可以快速切换到另一个节点。

以下是 keepalived 的主要优势和功能:

  • 故障转移: keepalived 允许多台服务器协同工作,共享同一个虚拟 IP 地址。如果其中一台服务器出现故障,keepalived 可以自动将虚拟 IP 地址转移到正常工作的节点,从而确保服务的可用性。

  • 负载均衡: 除了故障转移之外,keepalived 还可以用于负载均衡。它可以根据服务器的性能和负载情况动态地将请求分发到不同的节点,以避免某个节点过载,提高整体性能。

  • 健康检查: keepalived 可以定期检查服务器的健康状况。如果某个节点未能响应或处于不健康状态,keepalived 将采取措施将虚拟 IP 转移到其他正常的节点。
    简化配置: keepalived 提供了一个相对简单的配置文件,使得用户可以轻松地配置虚拟 IP、优先级、健康检查等参数。配置文件采用类似于 iptables 风格的语法,易于理解和修改。

  • 支持 VRRP 协议: keepalived 使用虚拟路由冗余协议(Virtual Router Redundancy Protocol, VRRP)来实现故障转移。VRRP 允许多个节点合作以提供共享的虚拟 IP 地址,其中一个节点被选为主节点,负责响应流量。

  • 开源和免费: keepalived 是开源软件,可以免费使用。这使得它成为许多组织和项目中实现高可用性解决方案的选择。


keepalived专业术语

  • 在 keepalived 和类似高可用性方案的上下文中,有一些专业术语被广泛使用。以下是一些与 keepalived 相关的专业术语:

  • VRRP(Virtual Router Redundancy Protocol): 虚拟路由器冗余协议,是一种用于实现路由器冗余的协议。keepalived 使用 VRRP 来协调多个节点之间的虚拟 IP 地址的状态和切换。

  • VIP(Virtual IP): 虚拟 IP 地址,是在 keepalived 中共享的 IP 地址。在多个节点之间,只有当前主节点拥有 VIP,其他节点在主节点发生故障时可能接管这个 VIP。

  • VRRP Instance: VRRP 实例,表示一组配置共享相同 VRRP 虚拟 IP 的节点。每个 VRRP 实例有一个唯一的标识符(通常是数字),用于区分不同的实例。

  • Priority: 优先级,是用来确定哪个节点将成为 VRRP 实例的主节点的参数。拥有较高优先级的节点将成为主节点,负责处理流量。

  • Preemption: 抢占,是一个设置,用于确定当主节点重新上线时是否要重新抢占 VIP。如果启用了抢占,主节点恢复后将尝试重新获得 VIP。

  • Advertisement Interval: 广告间隔,是主节点发送 VRRP 通告的时间间隔。通告包含当前节点的状态和优先级信息。

  • Authentication: 认证,是通过密码(或密钥)确保节点之间安全通信的机制。只有知道正确密码的节点才能成为 VRRP 实例的一部分。

  • Unicast/ Multicast: VRRP 通告可以通过单播(Unicast)或组播(Multicast)方式进行传播。这决定了通告是直接发送到指定节点还是通过组播地址发送给网络上的所有节点。

  • Floating IP: 浮动 IP,是指与 VRRP VIP 相关联的 IP 地址。这个 IP 地址可以在节点之间“浮动”,即在主节点切换时从一个节点转移到另一个节点。

  • 这些术语在 keepalived 的文档和相关的高可用性文献中经常出现,理解它们有助于更好地配置和理解 keepalived 的工作原理。

VS:Virtual Server            #虚拟服务

Director, Balancer            #负载均衡器、分发器

RS:Real Server                #后端请求处理服务器 

CIP: Client IP                 #用户端IP

VIP:Director Virtual IP       #负载均衡器虚拟IP

DIP:Director IP               #负载均衡器IP

RIP:Real Server IP            #后端请求处理服务器IP

LVS

核心模块

LVS的管理工具和内核模块 ipvsadm/ipvs

ipvsadm:用户空间的命令行工具,用于管理集群服务及集群服务上的RS等;

ipvs:工作于内核上的程序,可根据用户定义的集群实现请求转发;

LVS负载均衡工作模式


LVS/NAT:网络地址转换模式,进站/出站的数据流量经过分发器(IP负载均衡,他修改的是IP地址)  --利用三层功能
LVS/DR  :直接路由模式,只有进站的数据流量经过分发器(数据链路层负载均衡,因为他修改的是目的mac地址)--利用二层功能mac地址
LVS/TUN: 隧道模式,只有进站的数据流量经过分发器

FULL-NAT模式

NAT模式

NAT 模式(Network Address Translation): 在这种模式下,负载均衡器通过修改传入请求的目标 IP 地址和端口,将其转发给后端服务器。后端服务器返回的响应经过负载均衡器,负载均衡器再将其发送给客户端。这样,负载均衡器对外隐藏了后端服务器的真实 IP 地址。

优势:简单易用,适用于不需要直接与后端服务器通信的场景。
缺点:对于大量并发连接,可能会成为性能瓶颈。

路由模式

直接路由模式(Direct Routing): 在这种模式下,负载均衡器将请求直接转发给后端服务器,不修改目标 IP 地址。后端服务器收到请求后,直接将响应返回给客户端。负载均衡器通过 ARP 协议来劫持后端服务器的 IP 地址。

优势:性能较高,因为负载均衡器不需要修改 IP 地址。
缺点:负载均衡器和后端服务器必须在同一子网中,因为 ARP 劫持需要在同一广播域内工作。

TUN转发模式

IP 转发模式(IP Tunneling): 在这种模式下,负载均衡器通过创建一个虚拟隧道(Tunnel)将请求和响应转发给后端服务器。负载均衡器对外使用 VIP,而后端服务器使用真实 IP 地址。

优势:可以跨越不同的子网,适用于更复杂的网络拓扑。
缺点:相对于其他模式,可能引入一些额外的网络开销。
在 LVS 中,这些工作模式可以选择不同的调度算法,例如轮询(Round Robin)、加权轮询(Weighted Round Robin)、最小连接数(Least Connections)、加权最小连接数(Weighted Least Connections)等,以确定将请求分发给哪个后端服务器。

lVS的部署

安装软件

yum -y install ipvsadm

命令参数

-A --add-service #在服务器列表中新添加一条新的虚拟服务器记录
-a --add-server  #在服务器表中添加一条新的真实主机记录
-t --tcp-service #说明虚拟服务器提供tcp服务
-u --udp-service #说明虚拟服务器提供udp服务
-r --real-server #真实服务器地址
-m --masquerading #指定LVS工作模式为NAT模式
-w --weight #真实服务器的权值
-g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
-s --scheduler #使用的调度算法,默认调度算法是 wlc

算法

固定调度算法:rr,wrr,dh,sh
动态调度算法:wlc,lc,sed,nq,lblc,lblcr
固定调度算法:即调度器不会去判断后端服务器的繁忙与否,一如既往得将请求派发下去。
动态调度算法:调度器会去判断后端服务器的繁忙程度,然后依据调度算法动态得派发请求。

部署前准备

-C -clear #清除内核虚拟服务器表中的所有记录。
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
-d -delete-server #删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l –list #显示内核虚拟服务器表
--numeric, -n:#以数字形式输出地址和端口号

LVS准备

程序包:ipvsadm(LVS管理工具)

主程序:/usr/sbin/ipvsadm

规则保存工具:/usr/sbin/ipvsadm-save  > /path/to/file

配置文件:/etc/sysconfig/ipvsadm-config

解析主机

192.168.246.166 lvs-server
192.168.246.161 real-server1
192.168.246.162 real-server2

设置vip

ip addr add dev ens33 192.168.246.160/32

开启

service ipvsadm start

保存

ipvsadm --save > /etc/sysconfig/ipvsadm

LVS分发策略

-A:添加VIP
-t:用的是tcp协议
-a:添加的是lo的vip地址
-r:转发到real-serve rip
-s:算法
-L|-l –list #显示内核虚拟服务器表
--numeric, -n:#以数字形式输出地址和端口号
-g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
rr:轮循
如果添加ip错了,删除命令如下:
# ip addr del 192.168.246.193 dev ens33

开始设置

ipvsadm -C 清除规则
ipvsadm -A -t 192.168.246.160:80 -s -rr
ipvsadm -a -t 192.168.246.160:80 -r 192.168.246.162 -g 
ipvsadm -a -t 192.168.246.160:80 -r 192.168.246.161 -g
ipvsadm -S > /etc/sysconfig/ipvsadm 报存转发规则
ipvsadm -ln 查看链接

在被负载的机器上绑定vip

ip addr add dev lo 192.168.246.160/32
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 忽略arp广播

静态算法

  • LVS(Linux Virtual Server)提供了多种调度算法,用于确定将请求分发给哪个后端服务器。每种调度算法都有其独特的特点,适用于不同的负载均衡场景。以下是几种常见的 LVS 调度算法:

  • 轮询(Round Robin): 这是最简单的调度算法之一。每个新的请求按照服务器列表的顺序分配到下一个服务器。当请求分配完所有服务器后,算法重新开始。这样,每个服务器都有机会服务请求,实现了基本的负载均衡。

  • 加权轮询(Weighted Round Robin): 类似于轮询,但为每个服务器分配了权重,以便更重要的服务器获得更多的请求。服务器的权重可以根据其性能或硬件规格进行配置。

  • 最小连接数(Least Connections): 请求被分配到当前连接数最少的服务器上。这种算法适用于后端服务器性能不一致的情况,以确保将请求发送到负载较轻的服务器上。

  • 加权最小连接数(Weighted Least Connections): 类似于最小连接数算法,但每个服务器都分配了一个权重,以确保更重要的服务器获得更多的请求。

  • 最短响应时间(Least Response Time): 请求被分配到响应时间最短的服务器上。这需要负载均衡器实时监测服务器的响应时间,并动态地调整请求的分发。

  • 加权最短响应时间(Weighted Least Response Time): 类似于最短响应时间算法,但为每个服务器分配了权重,以确保更重要的服务器获得更多的请求。

  • 目标哈希(Destination Hashing): 根据请求的目标 IP 地址哈希值将请求分配给特定的服务器。这确保相同 IP 地址的请求始终由相同的服务器处理,对于某些应用场景可能更有利。

  • IP 范围调度(IP Range): 根据请求的源 IP 地址或目标 IP 地址的范围将请求分配给特定的服务器。这可以用于按地理位置或其他标准分配请求。

Keepalive

安装keepalived

yum install keepalived

编辑配置文件

vim /etc/keepalived/keepalived.conf

master只保存

! Configuration File for keepalived

global_defs {
   router_id directory1   #辅助改为directory2
}

vrrp_instance VI_1 {
    state MASTER        #定义主还是备
    interface ens33     #VIP绑定接口
    virtual_router_id 80  #整个集群的调度器一致
    priority 100         #back改为50
    advert_int 1         #检查间隔,默认为1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.246.16/24
    }
}

backup配置

! Configuration File for keepalived

global_defs {
   router_id directory2
}

vrrp_instance VI_1 {
    state BACKUP    #设置为backup
    interface ens33
    virtual_router_id 80
    priority 50   #辅助改为50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.246.16/24
    }
}

nginx停掉vip并不会漂移到backup
需要脚本杀死keepalived让他自动漂移


#!/bin/bash
curl -I http://localhost &>/dev/null	
if [ $? -ne 0 ];then
	systemctl stop keepalived
fi

访问不到页面直接停掉keepalived会让vip漂移
配置文件里面添加

}
vrrp_script check_nginx {
   script "/etc/keepalived/check_nginx_status.sh"
   interval 5    #调用脚本之间的间隔,默认为1秒
}
    track_script {
        check_nginx
    }
}

LVS_Director + KeepAlived

配置文件

! Configuration File for keepalived

global_defs {
   router_id lvs-keepalived-master    #辅助改为lvs-backup
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33                #VIP绑定接口
    virtual_router_id 80         #VRID 同一组集群,主备一致          
    priority 100            #本节点优先级,辅助改为50
    advert_int 1            #检查间隔,默认为1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.246.110/32
    }
}

virtual_server 192.168.246.110 80 {    #LVS配置
	delay_loop 6   #健康检查rs时间间隔
	lb_algo rr     #LVS调度算法
	lb_kind DR     #LVS集群模式(路由模式)
	protocol TCP      #健康检查使用的协议
	real_server 192.168.246.162 80 {
		weight 1
		inhibit_on_failure   #当该节点失败时,把权重设置为0,而不是从IPVS中删除
		TCP_CHECK {          #健康检查
			connect_port 80   #检查的端口
			connect_timeout 3  #连接超时的时间
			}
		}
	real_server 192.168.246.163 80 {
		weight 1
		inhibit_on_failure
		TCP_CHECK {
			connect_timeout 3
			connect_port 80
			}
		}
}

被负载的后端

ip addr add dev lo 192.168.246.110/32
echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
sysctl -p