前言
我们知道nginx是7层的代理,相对于lvs这种四层代理来说,肯定效率没有lvs来的好。一个nginx能够支撑的并发数是5w。那为什么lvs的效果会更好,可以先看下,我写的这篇关于lvs出现诞生的理论:xxx(后面补充)
今天主要是通过本地做一个实验,来验证下lvs通过DR(直接路由模型)进行负载均衡。
一、网络拓扑搭建
主要通过vmware搭建,网络地址规划如下
主机名 | IP地址 | 虚拟IP地址(vip) | 服务 |
---|---|---|---|
node01 | 192.168.17.132 | 192.168.235.100 | lvs服务 |
node02 | 192.168.235.129 | 192.168.235.100 | apache http服务 |
node03 | 192.168.235.130 | 192.168.235.100 | apache http服务 |
拓扑图如下:
二、操作
1.网络层操作
请按步骤进行操作,一定要先网络层操作,把内核的arp不通告出去,然后再在node02和node03上的lo回环口上新增vip地址。理由是如果先在node02和node03上新增了vip,那么这个vip就通告出去。
1.1关闭内核中arp通告
为什么需要关闭node02和node03的arp通告?
理由是,我们知道一个网络拓扑中只能有一个ip地址,不能重复,如果node02和node03都通告说自己有vip地址,那么必然和node01上面的vip地址冲突报错。
先了解下概念
我们需要在 /proc/sys/net/ipv4/conf/IF/ 目录下根据我们需要选择配置;
arp_ignore和arp_announce 默认配置为0
第一个参数arp_ignore的含义是,别人来问我,如果是默认配置0,那么我会把我机器上面所有除了lo回环口上面的所有ip的mac地址回复给对方。如果配置为1,那我只回复,我接到你arp请求接口的mac地址。
第二个参数arp_announce的含义是,当我开机或者网络重启,我会向网络中通告自己机器上面的ip和mac。如过是默认配置0,则表示会把自己机器上面除回环口,所有的ip和mac地址都通告出去。其实我对1和2的区别不是特别清楚,查看了一些资料,也没有找到具体区别。但是在lvs中一定要设置为2。意思是将我机器上与其他机器相连接口的ip地址通告出去。而回环口的地址就不会通告出去
arp_ignore: 定义接收到ARP请求时的响应级别;
0:只要本地配置的有相应地址,就给予响应;
1:仅在请求的目标(MAC)地址配置请求
到达的接口上的时候,才给予响应;
arp_announce:定义将自己地址向外通告时的通告级别;
0:将本地任何接口上的任何地址向外通告;
1:试图仅向目标网络通告与其网络匹配的地址;
2:仅向与本地接口上地址匹配的网络进行通告;
切记修改配置文件的时候,不能使用vi 因为使用vi会额外生成一个隐藏文件,而/proc目录本身并不存在于磁盘,他是机器开机后,把linux内存映射成这么一个/proc目录供我们查看修改。
使用echo重定向就可以
在node02和node03上执行该操作
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
1.2增加vip地址
在node02和node03上执行下面的操作,在lo回环口上新增vip地址
切记这里一定要设置掩码4个255.
理由是如果设置为192.168.235.100/24那么对于路由表就会出现两条记录都同时指向192.168.235.0/24的网络,那对于机器来说就傻了,他就不知道该把192.168.235.xx的数据包该往哪里出去了。
ifconfig lo:0 192.168.235.100 netmask 255.255.255.255
2.应用层安装
在node02和node03上执行下面的操作,安装apache服务器
yum install httpd -y
systemctl start httpd
在node02上执行
echo ”node02“ > /var/www/html/index.html
在node02上执行
echo ”node03“ > /var/www/html/index.html
在本地浏览器访问node02和node03地址看到不同页面证明应用层web服务部署ok
3.LVS安装
linux内核各个发行版默认都已经安装了LVS模块,而我们只需要安装客户端与LVS模块进行交互执行命令
在node01上安装ipvsadm
yum install ipvsadm -y
常用一些命令
管理集群服务
添加:-A -t|u|f service-address [-s scheduler]
-t: TCP协议的集群
-u: UDP协议的集群
service-address: IP:PORT
-f: FWM: 防火墙标记
service-address: Mark Number
修改:ipvsadm -E
删除:ipvsadm -D -t|u|f service-address
管理集群服务中的RS
添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-t|u|f service-address:事先定义好的某集群服务
-r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
[-g|i|m]: LVS类型
-g: DR
-i: TUN
-m: NAT
[-w weight]: 定义服务器权重
修改:-e
删除:-d -t|u|f service-address -r server-address
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 –g
# ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -g
查看
-L|l
-n: 数字格式显示主机地址和端口
--stats:统计数据
--rate: 速率
--timeout: 显示tcp、tcpfin和udp的会话超时时长
-:c 显示当前的ipvs连接状况
删除所有集群服务
-C:清空ipvs规则
保存规则
-S
# ipvsadm -S > /path/to/somefile
载入此前的规则:
-R
# ipvsadm -R < /path/form/somefile
#指定lvs将转发哪个vip的地址
ipvsadm -A -t 192.168.235.100:80 -s rr
#指定将vip 转发到哪几个real server 上
ipvsadm -a -t 192.168.235.100:80 -r 192.168.235.129 -g -w 1
ipvsadm -a -t 192.168.235.100:80 -r 192.168.235.130 -g -w 1
#查看最后的配置
ipvsadm -ln
ipvsadm -lnc 查看偷窥记录本
TCP 00:57 FIN_WAIT 192.168.150.1:51587 192.168.150.100:80 192.168.150.12:80
FIN_WAIT: 连接过,偷窥了所有的包
SYN_RECV: 基本上lvs都记录了,证明lvs没事,一定是后边网络层出问题;在搭建过程中,我就遇到过,问题现象是数据包syn包已经到达real server 但是real server 到不了我浏览器主机,问题是我windows开启了防火墙,关闭就ok
4.验证测试
在windows浏览器上输入http://192.168.235.100/ 然后刷新页面,查看是否页面发生变化
结果如下
成功搭建了简易版的lvs
总结
lvs的搭建成功。实际高并发网络环境下,我们还需要搭建lvs的高可用。今天的实验只是搭建基础版。
在lvs 中DR直接路由模型中,vip的地址和real server的地址要在同一个网段。不然real server 收到数据包就不会返回给客户端实,这个问题点,目前我还未找到原因