当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/283940.html

相关文章:

  • Docker实战:使用Docker部署IT工具箱Team·IDE
  • Android15系统实现刷机防呆功能
  • Flutter在Android studio运行出现Error: Entrypoint is not a Dart file
  • C++网络编程 2.TCP套接字(socket)编程详解
  • 微信小程序列表数据上拉加载,下拉刷新
  • ASP .NET Core 8实现实时Web功能
  • Python 网络爬虫 —— 提交信息到网页
  • AI算法之图像识别与分类
  • 电力载波通信技术(PLC)发展全解析:从历史演进到未来趋势
  • RabbitMQ概述和工作模式
  • 永磁同步电机MTPA与MTPV曲线具体仿真实现
  • Python学习之——序列化与反序列化
  • 常用的100个opencv函数
  • [RAG] LLM 交互层 | 适配器模式 | 文档解析器(`docling`库, CNN, OCR, OpenCV)
  • 加速度传感器方向校准方法
  • RGBA图片格式转换为RGB格式(解决convert转换的失真问题)
  • OpenCV中VideoCapture 设置和获取摄像头参数和Qt设计UI控制界面详解代码示例
  • (四)OpenCV——特征点检测与匹配
  • 分布式分片策略中,分片数量的评估与选择
  • MacOS安装linux虚拟机
  • GPU的barrier
  • OpenCV中常用特征提取算法(SURF、ORB、SIFT和AKAZE)用法示例(C++和Python)
  • Linux的Ext系列文件系统
  • 一文掌握Harbor的配额管理和GC机制
  • Kubernetes架构原理与集群环境部署
  • VMware Workstation Pro 17下载安装
  • C++ AVL树实现详解:平衡二叉搜索树的原理与代码实现
  • [yotroy.cool] 记一次 spring boot 项目宝塔面板部署踩坑
  • LeetCode|Day16|387. 字符串中的第一个唯一字符|Python刷题笔记
  • 高光谱相机(Hyperspectral Camera)