1、Client 向目标 VIP 发出请求,Director(负载均衡器)接收。此时源MAC 地址为Client MAC地址,目标MAC地址为 调度器Director 的MAC地址。
2、Director 根据负载均衡算法选择 RealServer_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer_1的MAC地址,然后在局域网上发送。此时源MAC地址为Director的MAC地址,目的MAC地址为RealServer_1的MAC地址。
3、RealServer_1收到这个帧,解封装后发现目标IP与本机匹配(RealServer事先绑定了VIP),于是处理这个报文。随后重新封装报文,将响应报文通过 lo 接口传送给物理网卡然后向外发出。此时源MAC地址为RealServer_1的MAC地址,目的MAC地址为Client的MAC地址。
4、Client将收到回复的报文。Client 认为得到正常的服务,而不会知道是哪一台服务器处理的。
注意:如果跨网段,则报文通过路由器经由Internet返回给用户
在LVS-DR负载均衡集群中,负载均衡与节点服务器都要配置相同的VIP地址。
在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱。
RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址。
发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址
路由器收到ARP请求后,将更新ARP表项
原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址
路由器根据ARP表项,会将新来的请求报文转发给RealServer,导致Director的VIP失效
解决方法:
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
(1)、 Director Server 和Real Server 必须在同一-个物理网络中。
(2)、Real Server可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对RIP进行直接访问。
(3)、Director Server作为群集的访问入口,但不作为网关使用。
(4)、所有的请求报文经由Director Server, 但回复响应报文不能经过Director Server。
(5)、Real Server 的网关不允许指向Director Server IP,即 Real Server 发送的数据包不允许经过Director Server。
(6)、Real Server 上的 lo 接口配置 VIP的IP地址。
服务器 | IP地址配置 | 需要的工具 |
---|---|---|
主负载调度器(Director1) | ens33:192.168.41.120 | ipvsadm、keepalived(热备) |
备负载调度器(Director2) | ens33:192.168.41.130 | ipvsadm、keepalived |
web服务器1 | ens33 192.168.41.140 | —— |
lo:0 (VIP): | 192.168.41.200 | httpd |
web服务器2 | ens33 192.168.41.150 | —— |
lo:0 (VIP): | 192.168.41.200 | httpd |
centos客户端 | 192.168. | web浏览器 |
centos客户端 | 192.168. | web浏览器 |
ntpdate ntp1.aliyun.com
yum -y install ipvsadm keepalived #yum安装ipvsadm和keepalived安装包
modprobe ip_vs #加载ip_vs模块
cat /proc/net/ip_vs #查看ip_vs版本信息
cd /etc/sysconfig/network-scripts/
cp -p ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0 #删除原本内容,添加以下内容
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.41.200
NETMASK=255.255.255.255
ifup ens33:0 #开启
vim /etc/sysctl.conf #编辑配置文件(在尾行添加)
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p #刷新
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -C #清除表中所有记录
ipvsadm -A -t 192.168.41.200:80 -s rr ##指定的虚拟IP为ens33网卡ip,启动keepliaved后会自动绑定虚拟网卡
ipvsadm -a -t 192.168.41.200:80 -r 192.168.41.140:80 -g #若隧道模式,-g替换为-i
ipvsadm -a -t 192.168.41.200:80 -r 192.168.41.150:80 -g #指定一条新的vip服务器真实地址为192.168.41.150,工作模式为DR
ipvsadm
ipvsadm -ln #查看节点状态,Router代表DR模式
systemctl stop firewalld.service
setenforce 0
#此地址仅用作发送Web响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)。
因此使用需接口lo:0来承载VIP地址,并为本机添加一条路由记录,将访问VIP的数据限制在本地,以避免通信紊乱
cd /etc/sysconfig/network-scripts ##需要将ens33的网关和DNS注释
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.41.200
NETMASK=255.255.255.255
ifup lo:0
ifconfig lo:0
##禁锢路由
route add -host 192.168.41.200 dev lo:0
或者vim /etc/rc.local
/sbin/route add -host 192.168.41.200 dev lo:0
chmod +x /etc/rc.d/rc.local
vim /etc/sysctl.conf
......
net.ipv4.conf.lo.arp_ignore = 1 #系统只响应目的IP为本地IP的ARP请求
net.ipv4.conf.lo.arp_announce = 2 #系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
##下载安装httpd
yum -y install nfs-utils rpcbind httpd
systemctl start rpcbind
systemctl start httpd
web1:
vim /var/www/html/index.html
<html>
<body>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<h1>this is 去冰 web</h1>
</body>
</html>
web2:
vim /var/www/html/index.html
<html>
<body>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<h1>this is 三分甜 web</h1>
</body>
</html>
在客户端使用浏览器访问http://192.168.41.200,默认网关指向192.168.41.200
可以在浏览器上查看网页(不断刷新),同时在负载调度器上实时观察
watch -n 1 ipvsadm -Lnc
#备份一下配置文件
cd /etc/keepalived
cp keepalived.conf keepalived.conf.bak
配置文件
vim keepalived.conf
global_defs { #定义全局参数
router_id lvs_01 #热备组内的设备名称不能一致
}
vrrp_instance vi_1 { #定义VRRP热备实例参数
state MASTER #指定热备状态,主为master,备为backup
interface ens33 #指定承载vip地址的物理接口
virtual_router_id 51 #指定虚拟路由器的ID号,每个热备组保持一致
priority 110 #指定优先级,数值越大越优先
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress { #指定集群VIP地址
192.168.41.200
}
}
virtual_server 192.168.41.200 80 { #指定虚拟服务器地址vip,端口,定义虚拟服务器和web服务器池参数
lb_algo rr #指定调度算法,轮询(rr)
lb_kind DR #指定集群工作模式,直接路由DR
persistence_timeout 6 #健康检查的间隔时间
protocol TCP #应用服务采用的是TCP协议
real_server 192.168.41.120 80 { #指定第一个web节点的地址,端口
weight 1 #节点权重
TCP_CHECK {
connect_port 80 #添加检查的目标端口
connect_timeout 3 #添加连接超时
nb_get_retry 3 #添加重试次数
delay_before_retry 3 #添加重试间隔
}
}
real_server 192.168.41.130 80 { #指定第二个web节点的地址,端口
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
systemctl start keepalived.service
systemctl status keepalived.service
vim /etc/keepalived/keepalived.conf
global_defs {
router_id lvs_02 #这里得更改序号
}
vrrp_instance vi_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100 #优先级改为100
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
virtual_ipaddress {
192.168.41.200
}
}
virtual_server 192.168.41.200 80 {
lb_algo rr
lb_kind DR
persistence_timeout 6
protocol TCP
real_server 192.168.41.120 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.41.130 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
systemctl start keepalived.service
systemctl status keepalived.service