LVS负载均衡
1.LVS-DR 数据包流向分析
为方便进行原理分析,将 Client 与群集机器放在同一网络中,数据包流经的路线为 1-2-3-4
1.1 Client 向目标 VIP 发出请求,Director(负载均衡器)接收
此时源 MAC 地址为 Client 的 MAC 地址
目标 MAC 地址为调度器 Director 的 MAC 地址
1.2 Director 根据负载均衡算法选择 RealServer
不修改也不封装 IP 报文,而是将数据帧的 MAC 地址改为 RealServer 的 MAC 地址,然后在局域网上发送
此时源 MAC 地址为 Director 的 MAC 地址,目的 MAC 地址为 RealServer 的 MAC 地址
1.3 RealServer 收到这个帧
解封装后发现目标 IP 与本机匹配(RealServer 事先绑定了 VIP),于是处理这个报文
随后重新封装报文,将响应报文通过 lo 接口传送给物理网卡然后向外发出
此时源 MAC 地址为 RealServer 的 MAC 地址,目的 MAC 地址为 Client 的 MAC 地址
1.4 Client 将收到回复的报文
Client 认为得到正常的服务,而不会知道是哪一台服务器处理的
注意:如果跨网段,则报文通过路由器会经由 Internet 返回给用户
2.LVS-DR 中的 ARP 问题
在LVS-DR负载均衡集群中,负载均衡与节点服务器都要配置相同的VIP地址
但在局域网中具有相同的 IP 地址,势必会造成各服务器 ARP 通信的紊乱
当 ARP 广播发送到 LVS-DR 集群时,因为负载均衡器和节点服务器都是连接到相同网络上,它们都会接收到 ARP 广播
只有前端的负载均衡器进行响应,其他节点服务器不应该响应 ARP 广播
这时,我们可以对节点服务器进行处理,使其不响应针对 VIP 的 ARP 请求
使用虚接口 lo:0 承载 VIP 地址
设置内核参数 arp_ignore=1(系统只响应目的 IP 为本地 IP 的 ARP 请求)
RealServer 返回报文(源 IP 是 VIP)经路由器转发,重新封装报文时,需要先获取路由器的 MAC 地址
且发送 ARP 请求时,Linux 默认使用 IP 包的源 IP 地址(即 VIP)作为 ARP 请求包中的源 IP 地址,而不使用发送接口的 IP 地址
路由器收到 ARP 请求后,将更新 ARP 表项
原有的 VIP 对应 Director 的 MAC 地址会被更新为 VIP 对应 RealServer 的 MAC 地址
而路由器根据 ARP 表项,会将新来的请求报文转发给 RealServer,导致 Director 的 VIP 失效
上述问题的解决方法:
对节点服务器进行处理,设置内核参数 arp_announce=2(系统不使用 IP 包的源地址来设置 ARP 请求的源地址,而选择发送接口的 IP 地址)
修改 /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
3.LVS 负载均衡群集-DR模式
3.1 数据包流量分析
客户端发送请求到 Director Server (负载均衡器),请求的数据报文(源 IP 是 CIP, 目标IP是 VIP)到达内核空间
Director Server 和 Real Server 在同一个网络中,数据通过二层数据链路层来传输
内核空间判断数据包的目标 IP 是本机 VIP,此时 IPVS (IP
虚拟服务器)比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源 MAC 地址为 Director Server 的MAC 地址,修改目标 MAC 地址为 Real Server 的 MAC 地址,源 IP 地址与目标 IP地址没有改变,然后将数据包发送给 Real Server
到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文;数据包重新封装报文(源 IP 地址为
VIP,目标 IP 为 CIP),将响应报文通过 lo 接口传送给物理网卡然后向外发出 Real Server 直接将响应报文传送到客户端
3.2 DR 模式的特点
Director Server 和 Real Server 必须在同一个物理网络中
Real Server 可以使用私有地址,也可以使用公网地址;如果使用公网地址,可以通过互联网对 RIP 进行直接访问
Director Server 作为群集的访问入口,但不作为网关使用
所有的请求报文经由 Director Server,但回复响应报文不能经过 Director Server
Real Server 的网关不允许指向 Director Server IP,即 Real
Server 发送的数据包不允许经过 Director Server
Real Server 上的 lo 接口配置 VIP 的 IP 地址
4.部署 LVS-DR 负载均衡集群
4.1概述
在 DR 模式的群集中,LVS 负载调度器作为群集的访问入口,但不作为网关使用
服务器池中的所有节点都各自接入 Internet,发送给客户机的 Web 响应数据包不需要经过 LVS 负载调度器
这种方式入站、出站访问数据被分别处理,因此 LVS 负载调度器和所有节点服务器都需要配置有 VIP 地址,以便响应应对整个群集的访问
考虑到数据存储的安全性,共享存储设备会放在内部的专用网络内
4.2 配置环境
主机 操作系统 IP 地址
负载调度均衡器 CentOS 7 192.168.0.10
从负载调度均衡器 CentOS 7 192.168.0.50
Web节点服务器1 CentOS 7 192.168.0.20
Web节点服务器2 CentOS 7 192.168.0.30
NFS服务器 CentOS 7 192.168.0.40
4.3 配置负载调度器[主备都需要]
modprobe ip_vs
#加载ip_vs模块
cat /proc/net/ip_vs
#查看ip_vs版本信息
yum install -y ipvsadm
4.4 配置虚拟IP
采用虚接口的方式为网卡绑定 VIP 地址,以便响应群集访问
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.0.15
NETMASK=255.255.255.255
ifup ens33:0
#开启虚拟 ip
ifconfig ens33:0
#查看虚拟 ip
4.5 调整proc参数
对于 DR 集群来说,由于由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
4.6 配置负载均衡策略
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -C
#清除原有策略
ipvsadm -A -t 192.168.0.15:80 -s rr
ipvsadm -a -t 192.168.0.15:80 -r 192.168.0.20:80 -g
ipvsadm -a -t 192.168.0.15:80 -r 192.168.0.30:80 -g
#若使用隧道模式,则结尾处 -g 替换为 -i
ipvsadm -ln
#查看节点状态,Route代表 DR模式
4.7 部署NFS共享存储
yum install -y nfs-utils rpcbind
systemctl start nfs rpcbind
systemctl enable nfs rpcbind
#创建共享文件夹并赋予权限
mkdir /opt/accp /opt/benet
chmod 777 /opt/accp /opt/benet
#创建网页文件
echo "<h1>accp.com</h1>" > /opt/accp/index.html
echo "<h1>benet.com</h1>" > /opt/benet/index.html
#配置nfs
vim /etc/exports
/opt/accp 192.168.0.0/24(rw,sync)
/opt/benet 192.168.0.0/24(rw,sync)
#发布共享
exportfs -rv
showmount -e
4.8 配置节点服务器
#此地址仅用做发送 Web 响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)
#因此使用虚接口 lo:0 来承载 VIP 地址,并为本机添加一条路有记录,将访问 VIP 的数据限制在本地,以避免通信紊乱
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.0.15
NETMASK=255.255.255.255
ONBOOT=yes
ifup lo:0
ifconfig lo:0
route add -host 192.168.0.15 dev lo:0
#禁锢路由
route -n
#查看路由
vim /etc/rc.local
#添加VIP本地访问路由
/sbin/route add -host 192.168.0.15 dev lo:0
chmod +x /etc/rc.d/rc.local
4.9 调整内核的 ARP 响应参数
阻止更新 VIP 的 MAC 地址,避免发生冲突
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
4.10 挂载NFS共享空间
yum -y install httpd
systemctl start httpd && systemctl enable httpd
#挂载
mount 192.168.0.40:/opt/accp /var/www/html
#Web2 mount 192.168.0.40:/opt/benet /var/www/html
#设置自动挂载
echo '192.168.0.40:/opt/accp /var/www/html nfs defaults,_netdev 0 0' >> /etc/fstab
mount -a
5.LVS+Keepalived 高可用群集
5.1 LVS
Linux虚拟服务器(Linux Virtual Server)
LVS 实际上相当于基于IP地址的虚拟化应用, 为基于IP地址和内容请求分发的负载均衡提出了一种高效的解决方法
5.2 Keepalived
1、支持故障自动切换(Failover)
2、支持节点健康状态检查(Health Checking)
判断LVS负载调度器、节点服务器的可用性,当master主机出现故障及时切换到backup节点保证业务正常,当 master 故障主机恢复后将其重新加入群集并且业务重新切换回 master 节点。
5.3 Keepalived实现原理剖析
1、keepalived采用VRRP热备份协议实现Linux 服务器的多机热备功能
2、VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方案。
3、由多台路由器组成一个热备份组,通过共用的虚拟IP地址对外提供服务
4、每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
5、若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务
5.4 Keepalived 双机热备基础知识
Keepalived 起初是针对 LVS 设计的一款强大的辅助工具,主要用来提供故障切换(Failover)和健康检查(Health Checking)功能——判断 LVS 负载调度器、节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入群集
5.4.1 Keepalived 的热备方式
Keepalived 采用 VRRP(虚拟路由冗余协议)热备份协议,以软件的方式实现 Linux 服务器的多机热备功能
复习一下:VRRP 是针对路由器的一种备份解决方案——由多台路由器组成一个热备组,通过共用的虚拟 IP 地址对外提供服务;每个热备组内同一时刻只有一台主路由器(Master)提供服务,其他路由器(Backup)处于冗余状态,若当前在线的路由器出现故障,则其他路由器会自动接替(优先级决定接替顺序)虚拟 IP 地址,以继续提供服务
热备组内的每台路由器都可能成为主路由器,虚拟路由器的 IP 地址(VIP)可以在热备组内的路由器之间进行转移,所以也称为漂移 IP 地址
使用 Keepalived 时,漂移地址的实现不需要手动建立虚接口配置文件,而是由 Keepalived 根据配置文件自动管理
5.4.2 使用 Keepalived 实现双机热备
基于 VRRP 协议的热备方式,Keepalived 可以用作服务器的故障切换,每个热备组可以有多台服务器——当然,最常用的还是双机热备
在双击热备方案中,故障切换主要针对虚拟 IP 地址的漂移来实现,因此可以适用于各种应用服务器(Web、FTP、Mail、SSH、DNS…)
6.LVS+Keepalived 高可用群集部署
环境配置
主机 操作系统 IP地址 软件/安装包/工具
Director1 CentOS7 192.168.184.10 ipvsadm、keepalived
Director2 CentOS7 192.168.184.20 ipvsadm、keepalived
NFS-Server CentOS7 192.168.184.30 rpcbind、nfs-utils
Web-Server1 CentOS7 192.168.184.40 rpcbind、nfs-utils、httpd
Web-Server2 CentOS7 192.168.184.50 rpcbind、nfs-utils、httpd
客户机 CentOS7 192.168.184.60 ——————
6.1 配置负载调度器(192.168.184.10、192.168.184.20相同)
systemctl stop firewalld.service
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs
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
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -C
ipvsadm -A -t 192.168.184.10:80 -s rr #这里指定的虚拟IP为ens33网卡ip,重启keepliaved后会自动绑定虚拟网卡
ipvsadm -a -t 192.168.184.10:80 -r 192.168.184.40:80 -g
ipvsadm -a -t 192.168.184.10:80 -r 192.168.184.50:80 -g
ipvsadm
ipvsadm -ln
6.2 部署NFS共享服务器(192.168.184.30)
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
yum -y install nfs-utils rpcbind
systemctl start rpcbind.service
systemctl start nfs.service
systemctl enable nfs.service
systemctl enable rpcbind.service
mkdir /opt/lic
mkdir /opt/kiki
chmod 777 /opt/lic
chmod 777 /opt/kiki
vim /etc/exports
/opt/lic 192.168.184.0/24(rw,sync)
/opt/kiki 192.168.184.0/24(rw,sync)
exportfs -rv
6.3 配置节点服务器
两台相同(192.168.184.40、192.168.184.50)
systemctl stop firewalld
setenforce 0
yum -y install httpd
systemctl start httpd
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.184.188
NETMASK=255.255.255.255
service network restart 或 systemctl restart network
ifup lo:0
ifconfig 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
6.4 Web-Server1(192.168.184.40)
showmount -e 192.168.184.30
mount.nfs 192.168.184.30:/opt/lic /var/www/html
echo 'this is lic web!' > /var/www/html/index.html
6.5 Web-Server2(192.168.184.50)
mount.nfs 192.168.184.30:/opt/kiki /var/www/html
echo 'this is kiki web!' > /var/www/html/index.html
6.6 配置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_strict:严格遵守VRRP协议。下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址.
#vrrp_strict #加注释
}
vrrp_instance VI_1 { #定义VRRP热备实例参数
20行修改,指定热备状态,主为MASTER,备为BACKUP
state MASTER
21行修改,指定承载vip地址的物理接口
interface ens33
22行修改,指定虚拟路由器的ID号,每个热备组保持一致
virtual_router_id 10
23行修改,指定优先级,数值越大优先级越高,主为100,备为99
priority 100
advert_int 1 #通告间隔秒数(心跳频率)
authentication { #定义认证信息,每个热备组保持一致
auth_type PASS #认证类型
27行修改,指定验证密码,主备服务器保持一致
auth_pass 123123
}
virtual_ipaddress { #指定群集vip地址
192.168.184.188
}
}
34行修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.184.188 80 {
delay_loop 6 #健康检查的间隔时间(秒)
lb_algo rr #指定调度算法,轮询(rr)
37行修改,指定群集工作模式,直接路由(DR)
lb_kind DR
persistence_timeout 50 #连接保持时间(秒)
protocol TCP #应用服务采用的是 TCP协议
41行修改,指定第一个Web节点的地址、端口
real_server 192.168.184.40 80 {
weight 1 #节点的权重
43行删除,添加以下健康检查方式
TCP_CHECK {
connect_port 80 #添加检查的目标端口
connect_timeout 3 #添加连接超时(秒)
nb_get_retry 3 #添加重试次数
delay_before_retry 4 #添加重试间隔
}
}
real_server 192.168.184.50 80 { #添加第二个 Web节点的地址、端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
}
删除后面多余的配置
systemctl start keepalived
ip addr show dev ens33 #查看虚拟网卡vip
6.7 客户机访问
访问192.168.184.188,隔一段时间进行刷新,轮询显示
将主调度服务器keepalived服务关闭,再次验证
systemctl stop keepalived
仍然可以访问到页面