大点干!早点散----------负载均衡LVS-DR群集部署
一、LVS-DR工作原理
1、DR模式概述
DR(Direct Routing)
- 通过在调度器LB上修改数据包的目的MAC地址实现转发。注意,源IP地址仍然是CIP, 目的IP地址仍然是VIP。
- 请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB, 因此,并发访问量大时使用效率很高(和NAT模式比)
- 因DR模式是通过MAC地址的改写机制实现的转发,因此,所有RS节点和调度器LB只能在一个局域网LAN中(小缺点)。
- 需要注意RS节点的VIP的绑定(lo:vip/32,lo1:vip/32) 和ARP抑制问题。
- 强调下: RS节点的默认网关不需要是调度器LB的DIP, 而直接是DC机房分配的上级路由器的IP (这是RS带有外网P地址的情况),理论讲:只要RS可以出网即可,不是必须要配置外网IP。
- 由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求的报文的目的端口(和NAT要区别)
- 当前,调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点可以是WINDOWS系统。
- 总的来说DR模式效率很高,但是配置也较麻烦,因此,访问量不是特别大的公司可以用haproxy/nginx取代之。这符合运维的原则:简单、易用、高效。日1000-2000W PV或并发请求1万-以下都可以考虑用haproxy/nginx (LVS NAT模式) 直接对外的访问业务,例如:web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如: MySQL,存储系统RS节点,最好只用内部IP地址。 DR模式的核心特点就是更改目标MAC地址进行转发
cip为客户端的地址 vip为虚拟地址 rip为真实的服务器 lip为本地地址
2、如何分析LVS-DR数据包流向?
整个流程:
- 客户端------>网关
源IP地址:客户端IP 目标IP地址:VIP
源MAC地址:客户端MAC 目标MAC地址:网关MAC
- 网关------->分发器
源IP地址:客户端IP 目标IP地址:分发器VIP
源MAC地址:网关MAC 目标MAC地址:分发器VIP的MAC
- 分发器--------->服务器
先发广播找到服务器的RIP对应的MAC然后:
源IP地址:分发器DIP 目标IP地址:服务器VIP
源MAC地址:分发器DIP对应的MAC 目标MAC地址:服务器RIP对应的MAC
- 服务器---------->网关
源IP地址:服务器VIP 目标IP地址:客户端IP
源MAC地址:服务器RIP对应的MAC 目标MAC地址:网关的MAC
- 网关----------->客户端
源IP地址:服务器VIP 目标IP地址:客户端IP
源MAC地址:网关的MAC 目标MAC地址:客户端的MAC
3、DR模式的优缺点
优点:VS/DR跟 VS/TUN 方法相同,负载调度器中只负责调度请求,而服务器直接将响应返回给客户,可以极大地提高整个集群系统的吞吐量。
缺点:要求负载均衡器的网卡必须与物理网卡在一个物理段上
4、DR中存在的ARP问题
在LVS-DR负载均衡集群中,负载均衡器与节点服务器都要配置相同的VIP地址
在局域网中具有相同的IP地址,势必会造成各服务器ARP通信的紊乱
当一个ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同的网络上的,它们都会接收到ARP广播 ,此时只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播 ,对节点服务器进行处理,使其不响应针对VIP的ARP请求
使用虚接口lo:0承载ⅥP地址 设置内核参数 arp_ignore=1:系统只响应目的IP为本地IP的ARP请求 RealServe返回报文(源IP是VIP)经路由器转发,在重新封装报文时需要先获取路由器的MAC地址
解决方法 修改/etc/sysctl.conf文件 对节点服务器进行处理,使其不响应针对VIP的ARP请求 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 系统不使用IP包的源地址来设置ARP请求的源地址,而选择发送接口的IP地址 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2
二、LVS-DR部署
1、实验目的
为了进一步提高公司网站的负载能力,公司决定扩展现有的网站平台,基于LVS构筑负载均衡群集。考虑到群集的访问效率,管理员准备采用LVS群集的DR模式,共享存储设备存放在内部专有网络中
2、实验拓扑
3、实验过程
两台LVS服务器都安装工具包
[root@lvs1 ~]# yum install keepalived ipvsadm -y '//keepalived:双机热备要用到的,ipvsadm:调度管理要用'
[root@lvs2 ~]# yum install keepalived ipvsadm -y
两台LVS服务器都开启路由转发,关闭重定向
[root@lvs1 ~]# vim /etc/sysctl.conf
'//尾行插入下段配置'
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@lvs1 ~]# sysctl -p '//重载配置,使之生效'
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
两台LVS服务器都创建脚本便于service管理
[root@lvs1 network-scripts]# vim /etc/init.d/dr.sh
'//编辑以下脚本内容'
#!/bin/bash
GW=192.168.100.1
VIP=192.168.100.10 ##虚拟ip
RIP1=192.168.100.201 ##真实web服务器ip
RIP2=192.168.100.202
case "$1" in
start)
/sbin/ipvsadm --save > /etc/sysconfig/ipvsadm ##保存配置
systemctl start ipvsadm ##启动服务
/sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up
##设置ens33:0地址,广播地址,子网掩码,并开启
/sbin/route add -host $VIP dev ens33:0 ##添加路由网段信息
/sbin/ipvsadm -A -t $VIP:80 -s rr ##指定虚拟服务访问入口,指定轮询算法
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g ##指定真实服务器,dr模式
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
echo "ipvsadm starting --------------------[ok]"
;;
stop)
/sbin/ipvsadm -C ##清空缓存
systemctl stop ipvsadm ##关闭服务
ifconfig ens33:0 down ##关闭接口
route del $VIP ##删除路由信息
echo "ipvsamd stoped----------------------[ok]"
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then ##判断文件存在与否决定状态
echo "ipvsadm stoped---------------"
exit 1
else
echo "ipvsamd Runing ---------[ok]"
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
esac
exit 0
[root@lvs1 network-scripts]# chmod +x /etc/init.d/dr.sh
两台LVS服务器都修改网卡为仅主机模式
两台LVS服务器都为ens33配置IP地址、ens33:0配置ⅥP地址
[root@lvs1 ~]# cd /etc/sysconfig/network-scripts/
[root@lvs1 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0
[root@lvs1 network-scripts]# vim ifcfg-ens33:0 '//配置虚拟ip地址'
'//删除原本内容,添加以下配置'
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.100.10
NETMASK=255.255.255.0
[root@lvs1 network-scripts]# vim ifcfg-ens33
'//...省略内容,修改为static'
BOOTPROTO=static
'//...省略内容,尾行添加内容'
IPADDR=192.168.100.100
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
[root@lvs2 network-scripts]# vim ifcfg-ens33
'//注意lvs2的IP地址为192.168.100.101'
IPADDR=192.168.100.101
两台LVS服务器都重启各项配置
[root@lvs1 network-scripts]# systemctl restart network
[root@lvs1 network-scripts]# ifup ens33:0
[root@lvs1 network-scripts]# service dr.sh start
ipvsadm starting --------------------[ok]
[root@lvs1 network-scripts]# systemctl stop firewalld.service
[root@lvs1 network-scripts]# setenforce 0
'使用ifconfig查看虚拟接口是否打开 如果打不开 将networkmanger关掉再重新尝试'
配置两台节点IP地址绑定VIP LVS-DR中,两台节点服务器要配置绑定VIP地址
VIP地址仅用作Web响应数据包的源地址,并不监听客户机的访问请求
都修改为仅主机模式
两台节点服务器为ens33配置IP地址,为lo:0配置VIP地址
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp -p ifcfg-lo ifcfg-lo:0
[root@web1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.100.10
NETMASK=255.255.255.0
ONBOOT=yes
[root@web1 network-scripts]# vim ifcfg-ens33
'//...省略内容,修改为static'
BOOTPROTO=static
'//...省略内容,尾行添加内容'
IPADDR=192.168.100.201
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
'//其中web2服务器修改为192.168.100.202'
IPADDR=192.168.100.202
节点服务器配置抑制ARP响应 配置抑制ARP脚本
[root@web1 network-scripts]# vim /etc/init.d/web.sh
#!/bin/bash
VIP=192.168.100.10
case "$1" in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore '//arp忽略'
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK "
;;
stop)
ifconfig lo:0 down
route del $VIP /dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore '//arp开启'
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stopd"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
[root@web1 network-scripts]# chmod +x /etc/init.d/web.sh
两台节点服务器配置测试网址 在两台节点服务器上安装配置并启用httpd服务器,分别创建测试网页,测试网页内容要不相同,以区别不同的节点服务器
[root@web1 ~]# yum install httpd -y
[root@web2 ~]# yum install httpd -y
[root@web1 ~]# vim /var/www/html/index.html
<h1>this shang web</h1>
[root@web2 ~]# vim /var/www/html/index.html
<h1>this is zhen web</h1>
重启各项服务
[root@web1 network-scripts]# systemctl restart network
[root@web1 network-scripts]# ifup lo:0
[root@web1 network-scripts]# service web.sh start
RealServer Start OK
[root@web1 network-scripts]# systemctl start httpd
[root@web1 network-scripts]# systemctl stop firewalld.service
[root@web1 network-scripts]# setenforce 0
3、验证
- Spring 数据库连接(Connection)绑定线程(Thread)的实现
- Golang语言实现AzDG可逆加密算法实例
- python django整理(五)配置favicon.ico,解决警告Not Found: /favicon.ico
- SpringMVC + Mybatis bug调试 SQL正确,查数据库却返回NULL
- 原生javascript实现图片轮播效果代码
- Spring AOP中 args和arg-names的区别
- Golong 语言开发 go-websocket-sample 测试值得拥有
- Java面试系列23-spring(2)-配置数据库驱动、依赖、Mapping等
- 【Golang语言社区】 Go语言中使用 Protobuf
- Java面试系列21-xml
- tensorflow载入数据的三种方式 之 TF生成数据的方法
- JS游戏开发 可移动地图的实现
- Java面试系列-多线程
- pymongo.errors:Sort operation used more than the maximum 33554432 bytes of RAM. Add an index,
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 第05期:Prometheus 数据查询(一)
- 技术分享 | MySQL 复制那点事 - Seconds_behind_Master 参数调查笔记
- 线程有多少种状态?Runnable 一定在执行任务吗?
- swift 中类(class)和结构体(struct)区别
- C语言三剑客之《C专家编程》一书精华提炼
- 前端必备技能:json-server全攻略
- 温故知新——Spring AOP(二)
- R语言中的偏最小二乘PLS回归算法
- R如何与Tableau集成分步指南
- 漏洞复现 | CVE‐2020‐5902踩坑记
- PCA图显示分组无差异,怎么办?
- 我接手了一个“垃圾”系统,全栈优化后将性能提升了350倍
- 用 eggnog-mapper 进行功能注释
- 将SAP C4C Custom BO使用ABSL编写的逻辑通过OData服务暴露出去
- Linux笔记(14)| 字符设备驱动基础入门(续)