一、ipvsadm的用法
集群原理:https://blog.csdn.net/ck784101777/article/details/99753041
要使用LVS我们需要使用Ipvsadm工具去操作它,因为LVS是基于内核的,我们只能在用户层去操作
基本命令
常见用法
二、部署LVS-DR集群
1.工作过程介绍
DR模式,即(Direct Routing)直接路由模式
DR模式的网络拓扑:
1) 工作过程: 当一个client发送一个WEB请求到VIP,LVS服务器根据VIP选择对应的real-server的Pool,根据算法,在Pool中选择一台Real-server,LVS在hash表中记录该次连接,然后将client的请求包发给选择的Real-server,最后选择的Real-server把应答包直接传给client;当client继续发包过来时,LVS根据更才记录的hash表的信息,将属于此次连接的请求直接发到刚才选择的Real-server上;当连接中止或者超时,hash表中的记录将被删除。
2) DR模式的几个细节:
1> LVS和Real-server必须在相同的网段:(相同的广播域内)
DR模式在转发client的包时,只修改了包目的MAC地址为选定的Real-server的mac地址,所以如果LVS和Real-server在不通的广播域内,那么Real-server就没办法接收到转发的包。下面是mac地址的修改过程:
Cilent--->LVS选择一个真实服务器,直转真实服务器,起中间转发作用,LVS将数据包的来源MAC地址修改为自己的MAC地址,保持原CIP不变,将请求MAC地址修改为真实服务器的MAC地址(发现请求的是在规则里面存在的地址),保持VIP不变--->Real Server确保VIP是本机lo接口的换回地址,处理数据包之后直接返回给客户端(不过LVS),MAC地址仍然为LVS的MAC地址,所以在客户端看来消息是由LVS返回的
补充:lookback就是路由器上一个环回地址,它是一个虚拟的接口。 可以确保路由ID的稳定性,该接口不会出现链路失效的情况,因为Liunx有路由功能,所以支持创建环回地址
2> LVS不需要开启路由转发:
LVS的DR模式不需要开启路由转发功能,就可以正常的工作,出于安全考虑,如果不需要转发功能,最好关闭。
3> ARP问题:
通常,DR模式需要在Real-server上配置VIP,配置的方式为:
/sbin/ifconfig lo:0 inet VIP netmask 255.255.255.255
i) 原因在于,当LVS把client的包转发给Real-server时,因为包的目的IP地址是VIP,那么如果Real-server收到这个包后,发现包的目的IP不是自己的系统IP,那么就会认为这个包不是发给自己的,就会丢弃这个包,所以需要将这个IP地址绑到网卡上(绑定到虚拟网卡上);当发送应答包给client时,Real-server就会把包的源和目的地址调换(源地址为VIP,目标地址为CIP),直接回复给client。
ii) 关于ARP广播:
* 上面绑定VIP的掩码是”255.255.255.255″,说明广播地址是其本身,那么他就不会将ARP发送到实际的自己该属于的广播域了,这样防止与LVS上VIP冲突,而导致IP冲突。
* 另外在Linux的Real-server上,需要设置ARP的sysctl选项,修改配置文件
arp_announce用来限制,是否使用发送的端口的ip地址来设置ARP的源地址:
* “0″代表是用ip包的源地址来设置ARP请求的源地址。
* “1″代表不使用ip包的源地址来设置ARP请求的源地址,如果ip包的源地址是和该端口的IP地址相同的子网,那么用ip包的源地址,来设置ARP请求的源地址,否则使用”2″的设置。
* “2″代表不使用ip包的源地址来设置ARP请求的源地址,而由系统来选择最好的接口来发送。
当内网的机器要发送一个到外部的ip包,那么它就会请求路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址,而linux默认是使用ip的源ip地址作为arp里面的源ip地址,而不是使用发送设备上面的 ,这样在lvs这样的架构下,所有发送包都是同一个VIP地址,那么arp请求就会包括VIP地址和设备 Mac,而路由器收到这个arp请求就会更新自己的arp缓存,这样就会造成ip欺骗了,VIP被抢夺,所以就会有问题。现在假设一个场景来解释arp_announce:Real-server的ip地址: 202.106.1.100(public local address),172.16.1.100(private local address),202.106.1.254(VIP)如果发送到client的ip包产生的arp请求的源地址是202.106.1.254(VIP),那么LVS上的VIP就会被冲掉,因为交换机上现在的arp对应关系是Real-server上的VIP对应自己的一个MAC,那么LVS上的VIP就失效了。
“0″,代表对于arp请求,任何配置在本地的目的ip地址都会回应,不管该arp请求的目的地址是不是接口的ip;如果有多个网卡,并且网卡的ip都是一个子网,那么从一个端口进来的arp请求,别的端口也会发送回应。“1″,代表如果arp请求的目的地址,不是该arp请求包进入的接口的ip地址,那么不回应。“2″,要求的更苛刻,除了”1″的条件外,还必须要求arp发送者的ip地址和arp请求进入的接口的ip地址是一个网段的。
2.Linux部署LVS-DR集群
1.任务
- 客户端IP地址为192.168.4.10
- LVS调度器VIP地址为192.168.4.15
- LVS调度器DIP地址设置为192.168.4.5
- 真实Web服务器地址分别为192.168.4.100、192.168.4.200
- 使用加权轮询调度算法,web1的权重为1,web2的权重为2
2.拓扑图
3.Web服务器配置
web1和web2同样配置
- [root@web1 ~]# cd /etc/sysconfig/network-scripts/ //打开网卡目录
- [root@web1 ~]# cp ifcfg-lo ifcfg-lo:0 //建一张虚拟网卡 eth0:0代表在eth0上建立虚拟网卡
- //这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样,见上文
- [root@web1 ~]# vim ifcfg-lo:0
- DEVICE=lo:0
- IPADDR=192.168.4.15
- NETMASK=255.255.255.255
- NETWORK=192.168.4.15
- BROADCAST=192.168.4.15
- ONBOOT=yes
- NAME=lo:0
防止地址冲突的问题:
这里因为web1也配置与代理一样的VIP地址,默认肯定会出现地址冲突;
sysctl.conf文件写入这下面四行的主要目的就是访问192.168.4.15的数据包,只有调度器会响应,其他主机都不做任何响应,这样防止地址冲突的问题。见上文
- [root@web1 ~]# vim /etc/sysctl.conf
- #手动写入如下4行内容
- net.ipv4.conf.all.arp_ignore = 1
- net.ipv4.conf.lo.arp_ignore = 1
- net.ipv4.conf.lo.arp_announce = 2
- net.ipv4.conf.all.arp_announce = 2
- #当有arp广播问谁是192.168.4.15时,本机忽略该ARP广播,不做任何回应
- #本机不要向外宣告自己的lo回环地址是192.168.4.15
- [root@web1 ~]# sysctl -p //刷新配置
常见错误:如果重启网络后未正确配置lo:0,有可能是NetworkManager和network服务有冲突,关闭NetworkManager后重启network即可。(非必须的操作)
- [root@web1 ~]# systemctl stop NetworkManager
- [root@web1 ~]# systemctl restart network
4. 调度器配置
安装ipvsadm软件并部署LVS-DR模式调度器
- [root@proxy ~]# yum -y install ipvsadm //安装服务
- [root@proxy ~]# ipvsadm -C #清空所有规则 //安装之前情况规则
- [root@proxy ~]# ipvsadm -A -t 192.168.4.15:80 -s wrr //添加一个集群,并添加规则
- [root@proxy ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.100 -g -w 1
- //为集群配置真实服务器 -g采用dr模式 -w权重为1
- [root@proxy ~]# ipvsadm -a -t 192.168.4.15:80 -r 192.168.4.200 -g -w 1
- [root@proxy ~]# ipvsadm -Ln //查看规则
- TCP 192.168.4.15:80 wrr
- -> 192.168.4.100:80 Route 1 0 0
- -> 192.168.4.200:80 Route 2 0 0
5.客户端测试
客户端使用curl命令反复连接http://192.168.4.15,查看访问的页面是否会轮询到不同的后端真实服务器。
扩展知识:默认LVS不带健康检查功能,需要自己手动编写动态检测脚本,实现该功能:(参考脚本如下,仅供参考)
- [root@proxy ~]# vim check.sh
- #!/bin/bash
- VIP=192.168.4.15:80
- RIP1=192.168.4.100
- RIP2=192.168.4.200
- while :
- do
- for IP in $RIP1 $RIP2
- do
- curl -s http://$IP &>/dev/vnull //不输出统计消息
- if [ $? -eq 0 ];then //当这个结果不为0说明服务器输出信息有问题
- ipvsadm -Ln |grep -q $IP || ipvsadm -a -t $VIP -r $IP //如果输出结果为0代表服务器没有问题,则添加进规则
- else
- ipvsadm -Ln |grep -q $IP && ipvsadm -d -t $VIP -r $IP //如果输出结果不为0代表服务器有问题,在规则中删除这个服务器
- fi
- done
- sleep 1 //睡眠1s 刷新检查时间为一秒
- done
- [root@proxy ~]#./check.sh & //把这个脚本挂到后台
- [root@client ~]#curl 192.168.4.15:80 //客户端反复测试,检测到结果轮流出现则表示实验成功