企业集群的应用 LVS-DR 集群
一、LVS - DR 数据包的流向分析
(1)客户端发送请求到 Director Server(负载均衡器),请求的数据报文(源 IP 是 CIP,目标 IP 是 VIP)到达内核空间。
(2)Director Server 和 Real Server 在同一个网络中,数据通过二层数据链路层来传输。
(3)内核空间判断数据包的目标IP是本机VIP,此时IPVS(IP虚拟服务器)比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源 MAC 地址为 Director Server 的 MAC地址,修改目标 MAC 地址为 Real Server 的 MAC 地址,源 IP 地址与目标 IP 地址没有改变,然后将数据包发送给 Real Server。
(4)到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文。数据包重新封装报文(源 IP 地址为 VIP,目标 IP 为 CIP),将响应报文通过 lo 接口传送给物理网卡然后向外发出。
(5)Real Server 直接将响应报文传送到客户端。
二、LVS - DR 中 ARP 问题
(1)ARP 广播 导致所有节点服务器和调度器的VIP响应
解决方法:arp _ingore=1
防止网关路由发送ARP广播时调度器和节点服务器都进行响应,导致ARP缓存紊乱,不对非本地物理网卡IP的ARP请求进行响应,应为VIP是承载 lo:0
(2)导致 VIP 的调度器失效:arp_annouce=2
解决方案:系统不响应数据包的源IP地址(VIP)来作为本机进行ARP报文的源IP地址,而是用发送报文的物理网卡IP地址作为ARP请求报文的源IP地址,这样可以防止网关路由器接受到的源IP地址为VIP的请求报文后又更新ARP缓存表,导致外网再发送请求时数据包达到不了调度器
三、LVS - DR 特性
(1)LVS - DR 模式需要注意的是:保证前端路由将目标地址为VIP报文系统发给调度器(DS),而不是节点服务器(RS)
解决方案:修改 RS 上内核参数(arp_ingore 和 arp_annouce)将节点服务器上VIP地址配置在lo接口的别名上,并限制其能不能响应对VIP地址解析请求
arp_ingore=1 表示系统只响应目的IP地址的ARP请求
arp_annouce=2 表示系统不使用IP包的源地址来设置的ARP请求的源地址,而选择发送接口的IP地址
(2)LVS - DR 优点
DR 模式的特点:
(1)Director Server 和 Real Server 必须在同一个物理网络中。
(2)Real Server 可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对 RIP 进行直接访问。
(3)Director Server作为群集的访问入口,但不作为网关使用。
(4)所有的请求报文经由 Director Server,但回复响应报文不能经过 Director Server。
(5)Real Server 的网关不允许指向 Director Server IP,即Real Server发送的数据包不允许经过 Director Server。
(6)Real Server 上的 lo 接口配置 VIP 的 IP 地址。
缺点:
这种方式需要所有的负载均衡和节点服务器都在同一广播域;不支持异地容灾
四、案例 构建 LVS - DR 集群部署
LVS - DR 集群 案例架构图
1. 案例环境
(1)共享存储服务器
ens33
IP:192.168.23.20/24
(2)LVS -DR 服务器:
ens33
IP:192.168.23.5/24
ens33:0
VIP:192.168.23.100/32
(3)web1-server 服务器
ens33
IP:192.168.23.10/24
ens33:0
VIP:192.168.23.100/32
(4)web2 -server 服务器
ens33
IP:192.168.23.15/24
ens33:0
VIP:192.168.23.100/32
2. 部署负载调度器
LVS-DR服务器:192.168.23.5/24
(1)安装 LVS 管理工具
# 启用 ip_vs 内置模块
modprobe ip_vs
# 查看 ip_vs 版本
cat /proc/net/ip_vs
# 安装 LVS 管理工具
yum -y install ipvsadm
(2)配置虚拟 IP 地址
VIP:192.168.23.100
# 配置ens33:0虚拟网卡
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.23.100
NETMASK=255.255.255.255
:wq!
# 启用ens33:0虚拟网卡
ifup ens33:0
# 重启网络服务
systemctl restart network
# 查看虚拟网卡 ens33:0
ifconfig ens33:0
(3)关闭 icmp 重定向
由于 LVS 负载调度器和各节点需要共用 VIP 地址,需要关闭 icmp 的重定向,不充当路由器。
# 调整 proc 响应参数,关闭路由器功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
# 启用 sysctl
sysctl -p
(4)部署负载分配策略
# 启动 ipvsadm 服务前必须备份负载分配策略配置,否则会报错
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl restart ipvsadm
# 清空原有策略
ipvsadm -C
# 添加虚拟服务器
ipvsadm -A -t 192.168.23.100:80 -s rr
# 添加真实服务器(后端服务器)
ipvsadm -a -t 192.168.23.100:80 -r 192.168.23.10:80 -g
ipvsadm -a -t 192.168.23.100:80 -r 192.168.23.15:80 -g
# 启动策略
ipvsadm
# 查看已配置的策略
ipvsadm -ln
3. 部署共享服务器
(1)安装 NFS 服务
yum -y install nfs-utils rpcbind
(2)创建共享目录
mkdir /opt/web1 /opt/web2
chmod 777 /opt/web1 /opt/web2
(3)设置共享目录
vim /etc/exports
/usr/share *(ro,sync)
/opt/web1 192.168.23.0/24(rw,sync,no_root_squash)
/opt/web2 192.168.23.0/24(rw,sync,no_root_squash)
:wq!
# 发布共享目录
exportfs -rv
# 重启服务
systemctl start rpcbind
systemctl start nfs
systemctl enable rpcbind
systemctl enable nfs
4. 部署节点服务器
web1-server:192.168.23.10
web2-server:192.168.23.15
部署 web1-server 服务器
(1)配置虚拟 VIP
# 配置虚拟 VIP 地址
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.23.100
NETMASK=255.255.255.255
:wq!
# 启动 lo:0 网卡
ifup lo:0
# 查看 lo:0 网卡信息
ifconfig
# 向 lo:0 网卡中添加路由
route add -host 192.168.23.100 dev lo:0
# 设置开机自动将路由添加到 lo:0 网卡
echo "/sbin/route add -host 192.168.23.100 dev lo:0" >> /etc/rc.local
(2)调整内核的 ARP 响应参数
调整内核的 ARP 响应参数以阻止更新 VIP 的 MAC 地址,避免发生冲突
vim /etc/sysctl.conf
# 系统只响应目的IP为本地IP的ARP请求
net.ipv4.conf.lo.arp_ignore = 1
# 系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
:wq!
# 启用路由设置
sysctl -p
(3)部署 Apache服务及共享服务
yum -y install nfs-utils rpcbind httpd
# 开启服务并设置开机自起
systemctl start rpcbind
systemctl start httpd
systemctl enable rpcbind
systemctl enable httpd
(4)创建 web 应用
# 永久挂载共享目录
echo "192.168.23.20:/opt/web1 /var/www/html nfs defaults 0 0" >> /etc/fstab
mount -a
# 创建web应用
echo "this is web1-erver" > /var/www/html/index.html
部署 web2-server 服务器
(1)配置虚拟 VIP
# 配置虚拟 VIP 地址
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.23.100
NETMASK=255.255.255.255
:wq!
# 启动 lo:0 网卡
ifup lo:0
# 查看 lo:0 网卡信息
ifconfig
# 向 lo:0 网卡中添加路由
route add -host 192.168.23.100 dev lo:0
# 设置开机自动将路由添加到 lo:0 网卡
echo "/sbin/route add -host 192.168.23.100 dev lo:0" >> /etc/rc.local
调整内核的 ARP 响应参数
调整内核的 ARP 响应参数以阻止更新 VIP 的 MAC 地址,避免发生冲突
vim /etc/sysctl.conf
# 系统只响应目的IP为本地IP的ARP请求
net.ipv4.conf.lo.arp_ignore = 1
# 系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
:wq!
# 启用路由设置
sysctl -p
(3)部署 Apache服务及共享服务
yum -y install nfs-utils rpcbind httpd
# 开启服务并设置开机自起
systemctl start rpcbind
systemctl start httpd
systemctl enable rpcbind
systemctl enable httpd
(4)创建 web 应用
# 永久挂载共享目录
echo "192.168.23.20:/opt/web2 /var/www/html nfs defaults 0 0" >> /etc/fstab
mount -a
# 创建web应用
echo "this is web2-erver" > /var/www/html/index.html
4. 部署路由器
# 网卡配置
ens33:192.168.23.2/24
ens36:10.0.0.1
# 开启路由功能
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# 启用路由配置
sysctl -p
# 配置私网、公网转换
iptables -t nat -A POSTROUTING -s 192.168.23.0/24 -o ens36 -j SNAT --to-source 10.0.0.1
5. 测试
在客户端使用浏览器访问(每隔一段时间刷新一次) http://192.168.23.100/