LVS:Linux Virtual Server
Linux Cluster:集群,为解决某个特定问题将多台主机组织起来,满足同一个需求;
单台主机处理能力有限,包括cpu、IO、内存、带宽等资源,无法满足客户端请求;把用户的请求分散到多个不同的服务器,分摊压力;
集群的类型:
LB:Load Balancing,负载均衡集群;负载均衡器,或调度器、分发器;
分担负载客户端的多个彼此之间无关联关系的单独请求
后端主机(backend server,upstreaming server),“真”服务器(real server)
HA:High Availibility,高可用集群 —— 提高服务可用性,在某一主机出现故障时能够通过冗余让备用主机能在主服务器故障时启用
Actiive:活动服务器;
Passive:备用服务器(standby);
衡量集群的可用性:通常说几个9来衡量
A=可用性(Avalibility): Avalibility=MTBF/(mtbf+mttr)
可用性=平均时间/(平均无故障时间+平均修复时间)
值为[0,1]之间,常用百分比衡量
例如:100个小时,99%表示有1个小时不可用;99.9%表示有0.1个小时不可用,99.99%表示有0.01小时(36秒)不可用
SPOF:Single Point Of Failure;单点故障;
HP:High Performance 高性能集群;组合多台计算机分散计算量,解决一个很大很复杂的单一请求,(不多见,由DS代替)
DS:Distrubuted System分布式系统
分布式运算、分布式存储
hadoop:
mapreduce
hdfs
系统扩展的方式:(当前主机不能满足需求时的解决方法)
Scale UP:向上扩展,垂直扩展;更换高性能的硬件;
Scale OUT:向外扩展,水平扩展;利用多台主机,实现分摊压力;但并不是线性扩展;
LB:Load Balancing,负载均衡集群的实现:
关键要点:前端调度器和如何分发用户请求
硬件实现:各公司的产品
F5—- BIG-IP
Citrix—- Netscaler
A10—-A10
软件实现:
lvs:Linux Virtual Server
haproxy
nginx
ats(apache traffice server)
perlbal:perl语言研发的高性能分发器
基于工作的协议层次划分:
传输层:通用所有协议,因为没有套接字限制
lvs(工作在内核中),haproxy,nginx
应用层:专用某个服务,根据具体自定义的请求模型进行分发
haproxy(mod http)、nginx、ats、perlbal、mysql:mysql-proxy
LVS工作在内核中,能支持更多服务第一,不需要监听套接字并维护套接字文件;第二,无需扮演成客户端(反代)向后端取用户请求的资源,如果是在应用层,为后端代理时,还需要ip地址和端口,如果并发请求10万个,则不能满足,因为有效端口才65535个端口;这样,前端打开文件数量没有问题,但将后端转发请求时,受限于所能打开的套接字,所以并发数有限,文件数量;在内核中则没有这样的限制,因此,第一,就突破了套接字文件的限制;第二,套接字可用端口数量的限制;
站点指标:
PV: Page View 用户浏览网页数
UV:Unique Vistor 唯一标识的客户端,一个客户端可以打开很多PV,但只有一个客户端
IP:对于公网IP来说,IP与UV并不是同一个概念
会话保持:3种方法
session sticky会话绑定:服务器单独存储自己的session,任何一台服务器down掉,改主机的session将丢失;
session cluster会话集群:把后端需要保持会话的服务器做一个会话集群,每一个主机的会话都通过网络同步到集群中的其它节点上,使得集群中的每个节点都有集群中的所有会话,从而实现任何一个节点down掉,会话都存在;因此,不用绑定,好处是不会影响负载均衡的效果;任何一台服务器down掉,不影响会话;坏处,每一台服务器要存储集群内的所有服务器的session。
session server会话服务器:
使用一台服务器专门保存会话;这样会成为单点,还要提高服务器的可用性;
HA:High Availibility,高可用集群;
keepalived:vrrp协议软件实现
LVS:Linux Virtual Server—— Linux虚拟服务器
组件:VS: Virtual Server RS: Real Server
1.负载均衡器的作用:
l4(layer 4):四层路由或四层交换,根据端口分发
VS:根据请求报文的目标IP和目标PORT,将其进行调度转发至后端的某Real Server;根据调度算法来挑选后端Real Server
2、.VS的工作架构:
ipvsadm/ipvs类似于iptables/netfilter:
iptables:是用户空间的命令行工具;
netfilter:是内核空间框架,真正发挥效用的;
流入:PREROUTING –> INPUT
转发:PREROUTING –> FORWARD –> POSTROUTING
流出:OUTPUT –> POSTROUTING
3、LVS:由2部分组成ipvsadm/ipvs
ipvsadm:工作在用户空间的命令行工具;用于管理集群服务及集群服务上的RS;
ipvs:是内核中的框架;工作于内核上的netfilter的INPUT钩子上的程序,可根据用户定义的集群实现请求转发;如果用户请求到达INPUT,LVS发现用户请求的是LVS定义的集群服务,此时LVS就将请求直接传递给POSTROUTING,由此转向Real Server
注意:在lvs主机上,不允许在INPUT链上添加过滤规则,一般不建议与ipvs一同使用filter规则;更不能使用nat规则,任何链接追踪功能都不能开启,链接会话表就限制了会话能力,否则,并发响应能力将大大受到限制;
支持基于TCP UDP SCTP AH EST AH_EST等协议及端口进行调度;
4、lvs集群的专用术语:
VS:Virtual Server虚拟服务器,Director调度器,Dispatcher分发器,Balancer均衡器
RS:Real Server 后端主机
CIP:Client IP 客户端IP地址;
VIP:Virtual Server IP 面向客户端服务的IP地址,不是固定配置在主机上,需要在两个节点间流动,因为当前主机挂了,备用主机替换上,一般配置在网卡别名上,作为辅助地址存在;
DIP:Director IP 调度器的IP,面向Real Server的IP地址用于与后端服务器通信的IP地址;
RIP:Real Server IP 后端主机IP地址;一般不止一个;
LVS集群的类型:4类工作模式
lvs-nat:修改请求报文的目标IP实现转发
lvs-dr:操作重新封装新的MAC地址
lvs-tun:在原请求IP报文之外新加一个IP首部
lvs-fullnat:修改请求报文的源和目标IP
1.lvs-nat:
多目标的DNAT;通过修改请求报文中的目标地址和目标端口修改为挑选出的某RS的RIP和PORT实现转发;
通过修改请求报文的目标地址,请求和响应报文都经过Director;就是多目标的dnat;必须要各RS的网关要指向DIP,要在同一物理网络,距离不能太远;
CIP —> VIP 将 CIP —> RIP 通过VS –> RS返回 RIP —> CIP 到VS 转换 VIP —> CIP
lvs-nat特点:
(1)RIP和DIP必须在同一IP网络,且应该使用私有地址;RS的网关必须指向DIP(保证响应报文必须经由VS);
(2)请求报文和响应报文都经由Director转发,较高负载下,Director易于成为系统性能瓶颈,因为Director要承载请求报文的转发,也要承载响应报文的转发;
(3)支持端口映射;后端真实主机尽量为同一端口;
(4)VS必须是Linux,RS可以是任意OS(操作系统);
工作过程:
ipvs工作在INPUT链上,所以只有在INPUT链上才能判断出集群服务,然后才能向后转发,转发时,基于某种调度算法,ipvs自动从后端主机中挑选出一个来响应用户请求,挑选出的主机IP会成为报文目标IP的修改对象;
定义负载均衡集群服务时,要定义集群服务,集群服务的真实主机;
客户端访问lvs集群服务,此时报文的源地址为cip,目标地址为vip,通过lvs进行dnat转发后端服务器主机,此时,报文的源地址为cip,目标地址为rip;
后端主机响应时,报文源地址为rip,目标地址为cip,后端的各个真实主机,必须把网关指向lvs集群服务的dip;这样,才能保证响应给lvs集群服务主机;响应报文到达lvs集群服务进行地址转换,此时,源地址为vip,目标地址为cip,最终,响应给客户端;其
实,还支持端口映射,即可修改端口进行端口转换;
此lvs工作类型,由于使用nat,链接跟踪机制不可避免的启用;所以,并发数量是受限的;
2、lvs-dr:Direct Routing 直接路由,默认lvs工作类型;
通过修改请求报文的MAC地址,重新封装一个MAC首部进行转发;源MAC是DIP所在接口的MAC地址,目标MAC是挑选出的某RS的RIP所在接口的MAC地址;
通过重新封装请求报文的MAC层地址,目标mac为挑选出的RS的mac地址;请求报文经过Director,响应报文不能经过Director;
特点:
(1)确保前端路由器将目标IP为VIP的请求报文转发往Director;
解决方案:3种
1.在路由器上静态绑定VIP和Dieretor的MAC地址;
禁止RS响应VIP的ARP请求,禁止RS的VIP进行通告;
2.arptables:定义限定ip对应MAC地址为VIP所在
3.修改RS的内核参数,并把VIP绑定lo的别名上;
arp_ignore,arp_announce
(2)RS的RIP可以使用私有地址,也可以使用公网地址;
(3)RS跟Director必须在同一物理网络(基于MAC地址转发);RS的网关必须不能指向DIP;
(4)请求报文必须由Directory调度,但响应报文必须不能经由Director;
(5)不支持端口映射;
(6)RS可以使用大多数的OS;一般都为Linux系统;
工作流程:
IP首部不会发生变化(依然是CIP<–>VIP)lvs服务主机与后端服务器RS主机接在同一交换机上,且每个后端主机都配有vip,为了避免地址冲突,把各后端主机配置的vip进行隔离;隔离的方法有3种:
方法一:可使用arptables命令,专门控制进行arp广播隔离;
方法二:Linux内核较新版本中,提供了一个精巧的开关,也能够实现隔离;
方法三:在前端lvs服务器上游的路由器上绑定lvs的MAC地址与lvs的vip地址;此方法,较为不便,一般路由器有运营商负责,且lvs服务器主机会有两个,所以绑定MAC后,当一台坏了时,另一台则不能通过路由器与外界通信;
每个主机除了与外部通信的接口外,还有lo接口;一个报文从物理接口进来,经过lo接口到达主机,也算为一种转发,于是,把rip配置在物理接口上,把vip配置在lo的别名上,如lo:0;这样lo与物理接口不在同一网络;
Linux内核特性之一是主机上的ip地址是内核的,所以在arp广播时,正常情况下,无论地址是哪个接口都会响应;如果设定内核参数进行隔离arp广播报文,从物理接口收到arp广播报文,即便另一接口有请求的地址,也不响应;让ip地址真正成为接口的了;
默认情况下,如果主机有3个网络IP地址,统统向每个网络中通告;设置内核参数后,可限制,每个接口地址只向它所在网络通告;
可通过这种方式,每个后端主机上都有vip地址了而没有发生ip地址冲突;且当有arp广播请求vip地址时,只有lvs服务器来响应;
lvs接收到请求报文后,此时,数据包的源IP为cip,目标IP为vip,源MAC为上一跳的路由器接口的mac地址,目标MAC为lvs服务主机VIP所在的mac地址,之后,送到INPUT链上,发现是集群服务,就挑选出一个后端主机服务器,再把报文封装源IP为cip和目
标IP是vip不变,源MAC为lvs本机的VIP接口的mac地址,目标MAC为挑选出来的后端主机物理接口的MAC,把报文送给后端主机的lo:0接口,因为此接口地址是vip;
后端主机,响应报文时,Linux主机特点是ip报文从哪个接口出去,源IP就封装为该接口的ip地址;此时,响应报文必须从lo:0接口出去,即响应报文在离开该接口时源ip就封装了vip,目标IP为cip;之后,通过后端主机的物理接口发送响应报文;后端主机的rip与vip不在同一网段,需要将rip指向另一个路由器当网关,才能将报文响应给客户端;
3、lvs-tun:tunnel,lvs隧道模型—通过互联网连接
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是源IP首部之外再封装一个IP首部(源IP为DIP,目标IP为挑选出的RS的RIP);
隧道,通过在原有的IP报文之外,再封装一个IP首部,且源IP为DIP,目标IP为RIP;这两个地址可为互联网地址;有可能造成巨型帧,超过MTU的大小;
功用:容灾
特点:
(1)RIP,DIP,VIP全得是公网地址;
(2)RS网关不能指向也不可能指向DIP;
(3)请求报文经由Director转发,但响应报文将直接发往CIP;
(4)不支持端口映射;
(5)RS的OS必须支持隧道功能;
(6)请求报文不能超过MTU1500
工作流程:
请求报文源IP为cip,目标IP为vip,到到达lvs服务进入INPUT链上,在整个ip报文外又加了一层ip首部,即IP报文传输IP报文所以叫IP隧道,此时外层源IP为dip,目标IP为某一个被挑选出来远端的rip,远端的服务主机收到报文经过不断拆包后,将响应报文发给客户端,构建响应报文的源IP为cip,目标IP为cip;
4、lvs-fullnat:不是lvs的标准模型;淘宝研发;
通过同时修改请求报文的源IP地址(CIP–>DIP)和目标IP地址(VIP–>RIP)进行转发;
其实,是nat模型是一种转换;lvs服务器通过路由器连接后端服务器,即后端服务器可在远端;
不是标准类型,是扩展了lvs-nat的限制,在lvs-nat中,要求响应报文必须经过Director,必须要各RS的网关要指向DIP,要在同一物理网络,距离不能太远;构建跨网段实现时,受到限制;lvs-fullnat解决了此问题的限制;
实现RS和VS能跨路由进行通信
工作流程:
1.客户端封装CIP–>VIP访问到VS,VS进行更改报文为DIP–RIP对后端的RS进行请求响应
2.RS通过封装RIP–>DIP将报文转发到VS,VS在将报文更改为VIP–>CIP进行响应给客户端。
特点:
(1)VIP是公网地址,RIP和DIP一般是私网地址,且通常不再同一网络中,但需要经由路由器互通;
(2)RS收到的请求报文源IP为DIP,因此响应报文将直接响应给DIP;
(3)请求和响应报文都经由Director;
(4)支持端口映射;
(5)RS可以使用大多数的OS;
lvs scheduler:lvs调度方法
根据其调度时是否考虑后端主机的当前负载,可分为静态方法和动态方法两类:
1、静态调度方法:仅根据算法本身进行调度;(关注起点公平)
RR:Round Robin,轮询/轮调/轮叫;
调度器通过轮叫调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载;
WRR:Weighted RR,加权轮询,基于权重的方式;
调度器通过加权轮叫调度算法,根据真实服务器的不同处理能力来调度访问请求;这样可以保证处理能力强的服务器处理更多的访问流量;调度器可以自动询问真实服务器的负载情况,并动态地调整其权值;
SH:Source Hashing,源地址哈希;实现session statiy
实现session sticy,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定;
功能:保存会话时才用到;
来自于同一IP地址的请求,始终发往同一个真实服务器,从而实现会话保持的功能,根据原地址挑选真实服务器;把原地址与挑选真实服务器绑定起来;
基于客户端瘦cookie+服务器端的session机制,在负载均衡时,同一用户被调度不同后端服务器时,为了保持会话连接功能不丢失;当第一次用户请求时,通过调度机制给该用户分配了一个负责响应后端服务器,以后来自该用户的请求就由这个服务器负责响应了,而不再调度,这就叫源地址哈希;
在调度器上有会话追踪表,在这个会话追踪模板中,把用户的IP地址和挑选的后端服务器对应的记录下来,而且定义一个超时时长,在定义的时间内该条目不会删除;所以,用户请求到来时,先检查这个表,把原IP当做k查找,因为哈希就是k/v数据,对应的v就是后端的真实服务器;如果检查有用户的IP对应的记录,则直接将请求报文发给记录中对应的后端真实服务器,而不通过调度;
缺陷:当记录的真实服务器挂了时,就没有会话保持记录了;当内网用户同过同一IP地址访问外网时,可能会把内网用户的所有请求都发往会话记录表上的真实服务器,这样负载均衡能力是收到损害的;
解决办法:
方法一:
可在更高级实现,基于cookie做绑定,但是cookie是应用层数据,所以lvs在内核,不能通过lvs实现;但,htpd,nginx可实现;
方法二:
要想通过lvs解决,可以把几个lvs服务器做一个session集群,是实现会话同步的集群,每一个节点创建会话后,通过网络协议,会立即同步到其它节点,这样,每一台节点上保存的都是全局的所有会话,任何一台节点挂了,用户请求被重新调度时会话不会丢失;如果有30台服务器,每一台服务器都要同步所有服务器上的session会话信息,会给服务器带来很大压力,所以此种方法仅适用于小规模的真实主机集群的场景;后面讲tomcat时,演示session集群;
方法三:
可用一个session服务器做共享存储,一般在后端当存储的节点为专用的k/v数据存储;例如memche,radis;
DH:Destination Hashing,目标地址哈希;
保存的是目标地址,通常用在正向web代理(有缓存功能),负载均衡内网用户对外部服务器的请求;哈希的是目标地址;
内网用户请求的目标地址,在调度器上把目标地址绑定到一个代理缓存服务器上,以后,任何用户访问的是该目标地址就发往绑定的代理服务器,代理服务器收到请求后,再发往后端服务器主机,从而实现正向代理负载均衡的作用;
目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS;例:VS记录访问www.baidu.com的从RS2进行访问,那么所有客户端请求访问www.baidu.com时都直接响应RS2。
2、动态调度方法:根据算法及各RS当前的负载状态进行调度;
LC:least connections,最少连接;计算的值小被优先调度
通过Overhead计算公式实现:计算各RS当前的负载状态,通过Overhead值表示;
Overhead=Active数量*256+Inactive
通过最少路径调度算法动态地将网络请求调度到已经建立的链接数最少的服务器上;如果集群系统的真实服务器具有相近的系统性能,采用最小链接调度算法可以较好的均衡负载;
例:当前RS1的活动数量为30,非活动数量为10,RS2的活动数量为10,非活动数量为30; 通过计算,RS2的值比RS1的值小,所以会有限调度RS2。
WLC:Weight LC,加权的最少连接;计算出的值大的被优先调度
是通用方法,即考虑了算法又考虑了服务器负载,是默认的调度方法;
计算公式:Overhead=(Active数*256+Inactive)/weight
权重越大,得到的结果越小;而调用方法为权重高的有限调度;如果计算出的权值一样的,那么之上而下调度第一个RS;
在集群系统中的服务器性能差异较大的情况下,调度器采用加权最少链接调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载;调度器可以自动询问真实服务器的负载情况,并动态地调整其权值;
缺陷:如果权值最小的服务器排在第一行,每次会响应客户端请求,这样对权值大的服务器利用率就不是很高;
SED:Shortes Expections Delay,最短期望延迟
Overhead=(Active+1)*256/weight
弥补了WLC的缺点;但又出现了缺点:权值最小的服务器,在其它权值较大服务器负载较大时才工作;放弃了非活动链接的考量;
NQ:Never Queue 从不排队
是SED的改进,弥补了SED的缺点;请求到来后,会按权值大小,都会分配每个服务器来响应客户端请求;放弃了非活动链接的考量;
LBLC:Locality-Based LC,基于本地的最少连接
基于本地的LC,其实就是动态的DH算法,考虑了服务器的负载;损失了命中率,提高了均衡性;
针对目标IP地址的负载均衡,目前主要用于cache集群系统;
该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用最少链接的原则,选出一个可用的服务器,将请求发送到该服务器;
LBLCR:LBLC with Replication,带复制的基于局部性最少链接带复制的LBLC;
也是针对目标IP地址的负载均衡,目前主要用于cache集群系统;
它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射;该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组 ,按最小链接原则从服务器组中选出一台服务器,若服务器没有超载,将请求发往该服务器,若服务器超载,则按最小链接原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发往该服务器;同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度;
Ipvsadm/ipvs:实现
ipvs:工作在内核中的协议栈上实现;工作在netfilter/input钩子上,强行更改IP报文的响应流程实现调度
支持基于TCP UDP SCTP AH EST AH_EST等协议及端口进行调度;
IPVS工作模式:就是在filter的input链上附加了一段代码,就称为ipvs功能;类似于钩子一样,能够根据定义的集群规则,监控任何一个送往input链上的请求报文,且请求报文中所请求的目标地址和端口被定义成了集群服务,则会根据调度方法和集群类型,强行修改报文的流程到postrouting;一般定义lvs集群时,一定要跟filter分隔,不能同iptables一块使用,尤其不能跟filter表一起使用;
因为ipvs在内核中工作的特性,解脱了套接字文件数量和套接字自身数量的限制,使得ipvs在优化得当的场景中看,负载能力可达数百个;
如果负载不是特别大,使用配置比较麻烦,维护成本较大;
ipvsadm:工作在用户空间的集群服务器管理工具;
ipvs/ipvsadm的关系相当于netfilter/iptables的关系;
真正提供lvs服务的是ipvs;
四层交换或四层路径;根据目标ip和目标端口进行转发;
一个ipvs(Director)主机可以同时定义多个cluster service;
一个ipvs服务至少应该有一个rs;
因为是根据请求的目标ip地址和目标端口(能识别协议)进行转发;一个ipvs(Director)主机就可同时为多个集群提供服务进行调度;这就是四层交换的原因;只不过一个Director很有可能成为负载均衡的瓶颈;
注意:单个Director可同时为多个集群提供调度服务;
判断内核是否支持ipvs:
]# grep -i "IPVS" /boot/config-3.10.0-229.el7.x86_64
CONFIG_NETFILTER_XT_MATCH_IPVS=m 支持模块化
# IPVS transport protocol load balancing support 支持的四层协议
TCP、DUP、AH、ESP、SCTP、HA_ESP
# IPVS scheduler 支持的调度方法
Static : RR/WRR/SH/DH
Dynamic: LC/WCL/SED/NQ/LBLC/LBLCR
CONFIG_IP_VS_SH_TAB_BITS=8 原地址哈希
ipvsadm命令:用法,3种
管理集群服务及管理集群服务上的real server
1、管理集群服务:增、改、删、查
ipvsadm -A|E -t|u|f service-address [-s scheduler]
-A:增,添加
-E:修改
-t:tcp,把tcp端口定义成集群服务;
-u:udp,把udp端口定义成集群服务;
-f:Firewalls mark防火墙标记;
service-address:定义集群服务的地址
-t,tcp, 地址格式:vip:port
-u,udp,地址格式:vip:port
-f,FireWall Mark, mark—-防火墙标记,一个数字,在防火墙上把某个地址某个端口相关的报文打成一个标记,基于此标记来定义集群服务,作用在可以将两个不同端口的服务定义为一个集群服务.
-s scheduler:定义集群服务的调度方法,默认为wlc加权最少连接;
ipvsadm -D -t|u|f service-address
-D:删除集群服务;
2、管理集群上的RS:增、改、删
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-a:增,添加RS;
-e:改,修改RS;
-r server-address:向已存在的service-address(集群服务)添加RS的地址;
rip[:port] 端口省略时,表示不做端口映射,与请求服务的端口为同一端口;有些集群服务不支持端口映射,如lvsdr,lvs-tun,只要响应报文不经过Director都不支持;
-g,gateway—dr:指明集群类型为lvs-dr;默认类型;
-i,ipip—-tun:指明集群类型为lvs-tun;
-m,masquerad—-nat(地址伪装):指明集群类型为lvs-nat;
-w weight:指明权重,对不支持权重的调度算法没用;用在wrr,wlc,sed调度算法;默认为wlc
3、查看:
ipvsadm -L|l [options]
-L,–list:列出集群服务;
-n, –numeric:数字格式显示,不反解主机名到ip地址,服务到端口号;
–exact:精确显示数值,不进行单位换算;
-c, –connection:显示当前ipvs连接;可查看后端服务器是否连接;
–stats:统计数据;
–rate:速率;
4、清空:clear
ipvsadm -C
5、保存和重载:
保存:输出重定向 Centos7中建议保存在/etc/sysconfig/ipvsadm中,使用systemctl命令启动服务会读取此文件中的定义
ipvsadm -S > /PATH/TO/SOME_RULE_FILE
ipvsadm-save > /PATH/TO/SOME_RULE_FILE
Centos7中建议保存地址:/usr/lib/systemd/system/ipvsadm.service
需要开机自动有效:]# systemctl enable ipvsadm.service
重载:输入重定向
ipvsadm -R < /PATH/TO/SOME_RULE_FILE
ipvsadm-restore < /PATH/TO/SOME_RULE_FILE
负载均衡集群设计时的要点:
(1)session保持:3种方法
session sticky(ip hash):基于原地址哈希、目标地址哈希;
session cluster:会话集群;
session server:会话服务器;
(2)数据共享:2种方案
共享存储:多种方案
NAS:Network Attached Storage
网络附加存储其实就是文件服务器,访问接口是文件级别,可挂载使用,但不能做格式化操作;(其实就是NFS,SAMBA文件服务器,但自建网络文件共享存储服务器的通常性能不好,有厂家生产专用的NAS存储);
SAN:Storage Area Network,存储区域网络
访问接口是块级别;可分区、格式化后才能挂载使用;通过其它传输介质是扩展的SCSI(小型计算机扩展接口),SCSI特点,有宽带和窄带,宽带可接15块target,窄带可接7块target,必须使用SCSI协议,用SCSI传输介质传输SCSI协议报文;
SAN就是用SCSI协议借助于其它网络技术(FC,以太网)传输,扩大了传输距离,也扩展了适用性;
NAS和SAN是常见的集中式共享存储的解决方案;指的是集中的一个单点存储设备,共享给多主机;
DS:Distributed Storage 分布式存储
通常是网络服务,让多个客户端访问;分布式存储把数据存储到自己的网络中,分布式存储有n个主机组成,每个主机都提供一部分存储空间;访问接口通常是文件级别,接口可以是文件系统,也可以API;
ceph,内核级分布式存储;
多数互联网公司使用DS数据共享解决方案;
数据格式:
结构化数据:存储于SQL
数据库中;
半结构化数据:如xml,json等数据,可存储于文件系统或NoSQL上;
非结构化数据:存储文件系统,NAS和SAN、DS;
在前端加缓存,来解决数据存储中读取较慢的缺陷;
数据同步:
rsync+inotify
rsync:远程同步,能够将两台主机上的两个文件系统,彼此间做同步;有主从之分,同步是单向的,主服务器有支持读、写操作,从服务器只能读操作,要从主服务器上拉取完成同步;类似于dns中的主从区域复制;
inotify机制:是内核的机制;在从服务器拉取主服务器数据时,可能刚来取完,主服务器就变化了,这样不能准时获得同步;inotify机制就要解决此问题,当主服务器有变化时,主动通知从服务器;一主一从,或一主两从,再多就无法使用;
LVS-DR设计要点:
在各主机(Director,RS)均需要配置VIP,因此,要解决地址的冲突的问题,目标是让各RS上的VIP不可见,仅用接收目标
地址为VIP的报文,同时可作为响应报文的源地址;
(1)在前端的网关接口上静态绑定(vip+mac);
缺陷:一旦Director挂了,基于高可用转移另外节点上无法实现;而且,要在网关上有权限操作;
(2)在各RS上使用arptables;添加规则,拒绝自己的VIP地址向外通告及响应arp解析地址的请求;
(3)在各RS上修改内核参数,来限制arp响应和通告;
注意:要将VIP配置在lo的别名上,不能配置在网卡的别名上;
限制响应级别:arp_ignore
0:默认值,使用本地任意接口上配置的地址进行响应;回应任何网络接口上对任何本地IP地址的arp查询请求
1:仅在请求的目标IP配置在本地主机的接收报文的接口上时,才给予响应;只回答目标IP地址是来访网络接口本地地址的ARP查询请求;
2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内;
限制通告级别:arp_announce
0:默认值,把本机所有接口信息向每个接口通告;
1:尽量避免向非本网络通告;
2:总是避免向非本网络通告;
(1)各主机一个接口即可,但需要在同一物理网络中;
(2)RIP的网关不能指向DIP,RIP和DIP通常应在同一网络,但此二者未必会与VIP在同一网络;
(3)各RS需要先设置内核参数,再设置VIP和路由;
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
响应报文不用经过Director,每个RS必须配置VIP,为了避免地址冲突,有3种方式; 第一,在路由器上做静态绑定Director上的MAC与Director上的VIP,各RS还有添加arptables拒绝网络通告;
第二,在RS上仅适用arptables解决;第三种,修改内核参数解决;每个主机只需一块网卡即可,各主机都在同一物理网络中;确保请求报文能到达Director,Director收到报文后挑选出一台RS负责响应,在Director上把报文重新封装MAC,把报文转发给该RS;
在各RS上,先隔离arp通告,再添加入栈路由即到达VIP必须经lo:0这样的别名(VIP地址配置在的别名接口)接口上,这样出栈时,源IP才能被改成VIP;
请求报文经过过Director,响应报文不经过Director,各RS的网关不能指向DIP;端口映射不能实现;如果VIP和RIP不在同一网段;如何确保响应报文能出去;
禁止本机向外广播自己,但可以响应其它主机发的广播;
在各RS上设置通过网卡别名进来的报文还要通过该别名出去:
在各RS上设置arp通告级别即修改两个内核参数arp_ignore、arp_announce,因为地址是属于内核的,所以在Linux主机默认的通告方式是所有本机的可用IP地址通告给每个接口;
arp_announce要限制通告级别,每一个网卡仅在把自己的网络地址向所在物理网络中通告,即各网卡间地址绝不交叉通告;
arp_ignore是限制响应别人arp请求的级别;默认响应请求是无论从哪个接口接收到arp请求,只要本机有这个地址都会响应;限制arp响应级别后可实现,从哪个网卡接收的arp请求,必须与该接口属于同一网络时才响应;arp_ignore设置为1;
fwm:FireWall Mark
在netfilter上给报文打标记;在mangle表上实现;mangle表可以应用在5个链上;
在报文进入时,进行打标记,例如目标IP是VIP端口80,把这类报文分拣出来打标,标记一般为十六进制整数,例如标记1;在input链上定义集群服务时,就可判定如果防火墙标记为1,则为集群服务;把本来在input链上完成识别、定义集群服务分成了两步,识别在prerouting做,定义在ipvs(inputing)上实现;
1、打标使用iptables实现:
~]# iptables -t mangle -A PREROUTING -d 172.18.11.7 -p tcp –dport 80 -j MARK –set-mark 1
//在mangle表上的prerouting链上,目标ip(VIP)为172.18.11.7,目标端口为80,打标记为1; 查看:iptables -t mangle -vnL
mark标记里包含了IP地址和端口;定义集群服务时使用mark即可;
~]# ipvsadm -A -f 1 -s rr //定义mark标记为1的报文为集群服务,调度算法为rr;
~]# ipvsadm -a -f 1 -r 172.18.11.8 -g -w 1 //添加RS到mark标记为1的集群服务中,集群类型为lvs-dr,权重为1;
]# ipvsadm -a -f 1 -r 172.18.11.9 -g -w 1
2、防火墙标记好处:可以把2个服务打成一个标记;就可把2个服务当做一个集群来调度;
在另一台主机测试:
]# curl http://172.18.11.7
多次请求后,发现实现了rr调度算法,响应比率为1:1;
3、打标记的方法:
~]#iptables -t mangle -A PREROUTING -d $vip -p $protocol –dport $clusterserverport -j MARK –set-mark #
#:代表十六进制整数;
4、打标作用:
提供辅助持久连接功能;在多个端口定义服务时,可把相关作为一个集群来调度;
lvs persistence:持久连接;
基于持久连接模板(就上一个哈希表),能实现无论使用任何算法调度,都能进行在一段时间内,将来自同一源IP的请求始终发往同一RS;
可定义持久连接时间、无论使用什么算法都能持久连接;还可将两个不同的服务绑在一块进行调度;
1、ipvs的持久类型:
Port Affinity:借助于FireWall Mark能过完成将多个端口绑定在一起并使用持久链接来实现统一调度;
每端口持久(PPC):per port connect 每集群服务单独定义,并定义其持久性
来自于同一源IP的客户端请求不同的服务,当访问web的80端口时,就可绑定,访问数据库服务的3306端口时,则会重新进行调度;只持久单个服务;
每客户端持久(PCC):per client conect 基于0端口(任意端口)定义集群服务,将客户端对所有应用的请求通通调度至后端主机,而且可使用
同一个Director调度多个集群服 务,多个集群服务由同一组RS提供即一个RS提供80,443,3306等服务;如果同一客户端请求,始终发往同一的RS响应;对所有服务同时持久;
每FWM持久: 基于防火墙标记定义持久的集群服务,可实现将多个端口上的应用统一调度,同一个标记下有多个服务时被统一调度
只要是防火墙标记是一样的,就始终发往同一RS响应;只持久同一防火墙标记下的连接;
2、定义持久连接的方法:
ipvsadm -A|E -t|u|f service-address [-s scheduler] -p [timeout]
默认持久连接时间为300秒;
示例1:定义每FWM
# iptables -t mangle -A PREROUTING -d 172.18.11.7 -p tcp -m multiport –dports 80,443 -j MARK –set-mark 10
# ipvsadm -A -f 10 -s rr -p 60
# ipvsadm -a -f 10 -r 172.18.11.8 -g -w 1
# ipvsadm -a -f 10 -r 172.18.11.9 -g -w 2
示例2:每客户端持久(PCC)连接:
]# ipvsadm -A -t 172.18.11.7:0 -s rr –p //添加集群服务,设置VIP、端口为0表示所有端口,集群调度使用rr算法,开启持久连接功能;
]# ipvsadm -a -t 172.18.11.7:0 -r 172.18.11.8 -g -w 1
]# ipvsadm -a -t 172.18.11.7:0 -r 172.18.11.9 -g -w 1
把RS加入集群服务,集群类型为lvs-dr,权重为1;
在另外一台主机测试80和23端口:
]# curl http://172.18.11.7
]# telnet 172.18.11.7
测试结果为同一RS响应各种服务
实验:
一、查看状态
1、]# ipvsadm -Ln 查看ipvs服务,以数值格式显示;
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
其中:
Port显示协议,只有三种:tcp、udp、firewalls mark;
Scheduler表示调度方法;
RemoteAddress:Port 表示RS(真实服务器)地址;不同集群服务,一般RS不同;
Forward 表示转发方法;
Weight 表示权重值;
ActiveConn 活动连接数;
InActConn 非活动连接数;
2、]# ipvsadm -Ln –rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
其中:
CPS:表示每秒钟的连接数;
InPPS:每秒的入栈报文数;
OutPPS:每秒的出栈报文数;
InBPS:每秒的入栈字节数;
OutBPS:每秒的出栈字节数;
3、]# ipvsadm -Ln –stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
其中:
Conns:表示总的连接数量;
InPkts:入栈报文数;
OutPkts:出栈报文数;
InBytes:入栈字节数;
OutBytes:出栈字节数;
二、添加集群服务
例1:添加一个LVS-nat类型的集群服务
实验拓扑:
实验环境:
1.LVS拥有两个网卡,并且属于不同网段;
2.RS需要添加从VIP进来的地址必须从lo上的vip出去;
3.RS的网关需要指向DIP;
4.RS只能拥有一个网卡;
5.关闭iptables 和 selinux;
6.LVS开启内核Forward;
7.RS搭建web服务用于测试;
8.LVS安装ipvsadm程序:yum install -y ipvsadm
实验步骤:
一、搭建RS1:
1.设置网络信息:设定RIP地址
~]# ifconfig eth1 192.168.1.2 up
~]#route add default gw 192.168.1.10
2.搭建文本服务:
~]#yum install -y httpd
~]#echo “<center><h1>Welcome RS1<h1><center>” > /var/www/html/index.html
3.关闭防火墙规则及selinux
~]# iptables -F
~]#setenforce 0
二、搭建RS2:
1.设置网络信息:设定RIP地址
~]# ifconfig eth1 192.168.1.4 up
~]#route add default gw 192.168.1.10
2.搭建文本服务:
~]#yum install -y httpd
~]#echo “<center><h1>Welcome RS2<h1><center>” > /var/www/html/index.html
3.关闭防火墙规则及selinux
~]# iptables -F
~]#setenforce 0
三、搭建LVS
1.设置IP:
~]# ifconfig eth0 10.1.1.25/16 up //设定VIP
~]# ifconfig eth1 192.168.1.10 up //设定DIP
2.开启内核Forword功能:
~]#echo “1” > /proc/sys/net/ipv4/ip_forward
3.添加集群服务:
~]# ipvsadm -A -t 10.1.1.25:80 -s rr
-A:添加集群服务
-t:添加tcp协议的集群服务地址为10.1.1.25,端口为80
-s:指定集群服务的调度方法为rr:轮寻调度,不指明为默认wlc;
~]# ipvsadm -a -t 10.1.1.25:80 -r 192.168.1.2 -m
~]# ipvsadm -a -t 10.1.1.25:80 -r 192.168.1.4 -m
-a:添加集群上的RS
-t:指定定义为tcp协议的管理集群服务的地址
-r:向已存在的VS添加RS地址
-m:指明集群的工作类型为LVS-nat
实验结果:
1.使用curl命令循环请求10.1.1.25web服务,LVS会交替响应不同的web界面
[root@Centos ~]# for i in {1..10} ;do curl http://10.1.1.25 ;done
<center><h1>Welcome RS1<h1><center>
<center><h1>Welcome RS2<h1><center>
…….
注意事项:
1.由于使用的调度方法为rr轮寻,所以在定义RS的时候没有必要对RS指定权重
2.不能使用浏览器进行测试,浏览器有缓存,测试不正确
例2:添加一个LVS-DR类型的集群服务
实验拓扑:
实验环境:
1.LVS同一个网卡,配置DIP和VIP,VIP配置在网卡别名上,并且属于同网段。
2.RS的网关不能指向DIP;
3.RS需要对所有网卡设定内核参数arp_ignore和arp_announce分别为1和2;
4.RS需要在lo网卡接口上定义别名,ip为VIP,并且对内核参数进行设置;
5.关闭iptables 和 selinux;
6.RS搭建web服务用于测试;
7.LVS安装ipvsadm程序:yum install -y ipvsadm
实验步骤:
一、搭建RS1:
1.设置内核参数:
~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
2.设置网络信息:设定RIP地址
~]# ifconfig lo:0 10.1.1.20 netmask 255.255.255.255broadcast 10.1.1.20 up //设定VIP
~]# ifconfig eth1 10.1.2.25/16 up //设定RIP
~]# route add -host 10.1.1.20 dev lo:0 //设定从VIP进来的从lo:0出去
3.搭建文本服务:
~]#yum install -y httpd
~]#echo “<center><h1>Welcome RS1<h1><center>” > /var/www/html/index.html
4.关闭防火墙规则及selinux
~]# iptables -F
~]#setenforce 0
二、搭建RS2:
1.设置内核参数:
~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
2.设置网络信息:设定RIP地址
~]# ifconfig lo:0 10.1.1.20/32 broadcast 10.1.1.20 up //设定VIP
~]# ifconfig eth1 10.1.3.25/16 up //设定RIP
~]# route add -host 10.1.1.20 dev lo:0 //设定从VIP进来的从lo:0出去
3.搭建文本服务:
~]#yum install -y httpd
~]#echo “<center><h1>Welcome RS1<h1><center>” > /var/www/html/index.html
4.关闭防火墙规则及selinux
~]# iptables -F
~]#setenforce 0
三、搭建LVS
1.设置IP:
~]# ifconfig eth1 10.1.1.25/16 up //设定DIP
~]# ifconfig eth1:10 10.1.1.20/32 broadcast 10.1.1.25 up //设定VIP
2.添加集群服务:
~]# ipvsadm -A -t 10.1.1.20:80 -s wrr
-A:添加集群服务
-t:添加tcp协议的集群服务地址为10.1.1.25,端口为80
-s:指定集群服务的调度方法为rr:轮寻调度,不指明为默认wlc;
~]# ipvsadm -a -t 10.1.1.20:80 -r 10.1.2.25 -g -w 1
~]# ipvsadm -a -t 10.1.1.20:80 -r 10.1.3.25 -g -w 10
-a: 添加集群上的RS
-t:指定定义为tcp协议的管理集群服务的地址
-r:向已存在的VS添加RS地址
-g: 指明集群的工作类型为LVS-DR
-w: 指定后端RS的权重
实验结果:
1.使用curl命令循环请求10.1.1.25web服务
[root@Centos ~]# for i in {1..10} ;do curl http://10.1.1.25 ;done
<center><h1>Welcome RS2<h1><center>
<center><h1>Welcome RS1<h1><center>
<center><h1>Welcome RS2<h1><center>
<center><h1>Welcome RS2<h1><center>
<center><h1>Welcome RS1<h1><center>
…….
2.权重越高的服务量越大
注意事项:
1.在定义RS的lo接口上的VIP时,需要先关闭内核参数;
2.RIP和VIP应该在同一网段,不同网段需要借助路由器实现;
3.RS需要添加从VIP的IP地址进来的地址从lo接口出去的网关(route add -host 10.1.1.20 dev lo),刚好实现封装转发VIP–CIP;
4.RS的默认网关不能指向Director
5.关闭防火墙和Selinux;
原创文章,作者:Lii,如若转载,请注明出处:http://www.178linux.com/55031