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

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.xdnf.cn/news/15612.html

相关文章:

  • Python编程进阶知识之第二课学习网络爬虫(requests)
  • java-字符串和集合
  • JAVA中的Map集合
  • wireshark的常用用法
  • c#笔记之方法的形参列表以及方法重载
  • 测试学习之——Pytest Day3
  • 支付宝智能助理用户会话实时统计:Flink定时器与状态管理实战解析
  • Adam优化器
  • IMU噪声模型
  • 【数据结构】链表(linked list)
  • PostgreSQL 中的 pg_trgm 扩展详解
  • 命名实体识别15年研究全景:从规则到机器学习的演进(1991-2006)
  • Python 基础语法与数据类型(十三) - 实例方法、类方法、静态方法
  • SAP-ABAP:SAP的‘cl_http_utility=>escape_url‘对URL进行安全编码方法详解
  • Linux Swap区深度解析:为何禁用?何时需要?
  • 【程序地址空间】虚拟地址与页表转化
  • 基于Rust游戏引擎实践(Game)
  • 线上项目https看不了http的图片解决
  • 在分布式系统中,如何保证缓存与数据库的数据一致性?
  • docker 容器无法使用dns解析域名异常问题排查
  • springboot 整合spring-kafka客户端:SASL_SSL+PLAINTEXT方式
  • LeetCode20
  • 边界路由器
  • Baumer工业相机堡盟工业相机如何通过YoloV8模型实现人物识别(C#)
  • 如何做好DNA-SIP?
  • Redis完全指南:从基础到实战(含缓存问题、布隆过滤器、持久化及Spring Boot集成)
  • 数据结构 栈(2)--栈的实现
  • 4.PCL点云的数据结构
  • 「Chrome 开发环境快速屏蔽 CORS 跨域限制详细教程」*
  • springboot跨域问题 和 401