文章目录
一、LVS-DR数据包流向分析
1、Client向目标VIP发出请求,Director(负载均衡器)接收
- IP包头及数据帧头信息
Src mac | Dst mac | type | … | source ip | src port | dst ip | dsc pot | … | CRC |
---|---|---|---|---|---|---|---|---|---|
… | … | … | … | 192.168.57.135 | 55014 | 192.168.57.126 | 80 | … | … |
source MAC | dest MAC |
---|---|
00:18:82:3c:e8:96 | 00:0c:29:6a:8d:5d |
2、Director根据负载均衡算法选择RealServer_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer_1的MAC地址,然后在局域网上发送
- IP包头及数据帧头信息
Src mac | Dst mac | type | … | source ip | src port | dst ip | dsc pot | … | CRC |
---|---|---|---|---|---|---|---|---|---|
… | … | … | … | 192.168.57.135 | 55014 | 192.168.57.126 | 80 | … | … |
source MAC | dest MAC |
---|---|
00:0c:29:6a:8d:5d | 00:0c:29:b1:97:82 |
3、RealServer_1收到这个帧,解封装后发现目标IP与本机匹配(RealServer事先绑定了VIP),于是处理这个报文,随后重新封装报文,发送到局域网
- IP包头及数据帧头信息
Src mac | Dst mac | type | … | source ip | src port | dst ip | dsc pot | … | CRC |
---|---|---|---|---|---|---|---|---|---|
… | … | … | … | 192.168.57.126 | 80 | 192.168.57.135 | 55014 | … | … |
source MAC | dest MAC |
---|---|
00:0c:29:b1:97:82 | 00:18:82:3c:e8:96 |
4、Client将收到回复报文。Client人为得到正常的服务,而不会知道是哪一台服务器处理的
- 注意:如果跨网段,则报文通过路由器经由Internet返回给用户
二、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地址(如:ens33接口)
源IP | VIP |
---|---|
源MAC | RealServer的MAC |
目的IP | 路由器的IP |
目的MAC | ? |
- 路由器收到ARP请求后,将更新ARP表项
- 原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址
IP | MAC |
---|---|
VIP | Director的MAC |
IP | MAC |
---|---|
VIP | RealServer的MAC |
-
问题:路由器根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效
-
解决方法:对节点服务器进行处理,设置内核参数arp_announce=2:系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
三、Keepalived简介及原理
(一) Keepalived简介
-
企业应用中,单台服务器承载应用存在单点故障的危险
-
单点故障一旦发生,企业服务将发生中断,造成极大的危害
-
Keepalived是专为LVS和HA设计的一款健康检查工具
- 支持故障自动切换(Failover)
- 支持节点健康状态检查(Health Checking)
(二)Keepalived实现原理剖析
- Keepalived采用VRRP热备份协议,实现Linux服务器的多机热备功能
- VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方案
- 由多台路由器组成一个热备组,通过共同的虚拟IP地址对外提供服务
- 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
- 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务
四、实验:构建负载均衡(DR)+高可用群集
- 实验软件环境:VMware Workstation 15.5、Xshell 6、Centos7.6
- IP地址及服务器指责规划:
设备 | IP地址 | 职责 |
---|---|---|
LVS+Keepalived(1) | 192.168.100.128/192.168.100.10(VIP) | LVS-DR(主) |
LVS+Keepalived(2) | 192.168.100.129/192.168.100.10(VIP) | LVS-DR(备) |
Web节点1 | 192.168.100.201 | 提供web页面 |
Web节点2 | 192.168.100.202 | 提供web页面 |
客户端(Win10) | 192.168.100.20 | 测试访问 |
- 实验步骤:
1、实验前准备,在两台LV上安装keepalived和ipvsadm工具;在两台Web服务器上安装http服务
yum -y install keepalived ipvsadm
yum -y install httpd
2、将以上工具下载安装完成后,将所有服务器节点及客户机网卡均设置为仅主机模式
3、分别在两台VLS调度器上进行如下配置
vi /etc/sysctl.conf ## 编辑配置文件
添加如下内容:
net.ipv4.ip_forward=1 ## 开启流量转发功能
proc响应关闭重定向功能:
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.ens33.send_redirects=0
保存退出后使用sysctl -p命令使配置生效
4、分别在两台VLS调度器上配置网卡及VIP
cd /etc/sysconfig/network-scripts/ ## 进入网卡配置目录
cp -p ifcfg-ens33 ifcfg-ens33:0 ## 复制配置文件作为VIP的配置
vim ifcfg-ens33:0 ## 编辑虚拟网卡
添加如下内容:
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.100.10 ## 这个就是虚拟IP(VIP)
NETMASK=255.255.255.0
配置本地物理网卡,信息如下:
vim ifcfg-ens33 ## 编辑物理网卡
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=f5f4c669-a4b3-48fd-9b96-69455b90d1d0
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.128 ## 物理网卡IP地址
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
配置LVS-DR(备)的过程同上,这里就不再赘述了,只需要把物理网卡IP改为192.168.100.129即可
5、配置DR模式启动脚本
cd /etc/init.d/
vim vim dr.sh
写入如下内容:
#!/bin/bash
GW=192.168.100.1
VIP=192.168.100.10
RIP1=192.168.100.201
RIP2=192.168.100.202
case "$1" in
start)
/sbin/ipvsadm --save > /etc/sysconfig/ipvs ## 保存默认配置(centos7需要,6不需要)
systemctl start ipvsadm
/sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev ens33:0 ## 添加路由网段
/sbin/ipvsadm -A -t $VIP:80 -s rr ## 指向DR模式(以下三行)
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
echo "ipvsadm starting -------------------[ok]"
;;
stop)
/sbin/ipvsadm -C
systemctl stop ipvsadm
ifconfig ens33:0 down ## 关闭逻辑网口
route del $VIP ## 删除路由条目
echo "ipvsamd stoped -------------------[ok]"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvsadm stoped -------------------"
exit 1
else
echo "ipvsadm Runing -------------------[ok]"
fi
;;
*)
echo "Usage:$0{start|stop|status}"
exit 1
esac
exit 0
保存退出后为脚本添加执行权限:chmod +x dr.sh
重启网卡:service network restart
执行脚本:service dr.sh start
关闭系统防火墙:systemctl stop firewalld
setenforce 0
另一台LVS-DR的操作步骤同上,不需要更改任何内容
6、配置两台Web节点服务器
cd /etc/sysconfig/network-scripts/ ## 进入网卡配置目录
cp -p ifcfg-lo ifcfg-lo:0 ## 复制配置文件作为VIP的配置
vim ifcfg-lo:0 ## 编辑虚拟网卡
添加如下内容:
DEVICE=lo:0
IPADDR=192.168.100.10
NETMASK=255.255.255.0
ONBOOT=yes
配置本地物理网卡,信息如下:
vim ifcfg-ens33 ## 编辑物理网卡
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=046613c1-dc28-4a0a-ab6c-89d7bd207756
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.201
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
7、分别在两台Web节点服务器上创建配置服务管理脚本
cd /ect/init.d/ ## 进入service管理目录
vim web.sh ## 创建脚本
写入如下内容:
#!/bin/bash
VIP=192.168.100.10 ##指定VIP
case "$1" in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP ## 声明VIP地址
/sbin/route add -host $VIP dev lo:0 ## 添加路由网段
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore ## ARP过滤(以下四句)
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p > /dev/null 2>&1 ## 使配置立即生效
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $VIP /dev/null 2>&1 ## 删除路由条目
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore ## 关闭ARP过滤
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stopd"
;;
*)
echo "Usage:$0 {start|stop}"
exit 1
esac
exit 0
保存退出后为脚本添加执行权限:chmod +x dr.sh
重启网卡:service network restart
执行脚本:service dr.sh start
关闭系统防火墙:systemctl stop firewalld
setenforce 0
另一台Web节点2的操作步骤同上,不需要更改任何内容
8、分别在分别在两台Web节点服务器上默认站点首页
cd /var/www/html/
vim index.html
写入以下内容:
<h1>test1</h1>
在另一台Web节点2上同上操作,只需要将test1改为test2即可
9、下面在LVS调度服务器上配置Keepalived
vim cd /etc/keepalived/keepalived.conf ## 编辑keepalived配置文件
修改后的配置文件:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1 ## 邮件服务器指向本地
smtp_connect_timeout 30
router_id LVS_01 指定router_ip,不能相同
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER ## 备机为BACKUP
interface ens33 ## 接口为物理网卡接口
virtual_router_id 51
priority 100 ## 备机优先级必须要小于主机
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.100.10 ## VIP地址
}
}
virtual_server 192.168.100.10 80 { ## 虚拟服务器IP地址及访问端口
delay_loop 6
lb_algo rr
lb_kind DR ## 指定LVS模式
persistence_timeout 50
protocol TCP
real_server 192.168.100.201 80 { ## 真实服务器IP地址
weight 1
TCP_CHECK { ## 健康状态检查
connect_port 80 ## 添加80端口
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.100.202 80 { ## 以下是另一台Web Server节点
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
在LVS-DR(1)上配置完成后,直接使用scp命令上传到LVS-DR(2)上即可:
scp keepalived.conf [email protected]:/etc/keepalived/ ## 上传配置文件到对方主机目录下
在LVS+Keepalived(2)上继续进行调整
router_id LVS_02 ## 主为01,备就是02,不一样即可
state BACKUP ## 角色身份不能一样,要改为BACKUP
priority 90 ## 优先级要改为90
10、在两台LVS上分别启动Keepalived服务
systemctl start keepalived
11、在win10客户机上打开命令提示符,测试VIP连通性