一、简述Linux集群类型、系统扩展方式及调度方法
1.概念
Linux cluster,Linux集群系统是一种计算机系统, 它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。一个集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统就是集群的节点(node)。一个理想的集群,用户是不会意识到集群系统底层的节点的。在他们看来,集群是一个系统,而非多个计算机系统。并且集群系统的管理员可以随意增加和删改集群系统的节点。
Linux 集群系统的优点在于:
(1)高扩展性,管理员可自行增加或删除集群系统中的节点。
(2)高可用性,当集群中某一个节点失效时,其负责的任务可以传递给其他节点,因此能够有效防止单点失效。
(3)高性能,负载均衡的集群系统能够同时接入更多的用户。
(4)高性价比,可以使用廉价的硬件构造出高性能的系统。
2. Linux Cluster类型
(1)LB:Load Balancing,负载均衡;
提供和节点个数成正比的负载能力,这种集群很适合提供大访问量的Web服务。负载均衡集群往往也具有一定的高可用性特点。Turbolinux Cluster Server、Linux Virtual Server都属于负载均衡集群。主流架构Nginx+Keepalived(利于动静分离)、LVS+Keepalived。
(2)HA:High Availiablity,高可用集群;
一般是指当集群中有某个节点失效的情况下,其上的任务会自动转移到其他正常的节点上。还指可以将集群中的某节点进行离线维护再上线,该过程并不影响整个集群的运行。计思想就是要最大限度地减少服务中断时间。这类集群中比较著名的有Turbolinux TurboHA、Heartbeat、Kimberlite等。
高可用集群一般是通过系统的可靠性(reliability)和系统 的可维护性(maintainability)来衡量的。通常用平均无故障时间(MTTF)来衡量系统的可靠性,用平均维护 时间(MTTR)来衡量系统的可维护性。因此,一个高可用集群服务可以这样来定义:
A=MTBF平均故障间隔时间/(MTBF平均故障间隔时间+MTTR平均恢复时间)
(0,1):90%, 95%, 99%, 99.5%, 99.9%, 99.99%, 99.999%, 99.9999%
一般高可用集群的标准有如下几种:
99%:表示 一年不在线时间不超过87小时
99.9% :表示一年不在线时间不超过8.7小时
99.99%: 表示一年不在线时间不超过1小时
99.999% :表示一年不在线时间不超过3-5分钟
(3)HP:High Performance,高性能集群;
HPCC高性能计算集群也称为DAS(数据分析超级计算机)
(4)分布式系统集群:
分布式存储:分布式存储是一种数据存储技术,通过网络使用企业中的每台机器上的磁盘空间,在元数据服务器做索引,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散的存储在企业的各个角落。
分布式计算:分布式计算是一种计算方法,和集中式计算是相对的。随着计算技术的发展,有些应用需要非常巨大的计算能力才能完成,如果采用集中式计算,需要耗费相当长的时间来完成。分布式计算将该应用分解成许多小的部分,分配给多台计算机进行处理。这样可以节约整体计算时间,大大提高计算效率。
3. 系统扩展类型
常见的系统扩展类型有:
scale up(向上扩展):利用现有的硬件资源,通过增加硬件资源来满足日益增长的性能消耗的需求,但是此方式通常来说能提升的性能有限。
scale out(向外扩展):通过硬件或软件的方式,将以往由单一服务器负责的业务需求分配到其他节点的服务器上进行处理,但是从用户的视角来看,这些服务器是单一的系统。而lvs集群的扩展方式正是属于scale out。
4. 负载均衡集群实现:
4.1、硬件设备实现负载均衡:
- F5公司的 Big-IP产品: 性能好价格高
- Citrix公司的 Netscaler产品
- A10 公司的A10产品
4.2、软件实现负载均衡:
- lvs:Linux Virtual Server虚拟服务,不处理服务,而是转到其他地方处理
- nginx伪四层调度
- haproxy
- ats:apache traffic server 雅虎公司的开源项目
- perlbal
- pound
4.3、基于工作的协议层次划分:
(1)传输层调度器(通用):(DPORT)
- lvs:基于udp、tcp调度
- nginx:stream模块用来模拟四层调度
- haproxy:mode tcp模块用来模拟四层调度
(2)应用层调度器(专用):(自定义的请求模型分类)
proxy server:
- http:nginx(使用http的模块), httpd, haproxy(使用http的模块)
- fastcgi:nginx, httpd, ...
- mysql:ProxySQL, ...
4.4、集群的站点指标:
- PV:Page View页面浏览量
- UV:Unique Vistor单独浏览者
4.5、集群的会话保持问题:
为了对访问用户的追踪
(1) session sticky会话绑定
Source IP-----基于原ip识别原用户
Cookie----基于原Cookie识别原用户(2) session replication;复制集群
session cluster会话集群(3) session server指定一台专门储存会话的服务器
5.Lvs集群调度算法
常见的lvs集群的调度算法分为静态调度算法和动态调度算法。
5.1、 静态调度算法:根据算法本身进行调度;
rr:roundrobin,轮询,调度器将外部请求轮流分配到集群中的节点中。
wrr:Weighted RR,加权轮询,调度器根据事先设置的权重来分配外部请求到集群中的节点。
sh:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的真实服务器Ip,从而实现会话绑定;
dh:Destination Hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的真实服务器IP,典型使用场景是正向代理缓存场景中的负载均衡;
5.2、动态算法:
前端的调度器会根据后端真实服务器的实际连接情况来分配请求
(1)、LC:最少连接(Least Connections)
调度器通过“最少连接”调度算法动态的将网络请求调度到已经建立连接最少的服务器上,如果集群的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以更好地均衡负载
(2)、WCL:加权最小连接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用加权最小连接的调度算法来优化负载均衡,具有较高权值的服务器将承受较大比例的活动负载连接,
(3)、SED:最短延迟调度(Shortest Expected Delay)
在WCL的基础上改进,Overhead=(ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的接受下次请求,+1的目的是为为了考虑加权的时候,非活动连接过多的缺陷,当权限过大的时候,会导致空闲服务器一直处于无连接的状态
(4)、NQ:永不排队/最少列队调度(NEVER Queue Scheduling)
无需列队,如果有台realserver的连接数=0直接就分配过去,不需要进行sed运算,保证不会有一个主机很空闲,在SED的基础上不论+几,第二次一定给下一个,不考虑非活动连接,才会用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而http的处于保持状态就需要考虑非活动连接给服务器的压力
(5)、LBLC:基于局部性的最少连接(localibty-Based Least Connections)
基于局部性的最少连接调度算法是针对目标IP地址的负载均衡,目前主要运行在Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用而且没有超载,将请求发送到该服务器,若i服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用最少连接的原则选出一个可用的服务器,将请求发送到该服务器
(6)、LBLCR:带复制性的基于局部性最少连接(Local-Based Least Connections With Replication)
带复制性的基于局部性最少连接调度算法也是针对目标IP地址的负载均衡,目前主要用在Cache集群系统。它和LBLC算法不同的是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP到一台服务器的映射,该算法根据一请求的目标IP地址找出该目标IP地址对应的服务器组,按照最小连接原则服务器组中选一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载,则按照最小连接原则从这个集群中选出一台服务器,将该服务器加到服务组中,将请求发送到该服务器,同时当该组服务器有一段时间没有被修改,将最忙的服务器从服务组删除,以降低复制的程度。
二、简述lvs四种集群有点及使用场景
1、lvs集群的类型:
- lvs-nat:修改请求报文的目标IP;多目标IP的DNAT;
- lvs-dr:操纵封装新的MAC地址;
- lvs-tun:在原请求IP报文之外新加一个IP首部,两级ip,隧道逻辑;
-
lvs-fullnat:修改请求报文的源和目标IP;
2、lvs-nat:
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发;
(1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP;
(2)请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈;
(3)支持端口映射,可修改请求报文的目标PORT;
(4)vs必须是Linux系统,rs可以是任意系统; - 使用场景:小并发的实验性应用、mysql集群
-
lvs-dr:
Direct Routing,直接路由;
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变;
Director和各RS都得配置使用VIP;
<1> 确保前段路由器将目标ip为VIP的请求报文发往Director,有以下三种方式:
在前端网关做静态绑定
在RS上使用arptables;
在RS上修改内核参数以限制arp通告及应答级别;
<2> RS的RIP可以使用私网地址,也可以使用公网地址;RIP和DIP在同一个ip网络;RIP的网关不能只想DIP,以确保响应报文不会经由Director;
<3> RS跟Director要在同一个物理网络;
<4> 请求报文要经由Director,但响应报文不能经由Director,而是由RS直接发往Client;
<5> 不支持端口映射
- 使用场景:大众方式;
-
lvs-tun:
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP);
<1> DIP VIP RIP 都应该是公网地址;
<2> RS的网关不能,也不可能指向DIP;
<3> 请求报文要经由Director,但响应不能经由Director;
<4> 不支持端口映射
<5> RS的OS得支持隧道功能;
- 使用场景:广域网负载;
-
lvs-fullnat:
通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP< - - > DIP
VIP< - - > RIP
<1> VIP是公网地址,RIP和DIP是私网地址,且通常不在同一个IP网络;因此,RIP的网关一般不会指向DIP
<2> RS收到的请求报文源地址是DIP,因此,只能响应给DIP;但是Director还要将其发往Client;
<3> 请求和响应报文都经由Director;
<4> 支持端口映射;
- 注意: 此类型默认不支持;
- 总结:
- lvs-nat,lvs-fullnat:请求和响应报文都经由Director
lvs-nat:RIP的网关要指向DIP
lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信 - lvs-dr,lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
lvs-tun:通过在原IP报文之外封装新的IP首部实现转发,支持远距离通信
三、描述LVS-NAT、LVS-DR的工作原理并实现配置
1. LVS的基本工作原理
(1)当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
(2)PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
(3)IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
(4)POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
2. LVS的组成
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。
- ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
- ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
3. LVS相关术语
(1)DS:Director Server。指的是前端负载均衡器节点。
(2)RS:Real Server。后端真实的工作服务器。
(3)VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
(4)DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
(5)RIP:Real Server IP,后端服务器的IP地址。
(6)CIP:Client IP,访问客户端的IP地址。
4. ipvsadm的用法
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address -r server-address [options]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
其中相关命令选项的解释为:
常用选项 | 解释 |
---|---|
-A,--add-service | 添加一个虚拟服务,即添加一个需要被负载均衡的虚拟地址。 |
-E,--edit-service | 修改一个虚拟服务; |
-D,--delete-service | 删除一个虚拟服务; |
-C,--clear | 清楚所有虚拟服务; |
-R,--restore | 从标准输入中获取ipvsadm规则进行恢复; |
-S,--save | 从标准输出中输出ipvsadm规则,能将规则保存到指定文件,在以后通过-R恢复。 |
-a,--add-server | 为虚拟服务添加一个real server; |
-e,--edit-server | 修改real server的配置; |
-d,--delete-server | 删除real server; |
-L,-l,--list | 列出ipvsadm配置的所有虚拟服务,可结合-c显示连接表; |
-Z,--zero | 将虚拟服务的相关数据记录清零; |
以下参数可跟在命令选项后使用:
参数 | 解释 |
---|---|
-t,--tcp-service service-address | 指定虚拟服务为tcp服务,service-address是host[:port]的形式,端口为0时表示任意端口,但需要加上-p选项才能使用; |
-u,--udp-service service-address | 指定虚拟服务的udp服务; |
-f,--fwmark-service integer | 指定firewall mark标记的不同的地址和端口的虚拟地址整合为一个虚拟服务。firewall mark可以通过iptables命令指定; |
-s,--scheduler scheduling-method | 指定调度算法,调度算法包括:rr,wrr,lc,wlc,lbcl,lblcr,dh,sh,sed,nq; |
-p,--persistent [timeout] | 设置持久连接,这个模式可以使得来自同一个Ip的多个请求被送往同一个RS中; |
-r,--real-server server-address | 为虚拟服务指定数据可以转发到的真实服务器的地址,可添加端口号,若没指定端口号,则调用虚拟地址的端口号; |
-g,--gatewaying | dr模式,指定lvs的工作模式,此模式为默认模式; |
-i,--ipip | 使用tun模式; |
-m,--masquerading | 使用NAT模式; |
-w,--weight weight | 设置权重,范围为0-65535,0表示该RS不会受到新的连接; |
-x, --u-threshold uthreshold | 设置一个服务器可以维持的连接上限。0~65535。设置为0表示没有上限。 |
-y, --l-threshold lthreshold | 设置一个服务器的连接下限。当服务器的连接数低于此值的时候服务器才可以重新接收连接。如果此值未设置,则当服务器的连接数连续三次低于uthreshold时服务器才可以接收到新的连接。 |
以下参数可用是显示服务的状态信息:
参数 | 解释 |
---|---|
-c, --connection | 列出当前的IPVS连接。 |
--timeout | 列出超时 |
--stats | 状态信息 |
--rate | 传输速率 |
--thresholds | 列出阈值 |
--persistent-conn | 坚持连接 |
--sor | 把列表排序。 |
--nosort | 不排序 |
-n, --numeric | 不对ip地址进行dns查询 |
--exact | 单位 |
5. lvs-nat工作原理及配置实现
(a). 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b). PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c). IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
(d). POSTROUTING链通过选路,将数据包发送给Real Server
(e). Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
(f). Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP
LVS-NAT模型的特性
- RS应该使用私有地址,RS的网关必须指向DIP
- DIP和RIP必须在同一个网段内
- 请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈
- 支持端口映射
- RS可以使用任意操作系统
- 缺陷:对Director Server压力会比较大,请求和响应都需经过director server
实验配置:
相关IP | 地址 |
---|---|
CIP | 192.168.0.129 |
VIP | 192.168.0.100 |
DIP | 192.168.32.132 |
RIP1 | 192.168.32.129 |
RIP2 | 192.168.32.128 |
#把主机192.168.32.132配置成Director,先检查看内核是否支持lvs
[root@localhost ~]# grep -i "ipvs" -C 10 /boot/config-3.10.0-514.el7.x86_64
#在192.168.32.132上在添加一块网卡,配置仅主机模式并配置ip
[root@localhost ~]# ifconfig ens37 192.168.0.100/24
#开启核心转发功能
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
#在RS1和RS2两台主机上先安装httpd、telnet-server两个服务以便后面测试
[root@rs1 ~]# yum install httpd telnet-server -y
[root@rs2 ~]# yum install httpd telnet-server -y
#分别给R1和R2配置两个不同的测试页
[root@rs1 ~]# vim /var/www/html/index.html
<h1>rs1,192.168.32.129</h1>
[root@rs2 ~]# vim /var/www/html/index.html
<h1>rs2,192.168.32.128</h1>
#配置RS1和RS2的网关指向192.168.32.132
[root@rs1 ~]# route add default gw 192.168.32.132
[root@rs2 ~]# route add default gw 192.168.32.132
#至此网络配置完成,下面配置lvs规则定义集群
[root@localhost ~]# yum install ipvsadm
[root@localhost ~]# ipvsadm -A -t 192.168.0.100:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.32.128 -m
[root@localhost ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.32.129 -m
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.100:80 rr
-> 192.168.32.128:80 Masq 1 0 0
-> 192.168.32.129:80 Masq 1 0 0
#使用192.168.0.129的主机访问测试:
[root@wujunjie6 ~]# for i in {1..10};do curl http://192.168.0.100;done
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
#加权轮询测试
[root@localhost ~]# ipvsadm -E -t 192.168.0.100:80 -s wrr
[root@localhost ~]# ipvsadm -e -t 192.168.0.100:80 -r 192.168.32.128 -m -w 2
[root@localhost ~]# ipvsadm -e -t 192.168.0.100:80 -r 192.168.32.129 -m -w 3
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.100:80 wrr
-> 192.168.32.128:80 Masq 2 0 0
-> 192.168.32.129:80 Masq 3 0 0
#访问测试
[root@wujunjie6 ~]# for i in {1..10};do curl http://192.168.0.100;done
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
#假如后端的RS2挂了,lvs还会继续调度,因此需要手动删除或者修改权重为0
[root@wujunjie6 ~]# for i in {1..10};do curl http://192.168.0.100;done
curl: (7) couldn't connect to host
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
curl: (7) couldn't connect to host
<h1>rs1,192.168.32.129</h1>
curl: (7) couldn't connect to host
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
curl: (7) couldn't connect to host
<h1>rs1,192.168.32.129</h1>
#修改权重为0
[root@localhost ~]# ipvsadm -e -t 192.168.0.100:80 -r 192.168.32.128 -m -w 0
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.100:80 wrr
-> 192.168.32.128:80 Masq 0 0 4
-> 192.168.32.129:80 Masq 3 0 12
测试:
[root@wujunjie6 ~]# for i in {1..10};do curl http://192.168.0.100;done
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs1,192.168.32.129</h1>
#假如RS1,RS2都挂了,可以把director当做一个服务,把RS1,RS2权重改为0
[root@localhost ~]# ipvsadm -e -t 192.168.0.100:80 -r 192.168.32.129 -m -w 0
[root@localhost ~]# ipvsadm -e -t 192.168.0.100:80 -r 192.168.32.128 -m -w 0
[root@localhost ~]# ipvsadm -a -t 192.168.0.100:80 -r 127.0.0.1 -g
[root@localhost ~]# vim /var/www/html/index.html
<h1>sorry</h1>
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.100:80 wrr
-> 127.0.0.1:80 Route 1 0 0
-> 192.168.32.128:80 Masq 0 0 0
-> 192.168.32.129:80 Masq 0 0 0
测试:
[root@wujunjie6 ~]# for i in {1..5};do curl http://192.168.0.100;done
<h1>sorry</h1>
<h1>sorry</h1>
<h1>sorry</h1>
<h1>sorry</h1>
<h1>sorry</h1>
6.lvs-dr工作原理及配置实现
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c) IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
(d) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
(e) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
LVS-DR模型的特性
- 特点1:保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
- RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
- RS跟Director Server必须在同一个物理网络中
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
- 不支持地址转换,也不支持端口映射
- RS可以是大多数常见的操作系统
- RS的网关绝不允许指向DIP(因为我们不允许他经过director)
- RS上的lo接口配置VIP的IP地址
- 缺陷:RS和DS必须在同一机房中
特点1的解决方案:
- 在前端路由器做静态地址路由绑定,将对于VIP的地址仅路由到Director Server
- 存在问题:用户未必有路由操作权限,因为有可能是运营商提供的,所以这个方法未必实用
- arptables:在arp的层次上实现在ARP解析时做防火墙规则,过滤RS响应ARP请求。这是由iptables提供的
- 修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。
配置实验:
相关IP | 地址 |
---|---|
CIP | 192.168.32.200 |
VIP | 192.168.32.99 |
DIP | 192.168.32.132 |
RIP1 | 192.168.32.129 |
RIP2 | 192.168.32.128 |
#通过脚本修改内核参数以现在RS的ARP通告和应答级别
[root@rs1 ~]# vim setparam.sh
#!/bin/bash
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
stop)
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "Usage $(basename $0) start|stop"
exit 1
;;
Esac
#分别在RS1和RS2上运行此脚本
[root@rs1 ~]# bash -x setparam.sh start
[root@rs2 ~]# bash -x setparam.sh start
#在rs1和rs2上配置VIP
[root@rs1 ~]# ifconfig lo:0 192.168.32.99 netmask 255.255.255.255 broadcast 192.168.32.99 up
[root@rs2 ~]# ifconfig lo:0 192.168.32.99 netmask 255.255.255.255 broadcast 192.168.32.99 up
#添加路由条目由哪个设备进来就由哪个设备出去
[root@rs2 ~]# route add -host 192.168.32.99 dev lo:0
[root@rs1 ~]# route add -host 192.168.32.99 dev lo:0
#配置Director的VIP
[root@localhost ~]# ifconfig ens33:0 192.168.32.99 netmask 255.255.255.255 broadcast 192.168.32.99 up
#在Director上安装ipvs并定义集群
[root@localhost ~]# ipvsadm -A -t 192.168.32.99:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.32.99:80 -r 192.168.32.128 -g
[root@localhost ~]# ipvsadm -a -t 192.168.32.99:80 -r 192.168.32.129 -g
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.32.99:80 rr
-> 192.168.32.128:80 Route 1 0 0
-> 192.168.32.129:80 Route 1 0 0
在client主机上测试:
[root@wujunjie6 ~]# for i in {1..10};do curl http://192.168.32.99;done
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>
<h1>rs1,192.168.32.129</h1>
<h1>rs2,192.168.32.128</h1>