LVS集群
一.环境配置
1、准备四台虚拟机,并进行环境配置
client NAT:172.25.254.10/24
lvs NAT:172.25.254.100/24 仅主机:192.168.0.100/24
RS1 仅主机:192.168.0.10/24
RS2 仅主机:192.168.0.20/24
2、在lvs的主机上打开路由内核:
[root@lvs ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
3、在RS1和RS2中下载httpd服务并启动模拟web服务
[root@RS1 ~]# dnf install httpd -y
[root@RS1 ~]# systemctl start httpd.service
[root@RS1 ~]# systemctl disable --now firewalld.service
[root@RS1 ~]# echo "192.168.0.10" > /var/www/html/index.html
4、测试是否通信
[root@lvs ~]# curl 192.168.0.10
192.168.0.10
[root@lvs ~]# curl 192.168.0.20
192.168.0.20
二.lvs部署命令集介绍
1.安装ipvsadm
[root@lvs ~]# dnf install ipvsadm -y
2.ipvsadm命令
核心功能:
1.对集群服务的增、删、改
2.对集群服务的RS的增、删、改
3.查看
参数:
[root@lvs ~]# ipvsadm --help
ipvsadm v1.31 2019/12/24 (compiled with popt and IPVS v1.2.1)
Usage:ipvsadm -A|E virtual-service [-s scheduler] #调度算法[-p [timeout]] #持久连接[-M netmask] [--pe persistence_engine] [-b sched-flags]ipvsadm -D virtual-serviceipvsadm -C #清空ipvsadm -R #重载ipvsadm -S [-n] #保存
3.lvs集群中的增删改
1.集群管理服务器中的增删改
Either long or short options are allowed.--add-service -A #添加--edit-service -E #修改--tcp-service|-t service-address #tcp服务--udp-service|-u service-address #udp服务--scheduler -s scheduler #调度算法,默认为WLC--fwmark-service|-f fwmark #火墙标记,是一个数字--persistent -p [timeout] #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
例:添加172.25.254.100:80集群服务调度算法为rr(左边为ipvsadm监控)
修改172.25.254.100:80集群服务调度算法为wrr
修改172.25.254.100:80集群服务持久连接超时时间360s
添加火墙标记
删除火墙和清空所有
2.管理集群中的RealServer
--add-server -a #添加realserver--edit-server -e #更改realserver--gatewaying -g #直连路由模式--ipip -i #ipip隧道模式--masquerading -m #nat模式--weight -w #设计权重--numeric -n #不做解析--zero -Z #清空计数器
例:添加realserver为nat模式
添加realserver为直连路由模式
更改realserver为隧道模式并更改其权重为2
3.备份恢复及启动服务
[root@lvs ~]# ipvsadm-save -n > /mnt/ipvsadm.rule #保存
[root@lvs ~]# ipvsadm -C #清空
[root@lvs ~]# ipvsadm-restore < /mnt/ipvsadm.rule #恢复
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# systemctl start ipvsadm.service #此时启动服务会显示缺少文件
Job for ipvsadm.service failed because the control process exited with error code.
See "systemctl status ipvsadm.service" and "journalctl -xeu ipvsadm.service" for details.
[root@lvs ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm #将信息保存到缺少的文件中
[root@lvs ~]# systemctl enable --now ipvsadm.service #此时课正常启动文件
4.nat模式配置
在realserver中配置网关,使网关指向lvs中相同网络段的ip
[root@RS1 ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
interface-name=ens160[ipv4]
method=manual
address1=192.168.0.10/24,192.168.0.100
dns=8.8.8.8
策略配置
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
关闭lvs、RS1、RS2的防火墙
[root@lvs ~]# systemctl disable --now firewalld.service
测试
[root@lvs ~]# for N in {10..20};do curl 172.25.254.100;done
192.168.0.10
192.168.0.20
192.168.0.10
192.168.0.20
192.168.0.10
192.168.0.20
192.168.0.10
192.168.0.20
三.LVS-DR集群
1.环境设置
1.在以上实验环境中之前的lvs转变为路由器,再加入一个网卡为仅主机的虚拟机充当lvs并设定ip及网关,网关指向路由器中同网段的网卡ip
[root@DR-lvs ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
interface-name=ens160[ipv4]
method=manual
address1=192.168.0.200/24,192.168.0.100
address2=192.168.0.220/24
dns=8.8.8.8
路由器配置:
#删除网关和dns,路由器不需要
[root@route ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
type=ethernet
interface-name=ens160[ipv4]
method=manual
address1=172.25.254.100/24[root@route ~]# vim /etc/NetworkManager/system-connections/ens192.nmconnection
[connection]
id=ens192
type=ethernet
interface-name=ens192[ipv4]
method=manual
address1=192.168.0.100/24#重新载入配置
[root@route ~]# nmcli connection reload
[root@route ~]# nmcli connection up ens160
[root@route ~]# nmcli connection up ens192
2.打开内核路由(与环境配置中相同操作)
3.开启防火墙,设定防火墙规则
[root@route ~]# systemctl enable --now firewalld.service
[root@route ~]# firewall-cmd --add-masquerade --permanent
success
4.在DR-LVS、RS1、RS2中配置环回接口
[root@DR-lvs ~]# vim /etc/NetworkManager/system-connections/lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo[ipv4]
method=manual
address1=127.0.0.1/8
address2=192.168.0.220/32[root@DR-lvs ~]# nmcli connection reload
[root@DR-lvs ~]# nmcli connection up lo
2.在realserver主机中进行arp抑制
在两个rs主机中设定lo不对外响应
[root@RS1 ~]# echo net.ipv4.conf.all.arp_announce = 2 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.all.arp_ignore = 1 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.lo.arp_announce = 2 >> /etc/sysctl.conf
[root@RS1 ~]# echo net.ipv4.conf.lo.arp_ignore = 1 >> /etc/sysctl.conf
[root@RS1 ~]# sysctl -p
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
3.策略配置
[root@DR-lvs ~]# ipvsadm -A -t 192.168.0.220:80 -s rr
[root@DR-lvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.10:80 -g
[root@DR-lvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.20:80 -g
查看
4.效果
[root@node ~]# for i in {1..10}
> do
> curl 192.168.0.220
> done
192.168.0.10
192.168.0.20
192.168.0.10
192.168.0.20
192.168.0.10
192.168.0.20
192.168.0.10
192.168.0.20
192.168.0.10
192.168.0.20
四.lvs的调度算法
1.静态调度算法
1.rr:round-robin 轮询 RS分别被调度,当RS配置有差别时不推荐
2.wrr:Weighted rr,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
3.SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往 第一次挑中的RS,从而实现会话绑定
4.DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请 求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商 3.5.2.lvs动态调度算法
2.动态调度算法
1.LC:least connections(最少链接发) 适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活 动链接数)
2.WLC:Weighted LC(权重最少链接)
默认调度方法: Overhead=(activeconns x 256+inactiveconns)/weight
3.SED:Shortest Expection Delay, 初始连接高权重优先Overhead=(activeconns + 1 + inactiveconns) x 256/weight 但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
4.NQ:Never Queue,第一轮均匀分配,后续SED
5.LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6.LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制 到负载轻的RS
五.防火墙标签解决轮询错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题
当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上
1.在RS1和RS2中安装mod_ssl并重启apache
[root@RS1 ~]# dnf install mod_ssl -y
[root@RS1 ~]# systemctl restart httpd
2.在lvs中设置调度,因为我们要调度80和443两个端口所以我们需要设定两组策略
[root@DR-lvs ~]# ipvsadm -A -t 192.168.0.220:443 -s rr
[root@DR-lvs ~]# ipvsadm -a -t 192.168.0.220:443 -r 192.168.0.10 -g
[root@DR-lvs ~]# ipvsadm -a -t 192.168.0.220:443 -r 192.168.0.20 -g
[root@DR-lvs ~]# ipvsadm -A -t 192.168.0.220:80 -s rr
[root@DR-lvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.10 -g
[root@DR-lvs ~]# ipvsadm -a -t 192.168.0.220:80 -r 192.168.0.20 -g
3.此时访问vip,出现问题,调度器调度了两次192.168.0.10
[root@node ~]# curl http://192.168.0.220; curl -k https://192.168.0.220
192.168.0.10
192.168.0.10
4.在lvs调度器中设定端口标签,人为使80和443成为一个整体
[root@DR-lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.220 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666
5.设定调度规则
[root@DR-lvs ~]# ipvsadm -A -f 666 -s rr
[root@DR-lvs ~]# ipvsadm -a -f 666 -r 192.168.0.10 -g
[root@DR-lvs ~]# ipvsadm -a -f 666 -r 192.168.0.20 -g
6.测试
[root@node ~]# curl http://192.168.0.220; curl -k https://192.168.0.220
192.168.0.10
192.168.0.20
六.持久链接
访问一个链接时,如果在短期(默认360S)内同源再来访问我仍然按照内存中记录的调度信息,把这个源的访问还调度到 同一台RS上。
如果过了比较长的时间(默认最长时间360s)同源访问再次来访,那么就会被调度到其他的RS上
在lvs调度器中设定(最少为60s)
[root@DR-lvs ~]# ipvsadm -E -f 666 -s rr -p 1
此时多次访问vip,会发现不会轮询访问
[root@node ~]# curl http://192.168.0.220
192.168.0.20
[root@node ~]# curl http://192.168.0.220
192.168.0.20
等待FIN_WAIT时间过期后,再等待一次ASSURED时间过期后,再次访问vip,此时就会轮询至下一个ip
[root@node ~]# curl http://192.168.0.220
192.168.0.10