LVS + KeepAlived实现负载均衡

编程入门 行业动态 更新时间:2024-10-27 09:39:44

LVS + KeepAlived实现<a href=https://www.elefans.com/category/jswz/34/1755287.html style=负载均衡"/>

LVS + KeepAlived实现负载均衡

LVS + KeepAlived

LVS Keepalived 集群的组成

LVS(linux virtual server,linux 虚拟服务器),由以下三部分组成:

  • 负载均衡层(load balance): 位于整个集群的最前端,由一台或多台负载调度器(Director Server)组成。 其上安装了 LVS 的核心模块 IPVS,负责把用户请求分发给服务器群组层的应用服务器(Real Server)。 同时还有监控模块(Ldirectord),用于监测各个 Real Server 服务的健康情况,当 real server 不可用时, 将其从路由表中剔除,待主机恢复后重新加入。
  • 服务器群组(Server Array): 由一组实际运行应用服务的主机组成。每个 Real Server 之间通过高速 LAN 相连。
  • 数据共享存储(Shared Storage): 为所有 Real Server 提供共享存储空间和内容一致性的存储区域,一般由磁盘阵列设备组成

IPVS

IPVS 的简单介绍

IPVS: 安装于 Director Server 上,并在 Director Server 上虚拟出一个 VIP(Virtual IP)。 用户的访问请求通过 VIP 到达负载调度器,然后由负载调度器从 Real Server 列表中选取一个服务节点响应用户的请求。

IPVS 转发请求的 3 种方式:

  • VS/NAT(Virtual Server via Network Address Translation): 当用户请求到达调度器时,调度器将请求报文的目标地址和端口地址改写 成选定的 Real Server 的相应地址和端口,并将请求报文发送给选定的 Real Server。当 Real Server 返回数据时,还需要再次将报文的源地址和端口更改为 VIP 和相应的端口后,再发送给用户。 因为请求和响应报文都需要经过 Director Server 重写,所以当高并发时,调度器的处理能力将会成为瓶颈。
  • VS/TUN (Virtual Server via IP Tunneling): 也就是 IP 隧道技术实现虚拟服务器。调度器采用 IP 隧道技术将用户请求转发到某个 Real Server,而这个 Real Server 将直接响应用户的请求,不再经过前端调度器,此外,对 Real Server 的地域位置没有要求,可以和 Director Server 位于同一个网段,也可以是独立的一个网络。由于在 TUN 方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。
  • VS/DR(Virtual Server via Direct Routing): 也就是用直接路由技术实现虚拟服务器。VS/DR 通过改写请求报文的 MAC 地址,将请求发送到 Real Server,而 Real Server 将响应直接返回给客户,免去了 VS/TUN 中的 IP 隧道开销。这种方式是三种负载调度机制中性能最高、最好的,但是必须要求 Director Server 与 Real Server 都有一块网卡连在同一物理网段上

keepAlived

keepalived 的原理的简单介绍:

VRRP (Virtual Router Redundancy Protocol,虚拟路由器冗余协议): 在现实的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)完成的, 而主机之间的路由器一旦出现故障,通信就会失败,因此,在这种通信模式中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了 VRRP 协议。

VRRP 可以将两台或多台物理路由器设备虚拟成一个虚拟路由器,每个虚拟路由器都有一个唯一标识,称为 VRID,一个 VRID 与一组 IP 地址构成了一个虚拟路由器。 这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务。而在虚拟路由器内部,同一时间只有一台物理路由器对外提供服务,这台物理路由器被称为主路由器(处于 MASTER 角色)。 而其他物理路由器不拥有对外的虚拟 IP,也不提供对外网络功能,仅仅接收 MASTER 的 VRRP 状态通告信息,这些路由器被统称为备份路由器(处于 BACKUP 角色)。 当主路由器失效时,处于 BACKUP 角色的备份路由器将重新进行选举,产生一个新的主路由器进入 MASTER 角色继续提供对外服务,整个切换过程对用户来说完全透明。

Keepalived 作为一个高性能集群软件,它还能实现对集群中服务器运行状态的监控及故障隔离。下面继续介绍下 Keepalived 对服务器运行状态监控和检测的工作原理。

Keepalived 工作在 TCP/IP 参考模型的第三、第四和第五层,也就是网络层、传输层和应用层。根据 TCP/IP 参考模型各层所能实现的功能,Keepalived运行机制如下:

  • 在网络层,运行着四个重要的协议:互连网协议 IP、互连网控制报文协议 ICMP、地址转换协议 ARP 以及反向地址转换协议 RARP。Keepalived 在网络层采 用的最常见的工作方式是通过ICMP协议向服务器集群中的每个节点发送一个 ICMP 的数据包(类似于 ping 实现的功能),如果某个节点没有返回响应数据包,那么 就认为此节点发生了故障,Keepalived 将报告此节点失效,并从服务器集群中剔除故障节点。
  • 在传输层,提供了两个主要的协议:传输控制协议 TCP 和用户数据协议 UDP。传输控制协议 TCP 可以提供可靠的数据传输服务,IP 地址和端口,代表一个 TCP 连接的 一个连接端。要获得 TCP 服务,须在发送机的一个端口上和接收机的一个端口上建立连接,而 Keepalived 在传输层就是利用 TCP 协议的端口连接和扫描技术来 判断集群节点是否正常的。比如,对于常见的 Web 服务默认的 80 端口、SSH 服务默认的 22 端口等,Keepalived 一旦在传输层探测到这些端口没有响应数据返回, 就认为这些端口发生异常,然后强制将此端口对应的节点从服务器集群组中移除。
  • 在应用层,可以运行 FTP、TELNET、SMTP、DNS 等各种不同类型的高层协议,Keepalived 的运行方式也更加全面化和复杂化,用户可以通过自定义 Keepalived 的工作方式,例如用户可以通过编写程序来运行 Keepalived,而 Keepalived 将根据用户的设定检测各种程序或服务是否允许正常,如果 Keepalived 的检测结果 与用户设定不一致时,Keepalived 将把对应的服务从服务器中移除

准备

主机:

主机ip
lvs-ds1192.168.111.15
lvs-ds2192.168.111.16
lvs-rs1192.168.111.13 (预安装nginx)
lvs-rs2192.168.111.14 (预安装nginx)
vip192.168.111.100()
[root@blue ~]# systemctl enable keepalived

keepalived配置

  • 设置 lvs-ds1 为 master
  • 设置 lvs-ds2 为 BACKUP
  • 配置 文件大体相同 ,但 lvs-ds2 为 state BACKUP
[lvs-ds1 ~] sudo vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addrvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {state MASTER  // lvs-ds2  BACKUPinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111  //密码}virtual_ipaddress {192.168.111.100 //vip}
}[root@blue ~]# systemctl restart keepalived
[lvs-ds2 ~]# ip addr show ens33|grep 192inet 192.168.111.16/24 brd 192.168.111.255 scope global ens33[lvs-ds1 ~]# ip addr show ens33|grep 192inet 192.168.111.15/24 brd 192.168.111.255 scope global ens33inet 192.168.111.100/32 scope global ens33

模拟宕机

  • 停止 lvs-ds1的keepalived
  • vip 切换至了 lvs-ds2(ip 飘移)
 [lvs-ds1 ~]# systemctl restart keepalived[lvs-ds2 ~]# ip addr show ens33|grep 192inet 192.168.111.16/24 brd 192.168.111.255 scope global ens33inet 192.168.111.100/32 scope global ens33[lvs-ds1 ~]# ip addr show ens33|grep 192inet 192.168.111.15/24 brd 192.168.111.255 scope global ens33

可以看见成功切换到 lvs-ds2

加入RS

在 lvs-ds1 的 keepalived.conf 配置文件中加入, 因为是同一内网,所以 采用 DR 模式(NAT 模式不适合【要在不同网段】)

[lvs-ds1 ~] sudo vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr# vrrp_strict                    注释掉,不然ping 不了 vipvrrp_garp_interval 0vrrp_gna_interval 0
}vrrp_instance VI_1 {state MASTER           # lvs-ds2  BACKUPinterface ens33        # 当前 IP 对应的网卡virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111  #密码}virtual_ipaddress {192.168.111.100 # vip}
}
virtual_server 192.168.111.100 80 {delay_loop 1       # 每隔1秒查询realserver状态 lb_algo rr        # lvs 算法lb_kind DR         # Direct Routeprotocol TCP       # 用TCP协议检查realserver状态persistence_timeout 50 # 会话保持时间,这段时间内,同一ip发起的请求将被转发到同一个realserver# 第一台realserver物理环境real_server 192.168.111.13 80 {weight 1    TCP_CHECK {connect_timeout 3retry 3               # 旧版本为 nb_get_retry delay_before_retry 3connect_port 80}}# 第二台realserver物理环境real_server 192.168.111.14 80 {weight 1    TCP_CHECK {connect_timeout 3 retry 3                  # 旧版本为 nb_get_retry delay_before_retry 3connect_port 80}}
}

同理将 RS 加入到 lvs-ds2 配置中

lvs-ds2 区别 lvs-ds1 配置:

vrrp_instance VI_1 {state BACKUP           # lvs-ds2  interface ens33        # 当前 IP 对应的网卡virtual_router_id 51priority 90            # 优先级比 MASTER低advert_int 1authentication {auth_type PASSauth_pass 1111  //密码}virtual_ipaddress {192.168.111.100 // vip}
}
# 其他和 lvs-ds1 一样

重启 keepAlived

#清除 负载规则
[lvs-ds1 ~] sudo ipvsadm -C
[lvs-ds1 ~]  systemctl restart keepalived
# 查看路由
[lvs-ds1 ~] # ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  blue:http rr persistent 5-> 192.168.111.13:http          Route   1      0          0         -> 192.168.111.14:http          Route   1      0          0     # 查看 lvs-ds2
[lvs-ds2  ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.111.100:http rr persistent 5-> 192.168.111.13:http          Route   1      0          0         -> 192.168.111.14:http          Route   1      0          0         

配置 lvs-rs

  • 配置 web服务
  • 配置网络转发
web服务

请求 lvs-rs1:

[root@blue ~]# curl http://192.168.111.13/index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>Welcome to CentOS</title>
</head>
<body>
<div id="content"><h1>Welcome to CentOS</h1><h2>server: lvs-rs1</h2>
</div>
</body>
</html>

请求 lvs-rs2:

[root@blue ~]# curl http://192.168.111.14/index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>Welcome to CentOS</title>
</head>
<body>
<div id="content"><h1>Welcome to CentOS</h1><h2>server: lvs-rs2</h2>
</div>
</body>
</html>

网络服务配置

在 DR 模式 需要将 VIP 绑定在 RS 当前网卡上,不然通过 VIP访问不了 RS 节点上的服务应用, lvs-rs1 和 lvs-rs2 都要执行

[lvs-rs1 ~]# cat lvs-web.sh 
#!/bin/bash 
SNS_VIP=192.168.111.100     # VIP
case "$1" in
start)ifconfig ens33:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP  # ens33:0 ens33: 当前网卡,/sbin/route add -host $SNS_VIP dev ens33:0echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announcesysctl -p >/dev/null 2>&1echo "RealServer Start OK";;
stop)ifconfig lo:0 downroute del $SNS_VIP >/dev/null 2>&1echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announceecho "RealServer Stoped";;
*)echo "Usage: $0 {start|stop}"exit 1
esac
exit 0

执行:

[lvs-rs1 ~]# ./lvs-web.sh start
RealServer Start OK

访问

[lvs-rs1 ~]# watch ipvsadm -Ln --stats     # lvs-ds1 为 master
Every 2.0s: ipvsadm -Ln --stats                                                                                                                                                                                   
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes-> RemoteAddress:Port
TCP  192.168.111.100:80                 30      340        0    64042        0-> 192.168.111.13:80                  14      114        0    15494        0-> 192.168.111.14:80                  16      111        0    48548        0
[lvs-rs1 ~]# ip addr|grep ens
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 192.168.111.15/24 brd 192.168.111.255 scope global ens33inet 192.168.111.100/32 scope global ens33# 当前 VIP 在 lvs-ds1

访问 curl http://192.168.111.100:80/index.html, 不同 机器ip 请求这个地址 ,就会路由到 不同的机器

验证 DS 故障转移

让 lvs-ds1 宕机:

[lvs-ds1 ~]# systemctl stop keepalived
[lvs-ds1 ~]# ip addr|grep ens
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 192.168.111.15/24 brd 192.168.111.255 scope global ens33# VIP 飘移至 lvs-rs2
[lvs-ds2 ~]# ip addr|grep ens                            
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 192.168.111.16/24 brd 192.168.111.255 scope global ens33inet 192.168.111.100/32 scope global ens33# 访问 VIP 服务不受影响curl http://192.168.111.100:80/index.html# 重新启动 lvs-ds1 keepalived
[lvs-ds1 ~]# systemctl restart keepalived
[lvs-ds1 ~]# ip addr|grep ens
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 192.168.111.15/24 brd 192.168.111.255 scope global ens33inet 192.168.111.100/32 scope global ens33
# 可以发现 VIP 飘移至 lvs-ds1,且服务不受影响 

验证 RS 故障转移

关闭 lvs-rs1 中的 web 服务

[lvs-rs1 ~]# systemctl stop nginx# 访问 VIP 服务不受影响
curl http://192.168.111.100:80/index.html 返回  lvs-rs2页面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>Welcome to CentOS</title>
</head>
<body>
<div id="content"><h1>Welcome to CentOS</h1><h2>server lvs-rs2 </h2>
</div>
</body>
</html>
[lvs-rs1 ~]# systemctl start nginxcurl http://192.168.111.100:80/index.html 返回  lvs-rs1页面

用到其他 命令

# 删除/添加 路由
ip addr add/del 192.168.111.100/24 dev lo

至此 , lvs-keepalived 负载均衡 结束!

更多推荐

LVS + KeepAlived实现负载均衡

本文发布于:2024-03-13 04:08:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1733156.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:负载均衡   LVS   KeepAlived

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!