最近项目上需要使用到IPVS进行负载均衡,针对外部传来的HTTP请求,分摊到多台服务器上进行处理,所以看了一下这方面的资料,在这里纪录一下。

Lvs是基于IP层和内容分发请求的负载均衡方法(所以也可以叫IPVS)。所谓负载均衡,就是分担给多个服务器进行处理。

IPVS有三种常见的负载均衡技术,NAT/DR/TUN 三种方式。也算是有各自的优劣点吧。

_ VS/NAT VS/TUN VS/DR
Server any Tunneling Non-arp device
server network private LAN/WAN LAN
server number low (10~20) High (100) High (100)
server gateway load balancer own router Own router
先放出官方对比的表。
因为是在内部网络下搭建的,所以我们使用的方法是在一台机器上面创建多个虚拟机的方式进行模拟多个机器的方式进行测试,这样可以避免中间因为网络情况复杂,而且对实践还不太明白的时候出现太多错误。

1.IPVS/NAT模式:这种模式下由一台负载均衡服务器充当网关,将消息转发给后台几台web server进行处理,后台服务器将对应的response回应给负载均衡服务器,再返回给各个用户,这样用户也不会感知到有实际服务器的存在,类似于反向代理。但是这种模式下的负载均衡服务器容易成为瓶颈。

在这里,我直接使用了负载均衡服务器充当了网关,所以后面几台服务器的路由都要指向它。

中间遇到的坑是:

(1)由于在虚拟机中按NAT分配的时候,会自动给虚拟网络的路由表分配一条指向默认网关的路由规则,如果直接添加的时候,会出现curl: (56) Recv failure: Connection reset by peer, 这种情况需要仔细检查下路由表。

2.IPVS/DR模式,这种模式下需要将负载均衡服务器和后台的real server在物理上在一个网段内。在负载均衡服务器接受到请求之后,可以直接将数据帧的MAC地址写成对应的选出的real server的mac地址。并且由该服务器直接返回给对应的请求者。

配置的时候主要要记得关闭real server的arp表发现和更新功能,这样可以避免request无法转发到合适的服务器。

3 IPVS/TUN模式,这种模式运用IP隧道模式,甚至可以直接在IP包外层封装IP包,再将对应的链接转发给指定的real server, 由对应的real server将IP包处理,关于包的细节可以用wireshark进行监听查看。

中间用WireShark抓的包如下图所示。

这里主要的坑是在设置webServer的时候,记得将 rp_filter  参数关闭掉。rp_filter的作用是控制系统是否开启对数据包源地址的校验,会检测反向路径是否是最佳路由路径(严格)/或者是否能通(宽松),不是就丢掉。如果不关掉可能会出现有些请求显示被转发给real server,但是对应的real server并没有响应纪录。

关于IPVS的几种负载均衡算法,这里只测试了rr/wrr/lc/wlc方式,而其他两种针对访问的目的地址去做负载均衡的方法,找了很多资料之后实在无法理解到,先纪录在这里。

关于IPVS的一些调试方法:

1、使用route和ping,tcpdump等工具检查对应的网络连接情况。

2、使用ipvsadm的命令查看转发情况和转发tcp/UDP状态

root@roaddb-VirtualBox:/home/roaddb# ipvsadm -l --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.69.142.28:http 100 564 432 40110 83556
-> 10.0.2.4:http 33 231 165 16995 37290
-> 10.0.2.5:http 33 231 165 16995 37290
-> 10.0.2.15:http 34 102 102 6120 8976
root@roaddb-VirtualBox:/home/roaddb# ipvsadm -l -c
IPVS connection entries
pro expire state source virtual destination
TCP 00:52 SYN_RECV 10.69.142.70:57004 10.69.142.80:http 10.69.142.73:http
3.检查对应的Nginx log确认转发的情况。

关于keepalived,keepalived主要用来做前端负载均衡服务器的备份,可以在负载均衡服务器挂掉的时候自动使用backup机进行替换,并且对后端的真实服务器可以起监督作用,当有真实服务器挂掉的时候,通过把权重置位0的方式迅速的切换过来。keepalived的原理是路由选举算法。文档地址:http://www.keepalived.org/doc/

keepalived的配置项中主要有两个配置要注意:

(1)inhibit_on_failure 这个参数主要是为了监视真实服务器的情况,在挂掉的情况下可以不转发给这个服务器,起起来的时候也可以重新配回规则

(2)persistence_timeout 这个是连接的粘连参数,可以在一段时间内把链接都转发给选定的服务器。

进一步进行备份的还有heartbeat等,说是比keepalived的功能更强大[doing]

参考连接网页:https://www.cnblogs.com/kevingrace/p/6248941.html
————————————————
版权声明:本文为CSDN博主「skiworld」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yanxiaobugyunsan/article/details/79265105

ubuntu 12.04 下LVS的一些搭建心得和资料整理的更多相关文章

  1. Ubuntu 12.04下PHP环境的搭建(LAMP)

    1.首先打开命令行,切换到root身份,获得最新的软件包 su root sudo apt-get install update 2.安装MySQL数据库 sudo apt-get install m ...

  2. Ubuntu 12.04下LAMP环境的搭建

    首先 apt-get install update 一下 sudo apt-get install update 安装MySQL 的服务端和客户端 sudo apt-get install mysql ...

  3. Angularjs学习---angularjs环境搭建,ubuntu 12.04下安装nodejs、npm和karma

    1.下载angularjs 进入其官网下载:https://angularjs.org/‎,建议下载最新版的:https://ajax.googleapis.com/ajax/libs/angular ...

  4. Ubuntu 12.04下Hadoop 2.2.0 集群搭建(原创)

    现在大家可以跟我一起来实现Ubuntu 12.04下Hadoop 2.2.0 集群搭建,在这里我使用了两台服务器,一台作为master即namenode主机,另一台作为slave即datanode主机 ...

  5. Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程

    Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程Linux版本:Ubuntu 12.04 内核版本:Linux 3.5.0 交叉编译器版本:arm-linux-gcc-4. ...

  6. 升级Ubuntu 12.04下的gcc到4.7

    我们知道C++11标准开始支持类内初始化(in-class initializer),Qt creator编译出现error,不支持这个特性,原因在于,Ubuntu12.04默认的是使用gcc4.6, ...

  7. 在Ubuntu 12.04下采用apt-get的方法安装Qt4

    在Ubuntu 12.04下采用apt-get的方法安装Qt4 注:之前发表的一篇博客是采用编译源码的方式安装Qt4,这是很有用的方式,因为源码安装对于所有系统都是通用的,其次,在使用交叉编译器的时候 ...

  8. Ubuntu 12.04下GAMIT10.40安装说明

    转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0225/164.html?1456481297 Ubuntu 12.04下GAMIT10.40安装步 ...

  9. [转]ubuntu(12.04)下, 命令 ,内核 源代码的获取

    [转]ubuntu(12.04)下, 命令 ,内核 源代码的获取 http://blog.chinaunix.net/uid-18905703-id-3446099.html 1.命令:例如:要查看l ...

随机推荐

  1. mysql kill所有Sleep/Execute进程

    现查出需要kill的进程: SELECT GROUP_CONCAT(CONCAT('kill ',id) SEPARATOR '; ') AS cmd FROM information_schema. ...

  2. 四十二.部署MongoDB服务 、 MongoDB基本使用

    1. 部署MongoDB服务  192.168.4.50 创建服务工作目录 ]# mkdir /usr/local/mongodb ]# cd /usr/local/mongodb/ ]# mkdir ...

  3. bzoj 4240: 有趣的家庭菜园 树状数组+贪心

    有一个小性质:就是一个下标排列的最小移动次数就是逆序对数. 我们发现最终形态一定是一个波峰. 那么我们求的就是形成波峰的下标最少逆序对数. 考虑将元素从小到大依次插入. 那么,对于第 $i$ 个元素, ...

  4. Cogs 2221. [SDOI2016 Round1] 数字配对(二分图)

    [SDOI2016 Round1] 数字配对 ★★★ 输入文件:menci_pair.in 输出文件:menci_pair.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 有 ...

  5. 爬虫(四):BeautifulSoup库的使用

    一:beautifulsoup简介 beautifulsoup是一个非常强大的工具,爬虫利器. beautifulSoup “美味的汤,绿色的浓汤” 一个灵活又方便的网页解析库,处理高效,支持多种解析 ...

  6. YII框架的类自动加载机制

    YII之所以能实现快速的自动加载类文件,是因为它通过两种途径来实现. 先看文件 vendor\yiisoft\yii2\BaseYii.php 里面的 autoload 方法 public stati ...

  7. 二分图匹配——p3386 p2071 p2319 p1129(矩阵游戏)

    ---恢复内容开始--- 二分图,就是给你一个图,可以将点分为两部分,每一部分的点都能唯一映射到另一个集合里,也就是有连边: 注:以下转自 http://blog.csdn.net/dark_scop ...

  8. Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)

    答:赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个. 浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改 ...

  9. Mac下不能成功打开uiautomatorviewer的问题解决

    在终端运行uiautomatorviewer之后出现下面的错误,检查以后发现环境变量也配置好了 Error: Could not create the Java Virtual Machine. Er ...

  10. rpm包和deb分别是什么?

    一.RMP 是 LINUX 下的一种软件的可执行程序,你只要安装它就可以了.这种软件安装包通常是一个RPM包(Redhat Linux Packet Manager,就是Redhat的包管理器),后缀 ...