项目技术问题记录-内网环境下搭建LVS实现四层负载

原创作者:田超凡(程序员田宝宝)

版权所有,引用请注明原作者,严禁复制转载

  1. lvs实现四层负载DR模式
  2. 什么是lvs

        LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。

lvs实现负载的三种方式

        运行 IPVS软件的服务器,在整个负载均衡集群中承担一调度角色 软件的服务器,(即 向真实服务器分配从客户端过来的请求。LVS中的调度方法有三种 :NAT(Network Address Translation网络地址转换)、TUN(tunnel 隧道)、DR(direct route 直接路由)

1.LVS-DR 模式

        请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过LVS。

       DR模式下需要LVS服务器和RS绑定同一个VIP, 一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,RS收到LVS转发来的包,发现MAC是自己的,发现IP也是自己的,于是这个包被合法地接受,而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。

        DR模式下,lvs接收请求输入,将请求转发给RS,由RS输出响应给用户,性能非常高。

它的不足之处是要求负载均衡器与RS在一个物理段上。

2.LVS-NAT模式

        NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,LVS需要作为RS的网关,当网络包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP,这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,对于客户端只知道是LVS直接返回给它的。

        NAT模式请求和响应都需要经过lvs,性能没有DR模式好。

3.LVS-TUN模式

        TUN模式是通过ip隧道技术减轻lvs调度服务器的压力,许多Internet服务(例如WEB服务器)的请求包很短小,而应答包通常很大,负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量。相比NAT性能要高的多,比DR模式的优点是不限制负载均衡器与RS在一个物理段上。但是它的不足需要所有的服务器(lvs、RS)支持"IP Tunneling"(IP Encapsulation)协议。

4.lvs-DR环境

master:192.168.101.100

lvs-director:192.168.101.8

nginx1:192.168.101.3

nginx2:192.168.101.4

  1. lvs调度服务器Director安装
    1. 安装lvs

在192.168.101.8上安装lvs

centos6.5自带lvs,检查linux内核是否集成lvs模块:

modprobe -l | grep ipvs

      1. 安装lvs的管理工具ipvsadm
  1. 安装依赖

yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt*

  1. 安装ipvsadm

将ipvsadm-1.26.tar.gz拷贝至/usr/local/下

cd /usr/local

tar -zxvf ipvsadm-1.26.tar.gz

cd ipvsadm-1.26

make

make install

    1. 真实服务器Real Server安装

在192.168.101.3和192.168.101.4上安装nginx。

      1. nginx配置文件

创建nginx-lvs.conf,http内容如下:

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    server {

        listen       80;

        server_name  localhost;

        location / {

            root   html;

            index  index.html index.htm;

        }

     

    }

    1. Director Server配置
      1. 在eth0上绑定虚拟ip

ifconfig eth0:0 192.168.101.100 broadcast 192.168.101.100 netmask 255.255.255.255 up

此处在eth0设备上绑定了一个虚拟设备eth0:0,同时设置了一个虚拟IP是192.168.101.100,然后指定广播地址也为192.168.101.100,需要特别注意的是,虚拟ip地址的广播地址是它本身,子网掩码是255.255.255.255。

      1. 添加路由规则

route add -host 192.168.101.100 dev eth0:0

      1. 启用系统的包转发功能

echo "1" >/proc/sys/net/ipv4/ip_forward

参数值为1时启用ip转发,为0时禁止ip转发。

      1. 清除原有转发规则

ipvsadm --clear

      1. 添加虚拟IP规则

ipvsadm -A -t 192.168.101.100:80 -s rr

-s rr表示采用轮询策略。

:80表示负载转发的端口是80

      1. 在虚拟IP中添加服务规则

ipvsadm -a -t 192.168.101.100:80 -r 192.168.101.3:80 -g

ipvsadm -a -t 192.168.101.100:80 -r 192.168.101.4:80 -g

在新加虚拟IP记录中添加两条新的Real Server记录,-g表示指定LVS 的工作模式为直接路由模式。

lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80。

      1. 重启lvs

ipvsadm

    1. Real Server配置

        在lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server,因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户。

      1. 在回环设备上绑定了一个虚拟IP地址

ifconfig lo:0 192.168.101.100 broadcast 192.168.101.100 netmask 255.255.255.255 up

/sbin/route add -host 192.168.101.100 dev lo:0

      1. 关闭arp解析

arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。

         0 -利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;

         1 - 避免使用另外一个接口上的mac地址去响应ARP请求;

         2 - 尽可能使用能够匹配到ARP请求的最佳地址。

arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;

           0 - 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;

           1 - 哪个接口上接受ARP请求,就从哪个端口上回应。

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce 

echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce 

sysctl -p #使用修改生效

    1. 测试
      1. 预期目标

由于lvs设置为rr轮询策略,当访问虚IP http://192.168.101.100,每次刷新请求通过lvs负载到不同的服务器。

      1. 注意事项

1、测试时需要在nginx的http中设置keepalive_timeout  0; 取消使用http持久连接模式,保证每次客户端发起请求都需要向服务端建立连接,这样做是为了每次刷新页面都要经过lvs负载转发。

2、lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80。

keepalive_timeout说明:

在nginx中keepalive_timeout的默认值是75秒,默认使用http持久连接模式,可使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,可避免建立或重新建立连接。生产环境建议keepalive_timeout不要设置为0。

部分素材引用自传智播客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/757521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ctf_show笔记篇(web入门---反序列化)

目录 反序列化 254:无用,是让熟悉序列化这个东西的 255:直接使$isViptrue 256:还是使用变量覆盖 257:开始使用魔法函数 258:将序列化最前面的过滤了,使用绕过 259: 这一题需要看writeup才…

windows10 WSL启动Ubuntu虚拟机,安装DolphinScheduler

文章目录 1. 启动WSL与虚拟机2. 安装Docker与DolphinScheduler容器 1. 启动WSL与虚拟机 使用管理员权限运行命令: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux重启后即可创建虚拟机 在Microsoft Store中搜索Ubuntu&…

研二双9找个日常实习都找不到,哎!

投了几家日常,要不就面完没反应,要不就秒挂,看不透了。是最近都在忙着处理春招和暑期实习吗,怎么连个日常实习都找不到? 个人背景双9,lc以前刷过200道,最近没怎么碰过。 腾讯 3.13 一面&#xf…

给老婆整了个短剧搜索机器人APP

最近短剧挺火,很多群友们都在做一些资源分享,老胡于是基于这些资源做了个短剧搜索引擎,挺多朋友喜欢看的,我老婆也在看哈哈,真上头,废话不多说,上短剧机器人。 短剧机器人 直接在微信群输入&…

麒麟 V10 一键安装 Oracle 11GR2(231017)单机版

Oracle 一键安装脚本,演示 麒麟 V10 一键安装 Oracle 11GR2 单机版过程(全程无需人工干预):(脚本包括 ORALCE PSU/OJVM 等补丁自动安装) ⭐️ 脚本下载地址:Shell脚本安装Oracle数据库 脚本第…

提升合规性!Zoho如何优化CRM产品合规性?

在企业数字化和信息化高速发展的今天,CRM管理系统成为越来越多企业的选择。然而,不是所有CRM供应商都有合规意识。合规性不应当只是一项法律规定,更是保证CRM供应商持续发展、赢得客户信赖以及应付监管压力的关键支撑。Zoho对企业合规性的重视…

串行通信——CAN通信问答

通过几个问题来对CAN总线有一个初步的认识: Q1: CAN总线的全称是什么?它最初是为哪种应用环境而设计开发的? CAN总线全称为Controller Area Network,最初是为解决现代汽车中分布式电子控制系统之间的实时通信问题而设计开发的。…

Python探索反距离加权空间插值方法的深度

介绍 反距离加权 (IDW) 是一种广泛用于地理信息系统 (GIS) 和环境科学的空间插值技术,用于根据附近位置的值估计任何位置的缺失值。其基本原理很直观:距离兴趣点较近的位置比距离较远的位置更相似。本文深入探讨了 IDW 的方法、应用、优势和局限性,深入探讨了其在空间分析中…

招聘必备知识:求职者跟进邮件如何写?

写一封正确的招聘跟进邮件是一门艺术。在面试结束后给你的候选人发一封好的后续邮件可以为招聘工作创造奇迹,甚至最终入职的候选人也是如此。 与候选人保持良好的沟通,可以确保他们一直参与其中,给予他们应得的尊重和赞赏。然而,…

Javascript 元二分搜索 | 单边二分查找(Meta Binary Search | One-Sided Binary Search)

元二分搜索(Steven Skiena 在《算法设计手册》第 134 页中也称为单边二分搜索)是二分搜索的一种修改形式,它以增量方式构建数组中目标值的索引。与普通二分搜索一样,元二分搜索需要 O(log n) 时间。 元二分搜索,也称为…

机器学习——终身学习

终身学习 AI不断学习新的任务,最终进化成天网控制人类终身学习(LLL),持续学习,永不停止的学习,增量学习 用线上收集的资料不断的训练模型 问题就是对之前的任务进行遗忘,在之前的任务上表现不好…

HarmonyOS系统开发ArkTS常用组件按钮及参数

Button组件有两种使用方式,分别是不包含子组件和包含子组件两种方式。不同方式Button 组件所需的参数有所不同。 1、不包含子组件 Button(label?: string, options?: { type?: ButtonType, stateEffect?: boolean }) label为按钮上显示的文字内容options.type…

21个 JVM 技术点详解(附面试解答)

最近兄弟们面试,都逃不过被 JVM 问题轰炸的命运,为啥面试官喜欢拿 JVM 说事呢?V 哥认为,除了要问倒你,就是要压你薪水,咱绝对不能怂,俗话说的好:兵来将挡,水来土掩&#…

模拟面试

1.TCP通信中的三次握手和四次挥手过程 三次握手 1.客户端像向服务器端发送连接请求 2.服务器应答连接请求 3.客户端与服务器简历连接 四次挥手: 客户端或服务器端发起断开请求,这里假设客户端发送断开请求 1.客户端向服务器发送断开请求 2.服务器应答断开请求 3.服…

JavaSE(上)-Day6

JavaSE(上)-Day6 数组数组的定义数组的初始化打印数组分析数组索引数组内存图 方法方法的定义和调用方法的重载方法的内存图 二维数组二位数组的创建和初始化二维数组的内存图 数组 1.数组是一种容器,可以一次存储多个相同类型的数据 数组的…

nginx日志统计qps

1.QPS QPS全称为Queries Per Second,即每秒钟处理的请求数量。对于一个高并发应用来说,QPS是非常重要的性能指标,它反映了应用处理请求的能力。在实际应用中,QPS的大小取决于应用的负载和应用本身的性能。 QPS req/sec 请求数/…

Go语言学习03-字符串

Go语言学习03-字符串 字符串 与其他主要编程语言的差异 string 是数据类型, 不是引用或指针类型string 是只读的 byte slice, len 函数可以返回它所包含的byte数string 的byte数组可以存放任何数据 Unicode UTF8 Unicode 是一种字符集(code point)UTF8 是 unicode 的存储实…

opengl日记9-opengl使用纹理示例

环境 系统:ubuntu20.04opengl版本:4.6glfw版本:3.3glad版本:4.6cmake版本:3.16.3gcc版本:10.3.0 直接上代码 CMakeLists.txt cmake_minimum_required(VERSION 3.5) set(CMAKE_C_STANDARD 11) set(CMAKE_…

原型,模板,策略,适配器模式

原型模式 原型模式(创建型模式),核心思想就是:基于一个已有的对象复制一个对象出来,通过复制来减少对象的直接创建的成本。 总结一下,原型模式的两种方法,浅拷贝只会复制对象里面的基本数据类型…

【linux线程(三)】生产者消费者模型详解(多版本)

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux线程 1. 前言2. 初识生产…