一、原理
负载均衡器和RS都使用同一个IP对外服务。但只有DB对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DB,而DB收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。
优点:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与LVS-TUN相比,LVS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。
缺点:(不能说缺点,只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上。
二、环境准备
集群中所有主机关闭防火墙和selinux
在/etc/profile中配置每台主机的ip解析(不想用域名的话可不做此步骤)
集群中每台安装好并启动保证能访问到页面并写入数据加以区分
虚拟机网络使用NAT模式
DR模式要求Director DIP 和 所有RealServer RIP必须在同一个网段及广播域
所有节点网关均指定真实网关
本次练习以一台作为lvs服务器两台作为WEB服务器(共三台)
三、Director分发器配置(lvs服务器配置)
1、配置vip(虚拟ip)
[root@server ~]# ip addr add dev ens33 192.168.85.222/32 #设置VIP
[root@erver ~]# yum install -y ipvsadm #RHEL确保LoadBalancer仓库可用
(下面可做可不做)
[root@server ~]# service ipvsadm start #启动
注意:启动如果报错: /bin/bash: /etc/sysconfig/ipvsadm: 没有那个文件或目录
需要手动生成文件
---------------------------------------------------------------
[root@server ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
2、定义LVS分发策略
-A:添加VIP
-t:用的是tcp协议
-a:添加的是lo的vip地址
-r:转发到realserverip
-s:算法
-L|-l –list #显示内核虚拟服务器表
--numeric, -n:#以数字形式输出地址和端口号
-g --gatewaying #指定LVS工作模式为直接路由器模式DR(也是LVS默认的模式)
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
rr:轮循
如果添加ip错了,删除命令如下:
# ip addr del 192.168.85.222 dev ens33
(之前没配置的不用清理)
[root@server ~]# ipvsadm -C #清除内核虚拟服务器表中的所有记录。
(绑定vip与另外两个WEB服务器)
[root@server ~]# ipvsadm -A -t 192.168.85.222:81 -s rr
[root@server ~]# ipvsadm -a -t 192.168.85.222:81 -r 192.168.85.129 -g
[root@server ~]# ipvsadm -a -t 192.168.85.222:81 -r 192.168.85.132 -g
[root@server ~]# service ipvsadm save #保存方式一,使用下面的保存方式,版本7已经不支持了
[root@server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm #保存方式二,保存到一个文件中(一般用这个)
3、所有RS配置
(以下两台real-server都操作,操作都一样)前提是安装好nginx并能访问到默认页面并加以区分
[root@server1 ~]# ip addr add dev lo 192.168.85.222/32 #在lo接口上绑定VIP
[root@server1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播
[root@server1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包
[root@server1 ~]# systemctl start nginx
或者 /usr/local/nginx/sbin/nginx -s reload #重启nginx
=========================================================================================
因为:realServer的vip有了,接着就是同一个网段中拥有两个vip, 客户端在网关发送arp广播需找vip时需要让realServer不接受响应.
解决:
echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore
arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的设备没有这个ip,就不做出响应(这个ip在lo上,lo不是接收设备的进口)
echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce
使用最好的ip来回应,什么是最好的ip?同一个网段内子网掩码最长的
(修改后端nginx服务器的长连接)
[root@server1 ~]# vim /etc/nginx/nginx.conf
keepalive_timeout 0;
访问VIP(虚拟ip)进行测试
完成!!!