首先我们说说LVS要解决的问题场景:
快递公司在北京建立了一个快递点,每天能处理50个人寄快递,由于快递需求增加每天要处理150个人, 如下图:
为了解决这个问题, 快递公司又在北京建立了2个快递点,他们的规划是这样子的如图:
但实际使用上发现结果是这样子的
为了解决分配不均的问题, 领导决定建立一个营业中心,用户打电话给营业中心,统一分配快递由哪个快递点处理
上面就是lvs的第一种工作模式:【基于NAT的LVS模式负载均衡】,这是基于3层(网络层)的工作模式,实现原理如下:
为 什 么 要 修 改 i p 呢 ? \color{red} 为什么要修改ip呢? 为什么要修改ip呢?
第 二 步 如 果 不 修 改 , 目 标 i p 还 是 122.168.1.15 还 是 就 无 法 发 给 14 这 台 服 务 器 \color{red} 第二步如果不修改, 目标ip还是122.168.1.15还是就无法发给14这台服务器 第二步如果不修改,目标ip还是122.168.1.15还是就无法发给14这台服务器
第 四 部 不 修 改 源 i p 。 客 户 端 和 原 来 的 目 标 i p 比 较 , 发 现 不 是 同 一 个 , 那 就 会 被 抛 弃 \color{red} 第四部不修改源ip。客户端和原来的目标ip比较,发现不是同一个, 那就会被抛弃 第四部不修改源ip。客户端和原来的目标ip比较,发现不是同一个,那就会被抛弃
但这时候又出现了问题, 由于营业中心的工作人员(暂称:客服MM),每天不光要接待寄快递的用户, 还要对接收快递的工作人员(暂称:快递小哥),这使得客服MM承受了巨大的工作负荷
领导为了减轻客服MM的工作压力,领导觉得优化一下工作流程:让快递小哥直接找用户对接
上面就是lvs的第二种工作模式:【基于DR的LVS负载均衡】, 这个模式是基于2层(数据链路层)
由于双十一快递用户增加,而又无法在北京继续扩建快递点,已有的快递点和营业中心无法满足业务需要,出现了如下图情况
为了解决这个问题。领导准备研发 快递小哥(微信小程序),让系统去调度由哪个快递点处理,如果业务麻烦的时候, 系统会增加周边的快递节点分担压力
上面就是lvs的第二种工作模式:【基于TUN的LVS负载均衡】, 这个模式是基于3层(网络层)
以下是DNET的LVS负载均衡步骤
准备3个虚拟机
- lvs 配置两个网卡 ip: 192.168.133.248(外网) 172.168.0.248(内网)
- real server 172.168.0.247
- real server 172.168.0.246
1. 配置双网卡, 查看到第二块网卡名字叫做 ens36: [root@localhost ~]# ifconfig -a ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 [root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens36 [root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens36 IPADDR=172.16.0.248 NETMASK=255.255.0.0 #GATEWAY=192.168.133.2 这个不需要配置 [root@localhost ~]# systemctl restart network 2. 192.168.133.248 安装lvs服务 [root@localhost ~]# yum install ipvsadm -y [root@localhost ~]# ipvsadm -A -t 192.168.133.248:80 -s rr [root@localhost ~]# ipvsadm -a -t 192.168.133.248:80 -r 172.16.0.246 -m -w 1 [root@localhost ~]# ipvsadm -a -t 192.168.133.248:80 -r 172.16.0.247 -m -w 1 [root@localhost ~]# echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter [root@localhost ~]# echo 0 > /proc/sys/net/ipv4/conf/ens33/rp_filter [root@localhost ~]# echo 0 > /proc/sys/net/ipv4/conf/ens36/rp_filter [root@localhost ~]# echo 1 >> /proc/sys/net/ipv4/ip_forward 3. 172.168.0.246/247 配置网卡 IPADDR=172.16.0.246/172.16.0.247 NETMASK=255.255.0.0 GATEWAY=172.16.0.248
以下是DR的LVS负载均衡步骤
准备3个虚拟机
- lvs ip192.168.133.245
- real server 192.168.133.246
- real server 192.168.133.245
1. lvs 上增加网卡的物理ip [root@localhost ~]# ifconfig ens33:2 192.168.133.245/24 2. 调整后端服务器协议 [root@localhost ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore [root@localhost ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore [root@localhost ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce [root@localhost ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce 3. 配置后端服务器隐藏ip [root@localhost ~]# ifconfig lo:2 192.168.133.245 netmask 255.255.255.255 4. 安装lvs服务 [root@localhost ~]# yum install ipvsadm -y [root@localhost ~]# ipvsadm -A -t 192.168.133.245:80 -s rr [root@localhost ~]# ipvsadm -a -t 192.168.133.245:80 -r 192.168.133.246 -g -w 1 [root@localhost ~]# ipvsadm -a -t 192.168.133.245:80 -r 192.168.133.247 -g -w 1 [root@localhost ~]# ipvsadm -ln
/proc/sys/net/ipv4/conf/all/arp_ignore arp_ignore参数常用的取值主要有0,1,2,3~8较少用到
- 0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。
- 1:只响应目的IP地址为接收网卡上的本地地址的arp请求。
- 2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。
- 3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
- 4~7:保留未使用
- 8:不回应所有的arp请求
sysctl.conf中包含all和eth/lo(具体网卡)的arp_ignore参数,取其中较大的值生效。
/proc/sys/net/ipv4/conf/all/arp_announce- 0:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用数据包a的源IP。
- 1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。
- 2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。
sysctl.conf中包含all和eth/lo(具体网卡)的arp_ignore参数,取其中较大的值生效