LVS常用模式(DR、NAT、TUN)以及ldirector和keepalived

2023-11-12

1.LVS简单介绍

1.lvs定义LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

2.LVS的特点:具有可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。我们先分析实现虚拟网络服务的主要技术,指出IP负载均衡技术是在负载调度器的实现技术中效率最高的。在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。

十种调度算法
rr:Round Bobin,轮询,将客户端的请求交替分配给RS
wrr:Weighted Round Bobin,加权轮询,根据RS的性能不同,让他们来承担不同比例的用户请求
dh:Destination Hashing,目标地址哈希调度,基于用户所请求的地址做哈希表
作用:实现将对于相同的地址的请求调度到同一个RS之上
sh:Source Hashing,源地址的哈希调度,基于用户的ip地址做哈希表
作用:实现将同一个客户端调度到相同的RS之上
lc:Least Connection,最小连接数调度,本质是调度到当前负载最低的主机上
wlc:Weighted Least Connection,加权最小连接数调度,本质是调度到当前负载最低的主机上
SED:是wlc补充
NQ:Never queue,算法基本和sed相同,为了避免性能差的RS长时间处于空闲状态
lblc:基于目标地址的最小连接数调度,这种算法那是lc和dh的组合,适应于cache场景
lblcr:带有复制功能的lblc

2.DR模式

实验准备:

主机 服务
server1:172.25.16.1 提供ipvsadm服务
server2:172.25.16.2 提供apache服务、realeserver
server3:172.25.16.3 提供apache服务、realeserver
物理机:172.25.16.250 客户端、测试端

DR模式(直接路由)
DR模式性能最佳,但必须要求在一个vlan中。
数据包流向:client–>vs–>rs–> client
DR模式下收到客户端请求,lvs会将vs的mac地址修改为某一台rs的mac地址(注:ip地址是逻辑地址,mac地址才是真正的通信地址,所以我们才可以通过修改mac地址发送到指定的rs),然后这个数据包会被转发到相应的rs处理(此时源ip和目标ip未变)。如数据帧流向所示,客户端请求由lvs接收,但返回的时候不经过lvs,而是直接向源ip返回,由真实服务器直接返回给用户。

优点:效率最高,负载均衡器只用分发请求,应答包通过单独的路由返回给客户端,提高了服务器并发能力。
缺点:负载均衡器的网卡必须和物理网卡在同一网段上

安装lvs的管理工具:ipvsadm
yum install ipvsadm -y						##企业7版本之后的ipvsadm安装包直接在内核中就可以找到,但之前版本需要手动创建高级yum源(从镜像里查找)
ip addr add 172.25.16.100/24 dev eth0		##给调度器一个vip
systemctl start ipvsadm						
vim /etc/sysconfig/ipvsadm-config			##修改配置文件,让服务重启时加载策略文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

写入策略:
ipvsadm -A -t 172.25.16.100:80 -s rr
ipvsadm -a -t 172.25.16.100:80 -r 172.25.16.2:80 -g
ipvsadm -a -t 172.25.16.100:80 -r 172.25.16.3:80 -g
ipvsadm -ln								##加n不做解析查看ipvsadm策略
systemctl restart ipvsadm				##此时重启ipvsadm会出现错误,需先创建文件/etc/sysconfig/ipvsadm(用来写入策略)
touch /etc/sysconfig/ipvsadm

在这里插入图片描述

在server2、server3进行设置:

需要给两个真实的web服务器加上vip,因为数据时从真实服务器直接返还给客户端的。

[root@server2 ~]# ip addr add 172.25.16.100/24 dev eth0
[root@server3 ~]# ip addr add 172.25.16.100/24 dev eth0

此时在物理机进行测试,会出现无法轮询的情况。
在这里插入图片描述
原因:
因为次是两台真实主机与lvs调度器都有vip,客户端并没有确定到底会访问哪台主机,所以这样可能会出现直接访问到主机的问题,因为本地缓存到real主机的mac地址后会跳过lvs调度器直接对真实主机进行访问,如果遭到DDOS恶意攻击,主机就很可能会无法正常使用。
解决方法:
在real主机都上安装基于mac地址的arptables来拒绝所有对172.25.16.100的访问。

yum install arptables.x86_64 -y
arptables -A INPUT -d 172.25.16.100 -j DROP			##将所有对121的访问都丢弃掉
arptables -A OUTPUT -s 172.25.16.100 -j mangle --mangle-ip-s 172.25.16.2		##以100的ip输出的数据的源ip是2
arptables-save > /etc/sysconfig/arptables			##手动导入策略到文件,不然就是临时生效
systemctl start arptables.service

在这里插入图片描述
在这里插入图片描述
测试:

arp-d 172.25.16.100			##清除原来100的缓存mac地址
curl172.25.16.100			##看是否轮询访问

在这里插入图片描述

3.NAT模式

NAT模式下收到客户端请求,lvs会做目的地址转换(DNAT),将目标ip改为rs的ip。rs接收到该数据包直接进行处理,返回响应时,目标ip即为cip,源ip即为rs的ip。然后,rs的数据包通过lvs中转,lvs进行源地址转换(SNAT),将数据包的源地址(rip)改为vip发送至客户端(rip不会直接响应cip),整个过程对于客户端来说是不可见的。

缺点:扩展性有限。高负载模式下,director可能成为瓶颈
优点:支持任意操作系统,节点服务器使用私有IP地址,与负载调度器位于同一个物理网络,安全性比DR模式和TUN模式要高。

实验环境同上:

1.server1:
yum install ipvsadm-1.27-7.el7.x86_64 -y
vim /etc/sysconfig/ipvsadm-config修改参数为IPVS_SAVE_ON_RESTART="yes"重启后加载策略
touch /etc/sysconfig/ipvsadm创建文件,没有的话无法重启(策略写的地方)
systemctl start ipvsadm.service
systemctl status ipvsadm.service

给server1添加一个网卡eth1

在这里插入图片描述

在这里插入图片描述

Ip addr add 172.25.254.100/24 dev eth1
Ip link set up eth1

在这里插入图片描述

打开内核路由:

Vim /etc/sysctl.conf             ##写入net.ipv4.ip_forward=1

在这里插入图片描述

添加策略:
ipvsadm -A -t 172.25.254.100:80 -s rr
ipvsadm -a -t 172.25.254.100:80 -r 172.25.16.2:80 -m
ipvsadm -a -t 172.25.254.100:80 -r 172.25.16.3:80 -m

在这里插入图片描述
server2、server3同样操作:

Systemctl start httpd
Route add default gw 172.25.16.1           #添加ipvsadm内网网段ip

在这里插入图片描述

在这里插入图片描述

测试:
在物理机:curl 172.25.254.100

在这里插入图片描述

4.TUN隧道模式

TUN:隧道模式下,vs 收到客户端请求,封装数据包,使源 ip 成为 vip,目标 ip 成为
rip,当 rs 收到数据包时,进行解封装,还原数据包,处理后,利用 vip 发出响应
从 rip 所在的接口发出,直接达到客户端。

优点:实现了异地容载,避免了一个机房故障导致网站无法访问。
缺点:RS配置复杂

实验环境:同上DR

lvs调度器的配置:(需要手动安装隧道模块)
ipvsadm -C									##在开始另一个模式的配置前,把原来的策略清除掉
lsmod										##查看本机安装的模块
modprobe ipip								##安装隧道模块
ip a										##查看是否多了一个隧道接口,此时处与关闭状态
ip addr del 172.25.16.100/24 dev eth0		##把vip从eth0网卡上删掉,并把vip添加到隧道接口
ip addr add 172.25.16.100/24 dev tunl0
ip link set up tunl0						##启用隧道接口,可以看到它的状态不再是关闭并且有vip

在这里插入图片描述
在这里插入图片描述

##添加调度策略:
ipvsadm -A -t 172.25.16.100:80 -s rr					##选择轮询算法
ipvsadm -a -t 172.25.16.100:80 -r 172.25.16.2:80 -i		##-i表示隧道模式
ipvsadm -a -t 172.25.21.121:80 -r 172.25.16.3:80 -i
systemctl restart ipvsadm.service						##使策略生效
ipvsadm -ln

在这里插入图片描述

(2)
real服务器的设定(没有特殊说明则两台服务器的设定都是相同的):
modprobe ipip							##同样也要安装隧道模块
ip addr del 172.25.16.100/24 dev eth0	##将vip从eth0上删除并添加到隧道上
ip addr add 172.25.16.100/24 dev tunl0
ip link set up tunl0					##启用隧道接口
ip a									##查看隧道是否启用

sysctl -a | grep rp_filter				##查看隧道反向过滤的策略,应该把这些策略全部关闭,否则在数据传输时可能会出现问题
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
sysctl -w net.ipv4.conf.default.rp_filter=0
sysctl -a | grep rp_filter				##确认策略全部关闭

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
server3同server2操作

测试:

在这里插入图片描述

4.通过ldirectord程序从集群中自动移除节点

ldirectord作用:当一台real服务器出现问题不能访问时,将它从集群中自动去除,使客户端的访问不受影响。

将各项配置改回DR模式

在server1上安装ldirectord软件
注意:在红帽的企业7版本中没有这个软件,但是企业6中的软件在这里也可以用,但是需要配置高可用的依赖环境,首先进入7.5的镜像目录,找到高可用的具体位置,在7.5中把高可用和负载均衡放在同一个目录下,并且没有了企业6中的其他资源

在这里插入图片描述

配置yum源,在原来的yum源文件中配置即可
vim /etc/yum.repos.d/westos		##配置yum源
[HighAvailability]
name=HighAvailability
baseurl=http://172.25.21.250/rhel7.5/addons/HighAvailability/
gpgcheck=0
yum repolist							##查看是否成功

在这里插入图片描述
在这里插入图片描述

首先安装ldirectord,本机使用的软件包为ldirectord-3.9.5-3.1.x86_64.rpm,可以在企业6的镜像中获取这个软件包,在yum源搭建好以后,注意在ldirectord软件包的所在的目录下才可以直接通过yum安装
yum install ldirectord-3.9.5-3.1.x86_64.rpm -y			##安装软件
rpm -qpl ldirectord-3.9.5-3.1.x86_64.rpm				##查看软件安装后产生的目录与文件

在这里插入图片描述

开启服务,因为这是企业6上的软件包,所以要用脚本的方式来启动服务
cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf /etc/ha.d/			##把模板复制到配置文件目录下
vim /etc/ha.d/ldirectord.cf											##修改配置文件

在这里插入图片描述

yum install httpd -y	##在调度器上安装apache,当真实主机web1和web2都出问题时,让客户端访问调度器并给客户端一个提示信息
vim /var/www/html/index.html	
systemctl start httpd	##开启服务

modprobe -r ipip						##卸载ipip模块
ip addr add 172.25.21.121/24 dev eth0

ipvsadm -C								##清空策略并重新写入
ipvsadm -A -t 172.25.16.100:80 -s rr
ipvsadm -a -t 172.25.16.100:80 -r 172.25.16.2:80 -g
ipvsadm -a -t 172.25.16.100:80 -r 172.25.16.3:80 -g
cat /etc/sysconfig/ipvsadm
systemctl restart ipvsadm.service

/etc/init.d/ldirectord start			##在启动服务之前记得关掉上一个实验的隧道接口并删掉它的ip,不然可能会发生冲突
chkconfig --list						##查看所有以脚本方式运行的服务,一般不全为off就是开机自启动的

在这里插入图片描述在这里插入图片描述在这里插入图片描述

server2、sever3

modprobe -r ipip
ip addr add 172.25.16.100 dev eth0

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
测试:
在这里插入图片描述
关闭server2的apache服务
在这里插入图片描述
关闭server3的apache服务
在这里插入图片描述

5.通过keepalived管理调度器和节点

keepalived作用:当调度器出问题时,使用keepalived服务管理,实现两台或者多台调度器的主备,当主调度器(MASTER)出问题时,可以将访问和服务都转到备用调度器(BACKUP)上,并且还可以设置邮件提醒在出现问题时进行提示,并且MASTER在运行过程中会一直给BACKUP发送心电信号,来告知BACKUP自己的运行状态良好。

环境准备:还原到DR模式时的配置
重新打开一台虚拟机server4:172.25.16.4做备用调度器

注意:在ipvsadm服务端即server1不需要设置vip

然后需要下载安装包,这个安装包可以直接在官网www.keepalived.org上下载
本机下载的是最新版keepalived-2.0.17.tar.gz
yum install gcc openssl-devel -y			##因为需要编译源码,所以安装编译软件
tar zxf keepalived-2.0.17.tar.gz			##解压安装包
./configure --prefix=/usr/local/keepalived --with-init=systemd			##进行编译
make && make install		
ln -s /usr/local/keepalived/etc/keepalived/ /etc/						##创建一个软链接

/etc/init.d/ldirectord stop					##关闭ldirectord服务并关闭开机自启动,否则可能会发生冲突
chkconfig ldirectord off

在这里插入图片描述

)在这里插入图片描述

修改server1配置文件
vim /etc/keepalived/keepalived.conf
systemctl restart keepalived

在这里插入图片描述
在这里插入图片描述
server4同样操作:

vim /etc/keepalived/keepalived.conf
systemctl restart keepalived

在这里插入图片描述
测试:
在这里插入图片描述

仍能实现轮询
在这里插入图片描述
server1日志:
在这里插入图片描述
server4日志:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LVS常用模式(DR、NAT、TUN)以及ldirector和keepalived 的相关文章

  • QThreadPool线程池的原理与使用

    一 为什么需要用线程池 现在所有的高性能服务器程序 几乎都会使用到线程池技术 从而更好且有效的榨干服务器性能 1 开多少个线程可以达到性能最佳 不知道 你有没有这个疑问 这是一种常见的线程使用方式 class MyThread public
  • list集合(接口)

    list集合 显而易见是用来存储数据的 可以把它看作是长度可变的数组 它是有序存储数据的 具有跟数组一样的索引 ArrayList LinkedList Vector Stack都是list接口的实现类 以ArrayList为例说明list
  • 1033 旧键盘打字 (20 分)

    题目 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在 2 行中分别给出坏掉的那些键 以及应该输入的文字 其中对应英文字母的坏键以大写给
  • 基于Redis的BitMap实现签到、连续签到统计(含源码)

    微信公众号访问地址 基于Redis的BitMap实现签到 连续签到统计 含源码 推荐文章 1 springBoot对接kafka 批量 并发 异步获取消息 并动态 批量插入库表 2 SpringBoot用线程池ThreadPoolTaskE
  • mysql日期转换

    1 MySQL中和日期相关的函数 1 1 DATE FORMAT date format 主要用来将日期格式化函数 举例 SELECT DATE FORMAT NOW Y m d 1 2 STR TO DATE str format 主要用
  • 分析pandas的数据,分析某一列数据的长度分布等等

    分析数据 如分析sku的长度 import pandas as pd import numpy as np data file data data zh sku 80k csv 待分析的文件 def ana len file key Non
  • AI绘画:StableDiffusion实操教程-斗破苍穹-云韵-常服(附高清图下载)

    前段时间我分享了StableDiffusion的非常完整的教程 AI绘画 Stable Diffusion 终极宝典 从入门到精通 不久前 我与大家分享了StableDiffusion的全面教程 AI绘画 Stable Diffusion

随机推荐

  • HITICS-2018大作业 hello的一生

    摘 要 本论文详细介绍了hello程序在linux系统中从生成源代码到成功运行完毕被系统回收的整个过程 按照执行的先后顺序模块化介绍了hello c在计算机内部是系统具体执行了什么指令 如何执行的 用到了哪些知识等 本论文参考CSAPP课本
  • linux(centos) 保存退出vi编辑

    保存命令 按ESC键 跳到命令模式 然后 w 保存文件但不退出vi w file 将修改另外保存到file中 不退出vi w 强制保存 不推出vi wq 保存文件并退出vi wq 强制保存文件 并退出vi q 不保存文件 退出vi q 不保
  • Oracle存储过程获取入参出参(顺序,名字,类型,入参/出参)

    调用SQL语句 PROCEDURE NAME为过程名 自行替换要查询的过程名 POS为参数位置 NAME为参数名 TYPE为参数类型 IN OUT为入参 出参 SELECT A POSITION POS A ARGUMENT NAME NA
  • ABB 120 六轴机械手臂编程调试(三)

    下一步进行机械手臂的程序编写 程序只是进行简单的点位运动 实现抓取功能 程序控制的点位表 输入点位 点位描述 输出点位 点位描述 DI5 夹取完成 DO5 夹取物料 DI6 放料完成 DO6 放下物料 DI7 回原点 DO7 设备就绪 DI
  • Python练习——基础练习题2

    因为控制台会让不断输入 索性就把input放到注释里了 这一片主要练习if判断和while循环 初级 判断下列语句的打印结果 1 print True and True or True 2 print True and True or Fa
  • 因果图分析法例子

    某软件规格说明书包含这样的要求 第一列字符必须是A或B 第二列字符必须是一个数字 在此情况下进行文件的修改 但如果第一列字符不正确 则给出信息L 如果第二列字符不是数字 则给出信息M 解答 1 根据需求 分析出原因和结果如下 原因 1 第一
  • smbms(超市管理系统)源码 + 分析

    在项目开始之前 我们首先要对项目的整体架构分析一下 该项目一共分为四个模块 登录注销 用户管理 订单管理 供应商管理 其中用户管理 订单管理以及供应商管理都是需要对数据库进行crud的 项目的整体架构图如下 1 前期准备 1 项目架构 2
  • Android中Activity跳转到具体的Fragment的方法

    1 首先在需要跳转的Activity写此代码 Intent intent new Intent from MainActivity class intent addFlags Intent FLAG ACTIVITY SINGLE TOP
  • 理解Android上下文Context

    Context使用场景总的来说分为两大类 使用Context调用方法 比如启动Activity 访问资源 调用系统级服务等 调用方法时传入Context 比如弹出Toast 创建Dialog等 Activity Service和Applic
  • 安装snownlp报错 error: subprocess-exited-with-error

    安装snownlp报错error subprocess exited with error 解决方案重新安装importlib metadata pip uninstall importlib metadata pip install im
  • Zabbix监控平台部署实验——自定义zabbix监控项目

    Zabbix系列文章目录 第一章 Zabbix5 0版本的安装教程 第二章 Zabbix监控平台部署实验 自定义zabbix监控项目 目录 Zabbix系列文章目录 前言 二 操作步骤 1 安装配置环境 2 授权zabbix server可
  • STM32HAL库的基本使用(1)- GPIO引脚配置

    前言 作者使用的是STM32L431RCT的开发板 Cortex M4的内核 是大学老师教学用的 原理图如下 原理图下载链接 https pan baidu com s 1c8WFBO9bPxarzaOKqDrl0Q pwd 6666 提取
  • Android中Recycler网格布局管理器GridLayoutManager用法

    使用RecyclerView可以制作出类似GridView的样式 但比GridView更加强大 这里我们就介绍一下RecyclerView和GridLayoutManager结和的用法 1 GridLayoutManager常用方法 构造函
  • ROS:开机自启动

    Ubuntu14 04 网上很多资料说在 etc rc local中添加脚本 实验之后完全没用 可能是系统版本不对 解决 Ubuntu14 04 开机项命令 gnome session properties 点击 add name 名字 c
  • mysql count(*)、count(1) 、count(列名)、count(distinct expr)

    文章目录 概述 优化 MyISAM InnoDB 参考文档 https dev mysql com doc refman 8 0 en group by functions html function count 概述 count 为 SQ
  • 蓝桥杯每日一题2023.9.8

    蓝桥杯2023年第十四届省赛真题 飞机降落 C语言网 dotcpp com 题目描述 N 架飞机准备降落到某个只有一条跑道的机场 其中第 i 架飞机在 Ti 时刻到达机场上空 到达时它的剩余油料还可以继续盘旋 Di 个单位时间 即它最早 可
  • Learning Video Object Segmentation from Static Images

    Abstract 论文灵感来源于 实例分割和目标跟踪 特点 1 我们的模型在每帧的基础上进行 并由前一帧的输出导向下一帧中的关注对象 2 一个高度准确的视频目标分割可以用一个卷积神经网络并用静态的图片来训练 3 使用在线和离线的策略 前者产
  • 为什么那么多的人选择到Java培训机构学习

    目前IT行业Java编程是最炙手可热的技术 Java应用范围广泛 企业在大量招收Java人才 薪水也随之上涨 发展前景越来越好 因此现在有越来越多的人发现了这片美丽的新大陆 都正在拼命往里的挤 一些觉得Java培训机构费用贵的同学会选择自学
  • public Map kaoYanAllStation() { Map map = new HashMap<>(); ...

    首先 根据代码中的注释可以看出 该方法主要是获取各种气象数据 对其进行计算和比较 然后将结果存储在一个 Map 对象中返回 为了优化这段代码 可以考虑以下几个方面 减少重复代码 在代码中可以看到 获取历年同期降水和温度数据的代码几乎一模一样
  • LVS常用模式(DR、NAT、TUN)以及ldirector和keepalived

    1 LVS简单介绍 1 lvs定义LVS是Linux Virtual Server的简写 意即Linux虚拟服务器 是一个虚拟的服务器集群系统 LVS集群采用IP负载均衡技术和基于内容请求分发技术 调度器具有很好的吞吐率 将请求均衡地转移到