一、 lvs dr 模式请求过程

1、整个请求过程如下:

client在发起请求之前,会发一个arp广播的包,在网络中找“谁是vip”,由于所有的服务器,lvs和rs都有vip,为了让client的请求送到lvs上,所以必须让rs不能响应client发出的arp请求,(这也是为什么要禁止rs上arp的请求和响应)下面就是lvs转发的事情了:

    1)client向目标vip发送请求,lvs接收;此时ip包和数据信息如下:

src mac dst mac src ip dst ip
00:0c:29:f3:1f:de 00:0c:29:50:d5:63 192.168.188.111 192.168.188.120

    2)lvs根据负载均衡的算法,选择一台realserver,然后把realserver1的mac地址作为目的mac地址,发送到局域网中

src mac dst mac src ip dst ip
00:0c:29:50:d5:63 00:0c:29:e4:4d:1f 192.168.188.111 192.168.188.120

    3)realserver1在局域网中收到这个请求以后,发现目的ip和本地匹配,于是进行处理,处理完成以后,直接把源ip和目的ip直接对调,然后经过网关直接返回给用户;

src mac dst mac src ip dst ip
00:0c:29:e4:4d:1f 00:0c:29:f3:1f:de 192.168.188.120 192.168.188.111

2、 抓包分析验证

1)lvs 转发到 realeserver

从抓包中可以看到,客户端发送请求给 lvs,lvs 马上就会将请求转发给后端的 rs2 (mac 地址: 00:0c:29:2c:a5:a0);

2)realserver 直接会应客户端数据


从抓到的数据包分析,rs2 处理请求后,直接就把数据发回给客户端了。源ip 是 vip,目标ip 是客户端的ip。

二、重要的补充,关于arp 抑制

lvs dr 模式中,lvs 和 rs 处于同一个网络中,而且他们都配置相同的 vip。所以,当客户端要向vip 发送网络请求的时候,它会先在整个网络广播一条 arp 请求,询问 vip 对应的mac 地址是什么。arp 广播有可能被lvs 响应,也有可能被realeserver 响应。如果这条请求 vip 的广播被realeserver 服务器响应了,那么客户端的 arp 缓存表就记录了vip 的mac 地址是realserver 的了。这样会导致客户端直接可以将数据请求发送到realserser ,lvs 的负载均衡作用就完全失效,其他的realserver 服务器也不会被请求。

由于存在以上的问题,lvs dr 模式的架构中,需要将realserver 的arp 协议响应和宣告功能进行限制。具体来说就是在 rs 里的 lvs_rs.sh 配置脚本的以下几条操作:

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

说明:

1) arp_ignore =1

作用就是,限制rs 对arp 广播的响应。当 arp 请求的目的 ip 是本机的网络入口设备的ip 时才响应。所以,当arp_ignore设为1后,rs 对网络中询问vip 的 arp 广播包都不再响应。因为rs 的vip 设置在lo:0 虚拟网卡上,不是rs这台机器的网络流入设备。

2)arp_announce = 2

作用就是,限制rs 在对外宣告arp 广播时所使用的源ip 地址。因为,rs 要直接返回客户的请求数据。我们从本文的第6节抓包分析里,就知道rs 需要知道客户机的mac地址,数据包才能发送到网络中,且能准确找到客户机的网卡。
rs 在广播arp 请求时,默认如果arp_announce=0时,发出请求的ip是什么,arp 请求里的源ip就应该是什么。即如果arp_announce=0,那么rs 的arp 广播的源ip 就会是vip。当rs 发出这个源ip是vip ,源mac地址是 eth0 的请求包后,客户机就会更新自己的arp 缓存表里vip 的mac 地址,这样之前记录的lvs 的mac 地址就失效了。

所以,需要将 arp_announce设置为2。这样,rs 发出arp 广播请求查询客户机的mac地址时,它的arp 报文里使用的源ip 就会选择出口设备,也就是eth0 的mac 地址。当客户机收到rs 的这个arp 请求时,就会回应自己mac 地址。这样,客户机也不会更新自己arp 缓存表里的vip 的mac地址。

arp 协议有一个特点,它不会记住自己询问过的ip地址和mac主机。所以,当有接收到新的arp广播请求,如果发现有新的mac 地址,他就会更新。而不会验证发送方是不是自己曾经询问过的ip 。这个缺陷也引起了arp ***,就是我们常说的arp 欺骗。有些中间代理机器,不断地发arp 请求,让你的机器arp 缓存表里的mac 地址混乱。

三、 总结

在lvs dr 模式中,通过抓包理解请求发送的流转方向,清晰地理解为什么lvs 调度器不会成为网络性能的瓶颈。在理解arp 抑制时,理解arp_ignore 和 arp_announce 两个参数的作用,最为重要。

lvs dr 模式请求过程的更多相关文章

  1. 一个公网地址部署LVS/DR模式

    http://blog.chinaunix.net/uid-7411781-id-3436142.html 一个公网地址部署LVS/DR模式   网上看了很多关于LVS的文章,在选取2种模式LVS/D ...

  2. LVS DR模式 负载均衡服务搭建

    LVS 负载均衡 最近在研究服务器负载均衡,阅读了网上的一些资料,发现主要的软件负载均衡方案有nginx(针对HTTP服务的负载均衡),LVS(针对IP层,MAC层的负载均衡).LVS模式工作在网络层 ...

  3. LVS DR模式搭建 keepalived lvs

    LVS DR模式搭建• 三台机器 • 分发器,也叫调度器(简写为dir)172.16.161.130 • rs1 172.16.161.131 • rs2 172.16.161.132 • vip 1 ...

  4. Keepalived+LVS DR模式高可用架构实践

    Keepalived最初是为LVS设计,专门监控各服务器节点的状态(LVS不带健康检查功能,所以使用keepalived进行健康检查),后来加入了VRRP(虚拟路由热备协议(Virtual Route ...

  5. LVS DR模式搭建、keepalived+lvs

    1.LVS DR模式搭建 条件: 即三台机器,在同一内网. 编辑脚本文件:/usr/local/sbin/lvs_dr.sh #! /bin/bashecho 1 > /proc/sys/net ...

  6. lvs之 lvs+nginx+tomcat_1、tomcat_2+redis(lvs dr 模式)

    前提:已经安装好 lvs+nginx+tomcat_1.tomcat_2+redis环境 ,可参考 (略有改动,比如tomcat_1.tomcat_2安装在两台机器上,而不是单机多实例 ,自行稍稍变动 ...

  7. CentOS下LVS DR模式负载均衡配置详解

    一安装LVS准备: 1.准备4台Centos 6.2 x86_64 注:本实验关闭 SELinux和IPtables防火墙. 管理IP地址 角色 备注 192.168.1.101 LVS主调度器(Ma ...

  8. Linux centosVMware Linux集群架构LVS DR模式搭建、keepalived + LVS

    一.LVS DR模式搭建 三台机器 分发器,也叫调度器(简写为dir) davery :1.101 rs1 davery01:1.106 rs2 davery02:11.107 vip 133.200 ...

  9. LVS DR模式实验

    LVS DR模式实验 三台虚拟机,两个台节点机(Apache),一台DR实验调度机 一:关闭相关安全机制 systemctl stop firewalld iptables -F setenforce ...

随机推荐

  1. ASP.NET Core 6框架揭秘实例演示[14]:日志的进阶用法

    为了对各种日志框架进行整合,微软创建了一个用来提供统一的日志编程模式的日志框架.<日志的基本编程模式>以实例演示的方式介绍了日志的基本编程模式,现在我们来补充几种"进阶" ...

  2. 【C# 集合】HashTable .net core 中的Hashtable的实现原理

    上一篇我介绍了Hash函数 这篇我来说一下Hash函数在 HashTable中的应用. HashTable的特性: 1.装载因子:.net core 0.72 ,java 0.75 2.冲突解决方案: ...

  3. 【C# 】继承

    背景..什么是继承? 「继承」是对象导向编程的其中一个基本属性. 它可让您定义子类,重复使用(继承).扩充或修改父类别行为. 其成员可供继承的类别称为基底类别. 继承基底类别成员的类别则称为「衍生类别 ...

  4. 【计算机】CPU工作方式、多核心、超线程技术详解

    CPU架构要谈超线程和多核,就不得不谈CPU的架构和逻辑.无关的技术细节太多,这里略去.我们重点谈一下CPU中两个相关的模块:1)Processing Unit(运算处理单元),简称PU2)Archi ...

  5. 【C#基础概念】程序集清单

    .NET Core 程序集(模块)还包含描述程序集本身的元数据,我们称之为清单.清单记录了当前程序集正常运行所需的所有外部程序集.程序集的版本号.版权信息.模块 .资源(图片 xml等)等.与类型元数 ...

  6. 《Symfony 5全面开发》教程04、Symfony处理http请求的流程

    当我们访问项目的/test路径时,浏览器会向我们的服务器端发送一个请求.我们打开浏览器的开发者工具,打开network选项卡. 在地址栏中敲击回车,浏览器向我们的服务器端发送了一个请求.请求的地址是1 ...

  7. redis缓存雪崩和缓存穿透

    缓存雪崩:由于原有的缓存过期失效,新的缓存还没有缓存进来,有一只请求缓存请求不到,导致所有请求都跑去了数据库,导致数据库IO.内存和CPU眼里过大,甚至导致宕机,使得整个系统崩溃. 解决思路:1,采用 ...

  8. Python程序基本知识

    Python程序基本知识 一. 数据类型与变量 1.1 变量 **变量:**在Python中不需要事先声明变量名及其类型,直接赋值即可创建各种类型的变量 x='Hello World' #创建了整型变 ...

  9. 《MySQL实战45讲》个人笔记-基础篇

    拜读了林晓斌大佬的<MySQL实战45讲>,特意做个知识点总结,以便后期回忆. 01.基础架构:一条SQL查询语句是如何执行的? Server 层包括连接器.查询缓存.分析器.优化器.执行 ...

  10. LeetCode-049-字母异位词分组

    字母异位词分组 题目描述:给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例说明请见LeetCode官网. 来源:力扣(LeetCode) 链接:https: ...