技术准备:
1.对OSI7层网络架构理论有基本认识 对交换机 路由器 实现交换通信原理有基本认识
2.熟悉基本linux 操作
3.对vm软件及 网卡的桥接、nat模式、仅主机模式有一定了解(保证虚拟机里的linux系统可以访问外网)
软件环境:
一台win7/xp电脑 ,一个vm软件,一个linux镜像,每台虚拟机上都安装好apache,开启httpd服务,能本地浏览器web访问
Lvs nat模式 实现步骤:
网络结构图:
1.如图所示配置好 vm1 网卡的 ip地址和子网掩码 不需要设置网关等
2.如图所示 建立好3台linux虚拟机 一台名字设为lvsserver 其余2台名字设为realserver1 和realserver2,此处要注意,lvsserver里面要添加2块网卡 (如何在虚拟机里面添加2块网卡自行百度之)
3.然后开始设置 这3台虚拟机的 网卡的 网络连接模式,其中 lvsserver 的第一块网卡 选择 自定义-》特定虚拟网络 vmnet1 lvsserver的第二块 网卡 选择 自定义-》特定虚拟网络vmnet2剩下的2台realserver的网卡都设置成自定义-》特定虚拟网络vmnet2
4.接下来开始配置lvserver的网卡信息:其中第一块vmnet1的网卡 如图eth0的配置
第二块网卡 如图 eth1的配置(下图所示注释#部分均可忽略)
5.然后配置 两台readserver的网卡信息:各自如图所示,记得一定要将这2台服务器的默认网关设置为 lvsserver第二块网卡的ip地址 即 192.168.10.1(下图所示#部分也忽略不计,网关配置为192.168.10.1即可)
6.最后 在lvsserver上 yum安装 ipvsadm这个工具 并且开启 nat转发模式:命令为
,当cat为1时 即为开启nat (此处一定要注意:网络服务重启时 这里的1会自动变成0,笔者被坑了好久,这里。即每次执行service network restart时,这里的1会变为0)
然后设置 转发规则:
命令如下 : ipvsadm -C //清空规则配置信息
8.实验结果展示:
到此 lvs nat模式 实验成功。
相比于nginx只能用于7层负载均衡,LVS就比较强大了,能在4层做负载均衡。而且性能和稳定性上LVS也比较占优,毕竟是合入内核模块,不稳定肯定不行。
LVS通过工作于内核的ipvs模块来实现功能,其主要工作于netfilter的INPUT链上。除此之外,还需要一个用户态工具,ipvdadm,用于用户负载集群定义和集群服务管理。
LVS DR模式的流程大概如下:
1、客户端发送请求至VIP,也就是访问服务,请求报文源地址是CIP,目标地址为VIP;
2、LVS调度器接收到请求,报文在PREROUTING链检查,确定目的IP是本机,于是将报文发送至INPUT链,ipvs内核模块确定请求的服务是我们配置的LVS集群服务,然后根据用户设定的均衡策略选择某台后端RS,并将目标MAC地址修改RIP的MAC地址。因为调度器和后端服务器RS在同个网段,因此直接二层互通,将请求发给选择的RS处理;
3、因为报文目的mac是本机,且RS上有配置VIP,因此RS能接收该报文。后端服务处理完请求后,将响应直接发往客户端,此时源IP地址为VIP,目标IP为CIP。
如下,准备三台服务器,
机器 作用
192.168.0.100 VIP,LVS调度器对外服务IP
192.168.0.200 RIP,后端web服务器之一
192.168.0.300 RIP,后端web服务器之二
上面我们说过lvs依赖于ipvs内核模块,和ipvsadm用户态工具。因为centos 7已经默认加载ipvs模块,因此这一步我们不需要配置。我们只需要安装ipvsadm工具即可,
yum install -y ipvsadm
然后在LVS调度器上配置VIP,这里我们采用虚拟网卡,当然也可以使用独立网卡配置,
ifconfig eth0:0 192.168.0.100/24 up
接着配置LVS集群服务,
[root@CentOS-7-2 ~]# ipvsadm -C
[root@CentOS-7-2 ~]# ipvsadm -A -t 192.168.0.100:80 -s rr
[root@CentOS-7-2 ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.200:80 -g
[root@CentOS-7-2 ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.300:80 -g
其中,
第一条命令是清空所有规则;
第二条命令是定义LVS服务,并指定负责均衡策略为rr,即轮询;
第三、四条命令各添加一台后端web服务器,作为负载均衡节点,并指定为DR模式。
ipvsadm基本命令参数如下:
-A 指定添加的LVS负载均衡虚拟服务
-t 指定虚拟服务器的IP地址和端口
-s 指定调度算法,ss为轮询,wrr为加权轮询,dh为目标地址散列,sh为源地址散列,lc为最少链接等
-a 在对应的VIP下添加RS节点
-g 指定LVS的工作模式为DR模式
-l 指定LVS的工作模式为tunnel模式
-m 指定LVS的工作模式为NAT模式
添加完后端RS,我们可以查看此LVS对应的均衡规则,
[root@CentOS-7-2 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
->RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.100:80 rr
->192.168.0.200:80 Route 1 0 0
->192.168.0.300:80 Route 1 0 0
这里web服务器使用nginx搭建,因此在两台RS上安装nginx,
yum install -y nginx
同时为了后面测试,我们修改web服务器的index.html内容,
[root@192_168_0_200 ~]# cat /usr/share/nginx/html/index.html
This is 192.168.0.200
[root@192_168_0_300 ~]# cat /usr/share/nginx/html/index.html
This is 192.168.0.300
接着开始进行LVS相关配置,
首先将VIP配置在lo接口上,(注意掩码要配置成32位,不然RS通信会出问题)
ifconfig lo:0 192.168.0.100/32 up
接着配置对应路由,
route add -host 192.168.0.100 dev lo
然后设置相关系统参数,
echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce
echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
其实严格意义上只要配置出口网卡的对应参数就可以了,配置all也只是为了保险而已,文章最后面会有说明。
使用curl命令对vip进行访问,
[root@CentOS-7-3 /home]# curl http://192.168.0.100:80
This is 192.168.0.200
[root@CentOS-7-3 /home]# curl http://192.168.0.100:80
This is 192.168.0.300
[root@CentOS-7-3 /home]# curl http://192.168.0.100:80
This is 192.168.0.200
[root@CentOS-7-3 /home]# curl http://192.168.0.100:80
This is 192.168.0.300
可见结果符合我们设置的轮询策略。
因为当调度器把请求转发给对应RS时,并没有修改报文目的IP,因此请求报文目的IP仍为VIP,所以如果RS没有配置VIP,那么报文到达RS后就会被丢弃。
arp_ignore=1:只响应目的IP地址为接收网卡上的本地地址的arp请求
因为我们在RS上都配置了VIP,因此此时是存在IP冲突的,当外部客户端向VIP发起请求时,会先发送arp请求,此时调度器和RS都会响应这个请求。如果某个RS响应了这个请求,则之后该客户端的请求就都发往该RS,并没有经过LVS,因此也就没有真正的负载均衡,LVS也就没有存在的意义。因此我们需要设置RS不响应对VIP的arp请求,这样外部客户端的所有对VIP的arp请求才会都解析到调度器上,然后经由LVS的调度器发往各个RS。
系统默认arp_ignore=0,表示响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。也就是说,如果机器上有两个网卡设备A和B,即使在A网卡上收到对B IP的arp请求,也会回应。而arp_ignore设置成1,则不会对B IP的arp请求进行回应。由于lo肯定不会对外通信,所以如果只有一个对外网口,其实只要设置这个对外网口即可,不过为了保险,很多时候都对all也进行设置。
arp_announce=2:网卡在发送arp请求时使用出口网卡IP作为源IP
当RS处理完请求,想要将响应发回给客户端,此时想要获取目的IP对应的目的MAC地址,那么就要发送arp请求。arp请求的目的IP就是想要获取MAC地址的IP,那arp请求的源IP呢?自然而然想到的是响应报文的源IP地址,但也不是一定是这样,arp请求的源IP是可以选择的,而arp_announce的作用正是控制这个地址如何选择。系统默认arp_announce=0,也就是源ip可以随意选择。这就会导致一个问题,如果发送arp请求时使用的是其他网口的IP,达到网络后,其他机器接收到这个请求就会更新这个IP的mac地址,而实际上并不该更新,因此为了避免arp表的混乱,我们需要将arp请求的源ip限制为出口网卡ip,因此需要设置arp_announce=2。
由上可知,只要RS上的VIP不响应arp请求就可以了,因此不一定要配置在lo上,也可以配置在其他网口。由于lo设备不会直接接收外部请求,因此只要设置机器上的出口网卡不响应非本网卡上的arp请求接口。但是如果VIP配置在其他网口上,除了上面的配置,还需要配置该网口不响应任何arp请求,也就是arp_ignore要设置为8。
这是由于lo设备的特殊性导致, 如果lo绑定192.168.0.200/24,则该设备会响应该网段所有IP(192.168.0.1~192.168.0.254) 的请求,而不是只响应192.168.0.200这一个地址。
根据DR模式的原理,调度器只修改请求报文的目的mac,也就是转发是在二层进行,因此调度器和RS需要在同一个网段,从而ip_forward也不需要开启。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)