Linux集群(Cluster)
一.概论
1.定义 Cluster:计算机集合; linux集群,多台Linux主机为解决某个特定问题组合起来形成的单个系统; 由于现代化业务上线的需求, 单服务器已经不能满足业务的需要, 业务服务器需要承载更的访问请求.或者单台服务器故障(SPOF,single point of failure)将导致所有服务不可用. 此情况下, 需要把各种相同的业务服务器连合起来为某个相同的业务提供服务.以达到高并发,快速响应的需求. 集群技术和Linux操作系统实现了一个高性能和高可用的服务器, 具有很好的可伸缩性,很好的可靠性, 很好的可管理性. 我们知道服务器集群的重要性以及必要性,而实现服务器集群主要就是为了负载均衡(Load Balance),负载均衡就是有两台或者以上的服务器或者站点为我们提供服务, 我们将来自客户端的请求靠某种算法尽量平均分摊到这些集群中,从而避免一台服务器因为负载太高而出现故障。 简而言之便是将所有的负载均分到多台服务器中,即使其中某个出现故障,用户也能正常访问,得到服务。 DNS可以使用单个域名指向多条A记录,也可以达到负载均衡效果,但效果不理想.因为DNS的解析记录是可以被缓存的,而用户执行的DNS服务器大都是缓存服务器, 大量用户访问缓存服务器,造成缓存服务器拥挤,而备份服务器没有连接.对负载效果要求较高的大型站点是不能依赖DNS啦完成负载的目的. 这时需要有专门的主机,来完成负载均衡的效果.这台主机负责接收所有用户的请求,并将其分发至后端具有相同功能的多台主机,这个分发主机就称为负载均衡器, 调度器,分发器.可以根据某种算法将用户请求调度至后台的多台主机.配合后端主机,着个组合就可以叫做负载均衡集群. 如果后端主机中的某一台主机出现故障,调度器还会不会调度到这台故障合主机上呢?需要调度器对后端每一个主机进行健康状态监测.
2.Linux Cluster类型: LB(Load Baiancing):负载均衡集群; 实现: 将同一种应用的大量请求,分散至多台主机响应; 针对无关联关系的单一请求; 优势: 各请求彼此之间是无连接状态的,使用负载均衡集群是最好的解决方案; 对实际应用有挑战,需要解决; HA(High Availiabity):高可用; 实现:多台主机结合起来,共同承载大量请求; 优势:提高服务可用性;通过冗余的方式,解决单点故障问题 衡量公式: A=MTBF/(MTBF+MTTR) 系统可用性=平均无故障时间/(平均无故障时间+平均修复时间) 可用性处于(0,1)的区间中,无限接近于1最好 ,用百分比来衡量,90%,95%,99%,99.5%,99.99%,99.999% 每10倍的提升 59指标:99.999% 每年故障时间5分钟,代价极高 实现方式:通过冗余节点实现,在线节点不断广播自己的健康状态,在一定时间内无响应,冗余节点会夺取IP,启动服务,代替主节点工作; HP(High Performance):高性能; 实现:多台主机分散复杂问题的计算量. 解决庞大的复制的单一问题 优势:提升系统性能; 劣势:对主机性能要求高,分布式系统渐渐替代HP top500组织:每半年统计全球前500台超级计算机. 超级计算机大部分都是通过集群的方式实现 www.top500.org 3.系统扩展方式: Scale UP:向上扩展; 用高性能主机替代低性能的主机; 并不会随着系统性能的提升带来负载线性提升,价格提升速度大于性能提升速度;性价比低,有临界点 Scale Out: 向外扩展; 当一天只不足与性能时,添加多台主机组合解决问题,集群的方式 4.站点指标: PV:page view 页面浏览量 对真正的页面入口访问,而不是页面上的每个资源 只记录有效访问,超短时间内多次访问为一次访问 UV:user view 用户访问量 单个访问者就是一个UV UV小于PV,一个UV访问多个PV IP: 独立IP访问量 在同一站点开启浏览器进程访问页面,cookie不同,可以为两个不同的访问者,但使用同一个IP 多用户单IP ip量小于UV量 5.LB 集群: LB实现: 硬件: 硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,由专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高, 加上多样化的负载均衡策略,智能化的流量管理,但是相对来说成本较高。 受到了用户的广泛认可,基于简单的Web管理界面,实现4-7层负载均衡、通用持续性、响应错误处理、SSL加速、智能HTTP压缩、TCP优化、第7层速率整形、 内容缓冲、应用攻击过滤、拒绝服务(DoS)攻击和SYN Flood保护等等强大的功能 F5 Big-IP 最常用,最贵 F5提供虚拟系统练习,F5官网下载 Citrix Netscaler A10 A10 Cisco LocalDirector 软件: LVS:Linux Virtual Server 内核级实现,最大四百万并发,适合大公司,小公司不适合;原生态,辅助功能不健全 Nginx: haproxy: ats:apache traffic server pertbal pound 其中 LVS 主要工作与网络模型中的第四层,而 Nginx 主要工作于第七层, HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机。 其中 LVS 抗负载能力强只是工作在网络4层之上仅作分发之用,没有流量的产生,并且工作稳定, 自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat,在项目实施中用得最多的还是LVS/DR+Keepalived。 软件方式基于工作的协议层次划分: 传输层:通用解决方案 基于DIp:Dpor(目标ip和目标端口)分发 基于端口分发的设备叫做四层交换机(路由器) LVS: 真传输层调度 不依赖套接字,不依赖端口,并发量能力巨大,取决于内核带宽能力和网络带宽转发能力 LVs工作在内核层,数据不会进入用户空间,向后端转发仅仅是路由转发功能,没有套接字 nginx:(stream机制) 模拟传输层调度 nginx监听于套接字,收到用户请求,用户请求经过端口,进入nginx用户空间.nginx进程模拟成某一个后端服务的客户端,与后端主机基于另一个套接字通信.nginx面对大量用户请求,要打开大量随机端口,而端口数量有限,所以有并发响应能力有限,不能多于65534个请求,另一个用于前端连接用户请求. haproxy:(mode tcp) 模拟传输层调度 应用层:专用解决方案 根据应用层的请求内容来进行分发 自定义的请求模型分类进行分发 proxy server http协议:nginx,httpd,haproxy(mode http) fastcgi协议:nginx,httpd.... mysql协议:mysql-proxy.... 大并发的每一种应用层协议都有专用的调度解决方案 6. 会话保持机制:有会话的负载均衡必须有的功能 服务端通过cookie+session来识别客户端,通过cookie追踪用户身份,在服务端用session保存用户的活动信息. 用户请求被分发给不同主机,不同主机对同一用户的cookie+session不同,需要在当前服务器上保存追踪用户状态,由于服务器上有用户的状态,使得用户请求一分发,另一台服务器重新进行状态追踪,就使得两边没办法同步用户信息,影响负载均衡效果,使得两台分发主机上的用户信息不一致. 要让用户无论怎么刷新,怎么调度,都能获取自己的状态数据.需要完成对用户请求的session保持(会话保持)功能. (1)会话粘性(session sticky) 识别用户身份 用户第一次访问时,调度器按需调度,一旦调度到某一台主机,那么在一定时间内,用户的访问将绑定在这台主机上; 损害负载均衡的效果;另一方面,服务器的宕机意味着用户信息丢失. 操作简单,只要识别用户身份;但识别用户身份才能绑定,必须知道用户是否访问过主机,通常在服务端维护一个追踪会话表,把用户的源ip地址第一次调度到哪台主机的记录下来.用户访问先查表,如果有记录,就不进行调度,按照表中的记录,分发到对应的主机.如果没有记录,在进行调用分发.靠源ip追踪客户端身份,但不安全. 绑定方式: source ip cookie 适合web服务: (2)session replication; session复制集群 主从之分 把多台后端服务器做成session集群,彼此之间随时通过多波或广播或单播地址把自己主机上所维持的session数据同步到同一集群的其他主机;任何一主机宕机,任何一主机都有整个集群的session数据,但每一个主机维持整个集群的session数据,浪费系统资源,小规模适用. (3) session高可用集群 活动非活动之分 session replication 由于让单个主机维持整个集群的session数据,浪费系统资源,所以单独运行一台服务器,存放session.任何一台服务器读取,更新在同一台主机上,可供所有主机访问session.但需要基于网络IO来获取,可能会有一点延迟.应该使用高性能的存储设备.还要做好冗余功能. 解决存储设备间复制,前端分发,会话集群, 前端高可用.
LVS (Linux Virtual Server)
1.作者:章文嵩 阿里--->滴滴 2.组件: VS: Virtual server Director,Dispatcher,Balancer 调度器,分发器 Rs: Real server 后端真正提供服务的服务器 3.定义: LVS( Linux Virtual Server)是一种负载均衡(LB,Laod Balance)技术,采用IP负载均衡技术和基于内容请求分发技术。具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行。 LVS是一套组件(ipvs与ipvsadm),类似与iptables,ipvs相当于netfilter,是能将用户请求转发的框架,需要依赖以规则完成转发,工作于内核中的INPUT链上,并依赖于规则进行转发,而ipvsadm是用来定义规则的工具。 LVS工作在TCP/UDP协议的四层,能根据用户请求的IP与PROT进行转发,即LVS能实现四层交换、四层路由。 l4: 传输层软件负载均衡调度器,也可以说是四层路由器,四层交换机; vs: 根据请求报文的目标协议及端口将其调度转发至某后端的Real server; 根据调度算法来挑选RS,接受转发来的用户请求; 3.工作模型: 架构类似于iptables/netfiltew. iptbaels:用户空间的管理工具 netfile:内核空间的框架,iptables的规则必须放在netfile的钩子函数上才能发挥效用 流入:PREROUTING--->INOUT 流出:OUTPUT --POSTROUTING 转发:PREROUTING-->FORWARD--POSTROUTING DNAT:目标地址转换;工作在PREROUTING或OUTPUT,在到达主机时就转发地址,目标地址需要DNAt,那么目标地址就是防火墙主机,那么下一步,路由完之后,就势必发往INOUT. lvs:有ipvsadm/ipvs组成 ipvsadm:用户空间的命令行工具,规则管理器,用于管理集群服务及Real Server; ipvs:工作于内核空间的netfilter的INPUT钩子之间的调度框架;负责在内核完成调度和分发,真正的调度器.靠规则来实现 工作在INPUR链上,请求的数据报文首先到达PREROUTING链,能监控用户请求的是哪一服务,然后强行改变数据报文的流向,不往用户空间发送,而是直接发送到FORWARD和POSTROUTING,经由网卡发送到后端主机处理(转发到内部服务器类似于iptables的DNAT,但它不更改目标IP(也可以更改目标IP))..LVS工作在四层,根据请求报文的目标IP和目标PORT将其转发至后端主机集群中的某台服务器(其是根据调度算法).支持TCP,UDP,SCTP,AH,ESP,AH_ESP等协议的众多服务 不建议在前端调度器上使用iptbales过滤规则,尤其是在INPUT链上,以免屏蔽掉报文; 强行改变发往内部主机的报文,直接发送到POSTROUTING.转发给后端主机. 4.LVS 的集群特点 1、在功能上: 有实现三种IP负载均衡技术和八种连接调度算法的IPVS软件。在IPVS内部实现上,采用了高效的Hash函数和垃圾回收机制,能正确处理所调度报文相 关的ICMP消息(有些商品化的系统反而不能)。 虚拟服务的设置数目没有限制,每个虚拟服务有自己的服务器集。它支持持久的虚拟服务(如HTTP Cookie和HTTPS等需要该功能的支持),并提供详尽的统计数据,如连接的处理速率和报文的流量等。 针对大规模拒绝服务(Deny of Service)攻击,实现了三种防卫策略。 有基于内容请求分发的应用层交换软件KTCPVS,它也是在Linux内核中实现。有相关的集群管理软件对资源进行监测,能及时将故障屏蔽,实现系统的高可用性。 主、从调度器能周期性地进行状态同步,从而实现更高的可用性。 2、在适用性上: 后端服务器可运行任何支持TCP/IP的操作系统,包括Linux,各种Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows NT/2000等。 负载调度器能够支持绝大多数的TCP和UDP协议: | 协 议 | 内 容 | |--------|--------| | TCP | HTTP,FTP,PROXY, SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等| UDP | DNS,NTP,ICP,视频、音频流播放协议等 |无需对客户机和服务器作任何修改,可适用大多数Internet服务。 3、在性能上: LVS服务器集群系统具有良好的伸缩性,可支持几百万个并发连接。 配置100M网卡,采用VS/TUN或VS/DR调度技术,集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。 5.lvs集群类型中的常用术语: VS: Virtual server Director 调度器,分发器 Rs: Real server 后端提供真正服务的服务器 CIP:client ip 客户端IP 外网ip VIp:Virtual ip LVS的前端IP 外网ip Dip:Director ip LVS的后端IP 私网iP 于RIP通信 Rip:Real server 后端真正提供服务的服务器IP Cip--> vip == Dip---> RIp
lvs集群类型:
lvs-nat:修改请求报文的目标ip完成转发, lvs-DR:封装新的MAC报文首部,不改原报文报文 lvs-tun: 建立ipip隧道,在原请求IP报文之外新加一个IP首部; Lvs-fullnat:修改请求报文的源和目标IP
lvs-nat:修改请求报文的目标ip完成转发,
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑选出的RS的RIP和PORT实现转发;
特性: (1)RIP和DIP必须在用一个网络,且应该使用私网地址,RS的网关要指向DIP; (2)请求报文和响应报文都必须经由Director转发,Director容易成为系统瓶颈 (3)支持端口映射,可修改请求报文的目标Port; (4)VS必须是Linxu系统,rs可以是任意系统; 优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址 缺点: 扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。 当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!
lvs-DR:
Direct Routing,直接路由 Director将接收到的请求报文源IP/port,以及目标Ip/port都不做修改,,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的Rs的Rip所在接口的MAC地址;通过交换机发送给RS server,当RS server拆解后发现源目标IP不是自己,此时要在RS上配置VIP,即RS服务器有RIP和VIP,此时有一些问题: (1)地址冲突 RS有VIP将会与VIP冲突 (2) 广播回应 当有VIP的广播请求时,RS将会把系统上所有的IP进行广播 解决问题的目的:把RS上的VIP隐藏起来,发送响应报文时把vip当做源ip使用 MAC地址用于本地网络通信,IP实现网络间通信.任何到达本地之间的通信都应该是MAC地址通信.从路由器的网卡接口到RS的网卡或VS的网卡接口,都是MAC地址转发.路由器收到用户的请求报文,发现MAC地址是自己.但目标Ip不是自己,需要知道VIP的在哪个主机的哪个接口,MAC地址是什么?使用ARP地址解析协议.路由器向整个本地网路广播.寻找Vip的MAC地址.凡是有VIP的主机都会响应自己的位置和MAC地址.路由会根据ip的对比,转发数据报文给VS服务器.而RS服务器也会想路由响应.所以就要限制RS服务器上的VIP响应.
DR类型工作流程 如上图所示:当客户端请求VIP时,通过互联网到达前端路由Route1,再通过交换机到达Dirctor上;而Dirctor在收到请求报文后,通过定义在ipvs规则中的各rip去获得各RS的MAC地址,并在此报文外再封装一个MAC地址,源MAC为Dirctor的dip端口的MAC而目标MAC改为其中一个RS的MAC,但该报文的目标ip(VIP)不变,最后通过dip接口发送给RS; 为了RS能接收Dirctor发来的报文,需要在各RS上也配置VIP,但RS上的VIP是需要隔离前端arp广播的,所以需要将各RS上的VIP隐藏*(通常配置到lo网卡接口的别名上,并配合修改linux内核参数来实现)*;而RS封装响应报文时,源IP为VIP,目标ip为CIP,并通过RIP的网络接口直接向外发送响应,不再经过Dirctor。 需要注意的是:因为Route1的A点的IP和Dirctor的VIP在同一网段内,VIP通常是公网IP;而DIP、RIP通常是私有IP,且这两个IP通常也应在同一物理网络内; 假设RIP响应时指向的网关为Route1的A点,这就意味着RIP与A点不在同一网段内,因此将无法响应给客户端,所以需要另加一个路由route2,Route2能够通过D接口访问互联网,且Route2的C点的IP需要与RIP在同一网段内,此时RIP响应的报文就通过Route2发送。 上文括号部分的实现及确保前端路由器将目标IP为VIP的请求报文发往Director,方法c是最佳的选择: (a) 在前端网关即Dirctor做静态绑定 (b) 在RS上使用arptables (c) 在RS上修改内核参数以限制arp通告及应答级别: 特性: (1)Director和各Rs都得配置使用Vip,VS的VIp配置在DIP所在的网卡别名上,RS的VIP配置在LO网卡上; (2)确保前端路由器将目标IP为VIp的请求报文,一定会转发给Director,解决方案如下: (a)静态绑定:在前端路由器上把VIP和director的MAC进行绑定. 缺点: 不能做director的高可用,前端路由器可能由ISP提供 路由器不用主动发送广播,寻找MAC.但却可以接受任何人的动态请求.RS主机的VIP会向全网通告.路由收到RS的通告,依然会向RS发送数据报文. (b)禁止RS响应VIP的ARP请求 arptables : 定义一个ARP的访问控制 修改各RS的内核参数,并把VIP配置在特定的接口上实现,并禁止其响应发送ARP广播(通常将VIP配置在lo的子接口上) (c)在各RS修改内核参数,限制arp响应和通告的级别;ip属于内核,不属于网卡.所以要修改内核参数,限制VIP通信. 限制响应级别:arp_ignore /proc/sys/net/ipv4/conf/all/arp_ignore 0:默认值,表示可使用本地任意接口上, 限制通告级别;arp_announce /proc/sys/net/ipv4/conf/all/arp_announce 0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告; 1:尽量避免向非直接连接网络进行通告; 2:必须避免向非网络通告; (3)Rs的RIP可以使用私网地址,也可以是公网地址,以便于远程管理与监控。;RIP于DIP在同一IP网络; (4)RS跟Director要在同一物理网络; (5)请求报文要经由Director调度,但响应报文不能经由Director,而是有RS直接发往Clinent; (6)不支持端口映射;也就是Real Server 的端口必须是与 VS对外服务的端口一样 (7)各RS可以使用大多数OS (8)RIP和VIP也应该在同一网段.路由器出口和VIP在同一网段,如果RIP和VIP不在同一网段,那么RIP就跟路由器不在同一网段.RIP的网关就得指向路由器的另一个接口.RS的响应就更加复杂. 优点:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。 与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。 缺点:(不能说缺点,只能说是不足)要求负载均衡器的网卡必须与物理网卡在一个物理段上。
lvs-tun:ipip隧道 跨越互联网,支持长距离转发
VS/DR 限制 Real Server 与 Load Balancer 必须在同一个物理网络中,那若是分散在各地岂不是无法使用?所以有了 VS/TUN(Virtual Server via IP Tunneling)的诞生。 IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。 IP隧道技术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。 我们利用IP隧道技术将请求报文封装转发给后端服务器,响应报文能从后端服务器直接返回给客户。但在这里,后端服务器有一组而非一个, 所以我们不可能静态地建立一一对应的隧道,而是动态地选择 一台服务器,将请求报文封装和转发给选出的服务器。 这样,我们可以利用IP隧道的原理将一组服务器上的网络服务组成在一个IP地址上的虚拟网络服务。 VS/TUN的体系结构如图所示,各个服务器将VIP地址配置在自己的IP隧道设备上。 转发方式:Director收到报文后,不修改请求报文的源IP首部(源ip为cip,目标ip为vip),而在原ip报文之外再封装一个ip首部(源ip是DIp,目标ip为Rip),将报文发往挑选的目标RS;确保每个RIP要有一个VIP, RS主机接收到报文后,回应时源IP为VIP,目标IP为CIP 请求报文不能太大,如果在请求报文上在添加一个ip首部,可能会大于MTU,以太网传输有MTU限制,以太网最大传输单元.早期是1500字节.报文过大.在传输过程中.交换等设备会无法正常交换,导致数据丢失.一般会有限制. 此架构主要用于容灾.地球不爆炸,服务不会挂.
特性: (1)DIP,VIP,RIP都应是公网地址, (2)RS的网关不能,也不可能指向DIP; (3)请求报文要经由Director,响应报文一定不经过经由Director, (4)不支持端口映射 (5)RS的OS得支持隧道功能; 优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动, 负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。 缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。 封装两个IP报文首部会有问题: MTU大小为1500的大小,而再加一个IP报文首部会超出MTU的大小,导致路由器拒收(因为传输之前已经被切片传输的大小为1500字节)
Lvs-fullnat:修改请求报文的源ip地址和目标IP地址进行转发;
LVS默认不支持此类型,需要使用淘宝的专用内核,或使用淘宝的专用补丁打入自己的内核. Director收到报文后, 将源IP(CIP)修改为(DIP),目标地址(VIP)修改为(RIP),转发给RIP, 当RS主机收到报文后,回应时,源IP为RIP, 目标IP为VIP.Director收到报文后,将源IP修改为自己(VIP), 目标IP修改为CIP,响应给客户端 cip --> Dip VIp -->Rip 特性: (1)Vip是公网地址,Rip和DIP是私网地址,且通常不在同一个ip地址,因此,RIP的网关一般不会执行DIP; (2)RS收到的请求报文源地址是DIP,因此,只需响应给DIP,但Director还要将其发往Clinet; (3)请求和响应报文都经由Director; (4)支持端口映射;
LVS scheduler: 调度方法
无论LVS的类型,都是调度器将请求报文分发给后端主机,用什么办法挑选后端主机呢?根据调度算法 根据其调度时是否考虑各RS当时的负载状态,可分为静态方法和动态方法两种: 静态:仅根据算法本身进行调度 RR: (roundrobin) 轮询 轮流替换,一替一个,一次一个 缺点: 性能好的服务器比较空闲,而性能差的服务器会很繁忙 WRR: (Weighted roundrobin) 加权轮询 不同主机的负载能力不同 ,考虑当前服务器的权重,权重越大,负载越大 缺点: 有的情况下,当性能好的服务器分配了更多的长连接,而性能差的分配的大多数都是短连接,此时会造成性能好的服务器处理列多的连接, 压力比较大,而性能差的服务器,还处于空间状态,造成假负载 SH: (Source Hashing),实现session Sticy; 源ip地址哈希,将来自于同一个IP地址的请求始终发往第一个挑中的RS,从而实现加权轮询. 能始终将同一个IP引导到同一台RS服务器.(在Director服务器上维护一个hash表,其是KV格式,键就是源IP地址,值就是RS的地址,每次都会查找hash表, 如果能查询到前一次的连接记录,就直接发送到RS服务器,如果没有,就使用WRR算法进行调度) 缺点:随着时间推移,旧的IP地址会很多,这样会让固定的RS服务器压力大 DH:(Destination Hashing);目标地址哈希,将发往同一个目标地址的请求始终转发至同一个挑中的RS;如果没有,就使用WRR算法进行调度),配合缓存机制. 缺点: 如果另一个客户端也请求同一个目标地址, 它也会将这个请求使用同一个网关进行发送, 如果对同一目标地址请求比较大, 这样会造成同一网关的负载压力,会损坏负载的效果. 多用于缓存服务器. 动态:主要跟据每RS当时的负载状态及调度算法进行调度; Overhead=(active)活动连接数*256+(inactive)非活动连接数 LC:least Connextions 最少连接 按照公式计算哪个RS的最少连接数,值小挑中谁, 如果RS的最少连接数都一样,会进行轮循,overhead值小的将会接收下一次请求 Overhead=活动连接数*256+非活动连接数 例: RS1: 10,100 RS2:20,10 Rs1的值下,所以RS1接收下一个请求 缺点: 不能根据服务器的性能进行分发请求 WLC:Weighted LC 加权最少连接 默认算法,相对最公平 Overhead=(活动连接数*256+非活动连接数)/weighted(权重) 权重越大,得出的值越小 例: RS1 : 10,100,1 RS2 : 20,10,3 RS2将会挑出来接收下一个请求 缺点: 当两台活动连接都为0,将进行轮循,如果正好轮循到了权重小的响应,这样是不理想的,SED算法就是解决这个问题的 SED:shortest expction delay,最短期望延迟,是WLC算法的改进 不在考虑非活动连接, Overhead=(active+1)*256/weight 例: RS1 : 0,1 RS2 : 0,3 RS2将会接收下一次请求 缺点: 如果权重差别很大的情况下, 权重小的就空闲了,权重大的会一直工作,直到最少连接数大于或等于权重小的主机 NQ : Nerver Queue 永不排队,再按算法 它是SED算法的改进,当用户第一次请求进来的时候, 服务器事先根据用户的请求,依照权重大小依次分配,做到每台主机都有一个连接,随后再根据SED算法分配 LBLC : Locality-based LC 基于本地的最少连接 他是一个动态的DH算法,客户端请求一个目标地址时,当没有目标地址的连接记录,将挑选一个负载小的网关发送, 其也是正向代理时使用的算法 缺点:一段时间内,大量的访问都是旧的请求,经过绑定的缓存服务器压力过大. LBLCR : LBLCR with replication, 带复制的LBLC 当有一个目标地址被一个缓存服务器大量缓存, 而用户又大师的请求此目标地址,此时另一台缓存服务器就过于空闲, 此时LBLCR算法就会通过将压力大的缓存服务器内容复制一份到空闲的缓存服务器 DH,LBLC,LBLCR两种算法比较适合缓存服务器,SH做会话绑定.其他算法更倾向于公平调度的目的
ipvsadm/ipvs: 工具
ipvs:工作在内核,必须在编译内核时编译进去,服务器发行版会自动提供 #grep -i -C 10 " IPVS" /boot/config-3.10.0-327.el7.x86_64 查看内核编译ipvs, 支持的协议:TCP,UDP,AH,ESP,AH_ESP,SCTP; 支持算法:RR,WRR,LC,WLC,LBLC,LBLCR,DH,SH,SED,NQ ipvs集群: 设计好架构,确定好LVS类型,根据应用确定好调度方法,最后定义集群. 定义集群: 集群服务:把哪一个协议的目标端口为哪一个数字的请求报文定义为集群服务;定义哪一类的请求属于集群服务.根据协议的目标ip和端口来进行判定. 同一台调度器同时分发多个不同的服务;可调度两台有不同服务的RS,比如web,mysql;也可以调度四台有两个不同服务的主机; 服务上的RS:定义多少RS属于集群 安装ipvsadm工具: #yum install ipvsadm 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] ipvsadm --set tcp tcpfin udp ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid] ipvsadm --stop-daemon state ipvsadm -h 查看命令使用帮助 管理集群服务: 增,改: ipvsadm -A|E -t|u|f service-address -r server-address [-g|i|m] [-w weight] 删: ipvsadm -D -t|u|f service-addres -t|u|f service-address: 指定 服务地址 -t:TCP端口, VIP:TCP_PORT 例:-t tcp 192.68.1.2:80 -u:UDP端口, VIP:UDP_PORT -f:firwall MARk,防火墙标记,是一个数字; 在防火墙级别PREROUTING链上,把某个地址的某个端口的所有报文,通通打上同一个标记,基于这个标记来定义集群, 可以将两个或多个端口定义为集群,端口不同,集群不同,基于端口进行调度不同的集群.多个服务,多个集群被统一调度 -s:指定算法:指定集群调度算法,默认为wlc 管理集群上的RS: 增,改: ipvsadm -a|e -t|u|f service-address -r server-address [options] 删: ipvsadm -d -t|u|f service-address -r server-address server-address: RS的ip和端口 rip[:port] 不支持端口映射,可以不加端口 Options: lvs类型:省略此选项为默认DR类型 -g:gateway,DR类型 -l:ipip,tun类型 -M:masquerade,nat类型 -w weight:权重: 默认权重为1 支持权重的算法,该选项才有意义 [-s ] 定义算法: 清空定义的所有内容(规则): ipvsadm -C 查看 ipvsadm -L|l [options] -n:以数字形式显示 --exact:以精确数值显示 -c:显示当前连接的相关统计数据 --stats:统计数据,从服务开启到此刻,请求总数,活动,非活动数 --rate:从服务开启到此刻的速率之和 保存和重载: 规则送往内核,关机或重启服务,规则会丢失 保存: ipvsadm-save >/etc/sysconfig/ipvsadm ipvsadm -S >/etc/sysconfig/ipvsadm systemctl stop ipvsadm 重载: ipvsadm-restore < /etc/sysconfig/ipvsadm ipvsadm -R < /etc/sysconfig/ipvsadm systemctl restart ipvsadm
LVS 实现:
LVS NAt类型的实现
1.准备工作: 四台主机: Client: 客户端 CIP:10.1.249.12 VS: 调度服务器 VIP:10.1.249.13 DIP:172.18.19.121 RS1: web服务器 RIP1:172.18.19.122 RS2: web服务器 RIP2:172.18.19.123 #ifconfig eno16777736 172,18,19,123/24 up 2.网络环境 (1)把所有RS服务器的网关指向DIP地址. #route add default gw 172.18.19.121 #route -n 检查route表 (2)客户端与VIP在虚拟机的VMware1中,网关为10.1.249.1 (3)DIP于RIP1,RIP2在虚拟机的VMware8中,网关为172.18.19.1 (4)CIP只能ping通VIP,不能ping同DIP于RIP 3.服务环境: RS服务器分别部署httpd/nginx,mariadb #yum -y install httpd mariadb-server mariadb #systemctl start http mariadb #ss -tnl| grep 80 #ss -tnl| grep 3306 4.安装调取器 10.1.249.13 #yum -y install ipvsadm 5.时间同步 (1)NTP服务器 (2)chronyd服务 centos7 RS1:#systemctl start chronyd RS2:#vim /etc/chrony.conf server 172.18.19.122 iburst #systemctl restart chronyd #chronyc sources (3)手动修改,不建议 6.在VS上手动测试,后端服务 curl http://172.18.19.123 curl http://172.18.19.122 7.在VS服务器开启核心转发功能: echo 1 > /proc/sys/net/iPv4/ip_forward 8.VS服务器关闭默认防火墙 systemctl stop firewalld.service systemctl disable firwalld.server 9.在VS上设置ipvs规则 #ipvsadm -A -t 10.1.249.13 -s rr 定义集群 算法为轮询算法 rr #ipvsadm -a -t 10.1.249.13 -r 172.18.19.122 -m 添加RS至集群 使用-m指定nat类型 #ipvsadm -a -t 10.1.249.13 -r 172.18.19.123 -m 添加RS至集群 #ipvsadm -L 查看规则 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.1.249.13:http rr -> 172.18.19.122:http Masq 1 0 0 -> 172.18.19.123:http Masq 1 0 0 10.在客户端主机测试效果,通过VIP,连接web [root@wen-7 ~]# curl http://10.1.249.13 <h1>RS2</h1> [root@wen-7 ~]# curl http://10.1.249.13 <h1>RS1</h1> [root@wen-7 ~]# curl http://10.1.249.13 <h1>RS2</h1> [root@wen-7 ~]# curl http://10.1.249.13 <h1>RS1</h1> 11.循环测试 [root@localhost ~]# for i in {1..10};do curl http://10.1.249.13 ;done <h1>RS1</h1> <h1>RS2</h1> <h1>RS1</h1> <h1>RS2</h1> <h1>RS1</h1> <h1>RS2</h1> <h1>RS1</h1> <h1>RS2</h1> <h1>RS1</h1> <h1>RS2</h1> 12.把调度算法改为wrr [root@wen-7 ~]# ipvsadm -A -t 10.1.249.13:80 -s wrr [root@wen-7 ~]# ipvsadm -a -t 10.1.249.13:80 -r 172.18.19.122 -m -w 2 [root@wen-7 ~]# ipvsadm -a -t 10.1.249.13:80 -r 172.18.19.123 -m -w 1 [root@wen-7 ~]# ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.1.249.13:80 wrr -> 172.18.19.122:80 Masq 2 0 0 -> 172.18.19.123:80 Masq 1 0 0 13使用加权轮询,测试 [root@localhost ~]# for i in {1..10};do curl http://10.1.249.13 ;done <h1>RS2</h1> <h1>RS1</h1> <h1>RS1</h1> <h1>RS2</h1> <h1>RS1</h1> <h1>RS1</h1> <h1>RS2</h1> <h1>RS1</h1> <h1>RS1</h1> <h1>RS2</h1> 14.把调度算法改为SH, 会话粘性 [root@wen-7 ~]# ipvsadm -A -t 10.1.249.13:80 -ssh [root@wen-7 ~]# ipvsadm -a -t 10.1.249.13:80 -r 172.18.19.122 -m -w 2 [root@wen-7 ~]# ipvsadm -a -t 10.1.249.13:80 -r 172.18.19.123 -m -w 1 [root@wen-7 ~]# ipvsadm -Ln 15.使用sh算法,进行测试 [root@localhost ~]# for i in {1..10};do curl http://10.1.249.13 ;done <h1>RS1</h1> <h1>RS1</h1> <h1>RS1</h1> <h1>RS1</h1> <h1>RS1</h1> <h1>RS1</h1> <h1>RS1</h1> <h1>RS1</h1> <h1>RS1</h1> <h1>RS1</h1> 16.把调度算法改为wlc, 加权最少连接 [root@wen-7 ~]# ipvsadm -A -t 10.1.249.13:80 -s wlc [root@wen-7 ~]# ipvsadm -a -t 10.1.249.13:80 -r 172.18.19.122 -m -w 2 [root@wen-7 ~]# ipvsadm -a -t 10.1.249.13:80 -r 172.18.19.123 -m -w 1 [root@wen-7 ~]# ipvsadm -Ln 17.使用wlc算法,进行测试. [root@localhost ~]# for i in {1..10};do curl http://10.1.249.13 ;done <h1>RS2</h1> <h1>RS2</h1> <h1>RS2</h1> <h1>RS2</h1> <h1>RS2</h1> <h1>RS2</h1> <h1>RS1</h1> <h1>RS1</h1> <h1>RS2</h1> <h1>RS1</h1>
LVS DR类型的实现
1.准备工作: 四台主机: Client: 客户端 CIP:172.18.19.214 VS: 调度服务器 VIP:172.18.19.124 DIP:172.18.19.121 RS1: web服务器 RIP1:172.18.19.122 RS2: web服务器 RIP2:172.18.19.123
2.网络环境 (1)VIP定义在DIP的网卡别名上; (2),VIp,DIP,RIP全部在一个物理网络中,这里是虚拟网卡VMware8中,网关为172.18.19.1 3.服务环境: RS服务器分别部署httpd/nginx,mariadb #yum -y install httpd mariadb-server mariadb #systemctl start http mariadb #ss -tnl| grep 80 #ss -tnl| grep 3306 4.安装调度器 10.1.249.13 #yum -y install ipvsadm 5.时间同步 (1)NTP服务器 (2)chronyd服务 centos7 RS1:#systemctl start chronyd RS2:#vim /etc/chrony.conf server 172.18.19.122 iburst #systemctl restart chronyd #chronyc sources (3)手动修改,不建议 6.在VS上手动测试,后端服务 curl http://172.18.19.123 curl http://172.18.19.122 7.RS主机配置(预制脚本)
8.查看arp 解析,查看mac地址通信 [root@wen-7 ~]# arp -a ? (172.18.19.1) at 00:50:56:c0:00:08 [ether] on eno16777736 ? (172.18.19.122) at 00:0c:29:55:78:ed [ether] on eno16777736 ? (172.18.19.123) at 00:0c:29:d1:9c:77 [ether] on eno16777736 8.VS服务端配置 ifconfig eno16777736:0 172.18.19.124 netmask 255.255.255.255 broadcast 172.18.19.124 up ipvsadm -A -t 72.18.19.124:80 -s wrr ipvsadm -a -t 72.18.19.124:80 -r 172.18.19.122 -g -w 1 ipvsadm -a -t 72.18.19.124:80 -r 172.18.19.123 -g -w 1
9.在客户端请求资源 for i in {1..10}; do curl http://172.18.19.124 ;done
负载均衡的设计要点:
(1)是否需要会话保持 (2)是否需要共享存储或数据同步rsync 取决业务模型 共享存储:NAS,SAN,DS(分布式存储) 数据同步: rsync+inotify rsync+serync 实现数据实时同步,但数据量较大的场景时,不常用 课外作业
lvs-nat: 设计要点: (1)RIP于DIP在同一IP网络,RIP的网关要指向DIP; (2)支持端口映射 实践作业:负载均衡一个php应用 测试:(1)是否需要会话保持(2)是否需要共享存储 lvs-DR: DR模型中,各主机上均需要配置vip,解决地址冲突的方式有三种: (1)在前端网关做静态绑定 (2)在各RS使用 arptables; (3)在各RS修改内核参数,啦限制arp响应和通告的级别; 限制响应级别:arp_ignore 0:默认值,表示可使用本地任意接口上, 限制通告级别;arp_announce 0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告; 1:尽量避免向非直接连接网络进行通告; 2:必须避免向非网络通告;
FWM:firwall Mark 防火墙标记,同时调度多个服务
借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用服务使用同一个集群服务进行调度; 1.配置DR模式的LVS 2.配置mysql服务 RS1: #systemctl start mariadb #mysql >GRANT all ON *.* TO 'test'@'176.18.19.%' IDENTIFIED BY 'testpass'; >FLUSH PRIVILEGES; >exit; #mysql -h 172.18.19.122 -utest -ptestpass RS2: #systemctl start mariadb #mysql >GRANT all ON *.* TO 'test'@'172.18.19.%' IDENTIFIED BY 'testpass'; >FLUSH PRIVILEGES; >CREATE DATABASE mydb; >exit; #mysql -h 172.18.19.122 -utest -ptestpass 3.配置VS服务器 #ipvsadm -C #ipvsadm -A -t 172.18.19.124:3306 -s rr #ipvsadm -a -t 172.18.19.124:3306 -r 172.18.19.122 -g -w 1 #ipvsadm -a -t 172.18.19.124:3306 -r 172.18.19.123 -g -w 1 4.在客户端测试 for i in {1..10};do mysql -h172.18.19.124 -utest -ptestpass -e 'SHOW DATABASES';done 5.配置VS服务器,添加WEB集群 #ipvsadm -C #ipvsadm -A -t 172.18.19.124:80 -s rr #ipvsadm -a -t 172.18.19.124:80 -r 172.18.19.122 -g -w 1 #ipvsadm -a -t 172.18.19.124:80 -r 172.18.19.123 -g -w 1 6.查看集群 #ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.18.19.124:80 rr -> 172.18.19.122:80 Route 1 0 0 -> 172.18.19.123:80 Route 1 0 0 TCP 172.18.19.124:3306 wrr -> 172.18.19.122:3306 Route 1 0 0 -> 172.18.19.123:3306 Route 1 0 0 7.分别测试web,mysql的分发效果 8.清除规则 #ipvsadm -C 9.添加iptables规则 #iptables -t mangle -A PREROUTING -d 172.18.19.124 -p tcp -m multiport --dports 80,3306 -j MARK --set-mark 11 #iptables -t mangle -vnL 1定义集群服务 #ipvsadm -A -f 11 -s wrr #ipvsadm -a -f 11 -r 172.18.19.122 -g -w 1 #ipvsadm -a -f 11 -r 172.18.19.123 -g -w 1 11.ipvsadm -nL IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn FWM 11 wrr -> 172.18.19.122:0 Route 1 0 1 -> 172.18.19.123:0 Route 1 0 1 12在客户端测试 172.18.19.214 #for i in {1..10} ;do mysql -h172.18.19.124 -utest -ptestpass -e'show databases' ;done #for i in {1..10} ;do curl http://172.18.19.124 ;done
总结: VS服务器配置: 打标记方法: #iptables -t mangle -A PREROUTING -d $vip -p tcp/udp --dport[%port] MARK --set-make NUMBER 标记数字:可以是0-2^32次方的任意一个整数 基于标记定义集群服务 #ipvsadm -A -f Number [options] 添加主机至集群队列 #ipvasdm -a -f Number -r $rip -g -w 1
lvs persistence:持久连接
SH算法可以完成会话保持,但SH可以保持多长时间呢?要靠SH算法中的hash表中的超时时长,但这个超时时长不能手动定义,是由算法进行决定的. 如果我们想绑定来自于同一客户端的请求始终至一个RS,不管什么调度方法都能实现绑定,而且绑定的时长是自定义的,而不是算法强制定义的,该怎么办?虽然这个要求违反了算法的定义,但LVS确实有这个功能.能让你什么方法都能绑定会话,rr都可以,但这不是调度方法自己的功能,而是lVS本身的功能,叫LVS的持久连接. 实现原理: 保持持久连接,都要有一张保存追踪用户连接的会话表.LVS可以在LVS的核心层面上,就可以能够维持一张会话表,此前无论使用什么算法调度,都可以查询这张表.用户第一次访问时,按照指定的算法进行调度.用户再次调度时,就会查询这张表,如果用户被调度过,就给定向到记录中的RS上,如果没有被调度过,就按照算法进行调度.再次声明,此功能跟算法没有关系,跟LVS的运行机制有关,就是持久连接机制. 绑定时长还可以自己定义,无论什么算法都可以绑定. 会话表,叫做持久连接模板.实现无论任何算法,在一段时间内,实现将来自于同一个地址的请求始终发往同一个RS; 命令: ipvsadm -A|E -t|u|f service-address -r server-address [-g|i|m] [-w weight][-p [timeout]] [-p [timeout]]:定义绑定时长,默认为300s,timeout可以被省略,直接加-p选项. 使用该选项就能实现持久连接功能; 实验: (1)清空ipvs规则 ipvsadm -C (2)配置DR类型普通轮询算法调度 #ipvsadm -A -t 172.18.19.124:80 -s rr #ipvsadm -a -t 172.18.19.124:80 -r 172.18.19.122 -g -w 1 #ipvsadm -a -t 172.18.19.124:80 -r 172.18.19.123 -g -w 1 (3)测试 for i in {1..10};do curl http://172.18.19.124 ;done (4)添加保持持久功能 #ipvsadm -A -t 172.18.19.124:80 -s rr -p 60 #ipvsadm -a -t 172.18.19.124:80 -r 172.18.19.122 -g -w 1 #ipvsadm -a -t 172.18.19.124:80 -r 172.18.19.123 -g -w 1 (5)测试 for i in {1..10};do curl http://172.18.19.124 ;done (6)60s后从新调度
port Affinity(多个端口的姻亲关系)
作用:将多个端口绑定在一起,并使用持久连接,来实现多个服务统一调度之效用. 结合FWM的功能,两个服务能够统一调度,有可以绑定同一个地址的请求始终在一个主机上,第一个服务绑定在rs1,第二个服务也一定在RS1上,让两个服务产生关联性. 这种将两个服务绑定在一起,并且统一调度,统一粘性的关系叫做端口的姻亲关系(port Affinity:),让两个端口建立姻亲关系,两个服务同进同退.持久连接配合FWM,就可以实现这个功能. 实验: (1)参考以上FWM的过程,将80和3306进行绑定 #iptables -t mangle -A PREROUTING -d 172.18.19.124 -p tcp -m multiport --dports 80,3306 -j MARK --set-mark 11 #iptables -t mangle -vnL (2)定义集群,使用-p定义保持连接功能 #ipvsadm -A -f 11 -s rr -p 300 #ipvsadm -a -f 11 -r 172.18.19.122 -g -w 1 #ipvsadm -a -f 11 -r 172.18.19.123 -g -w 2 (3)测试 #for i in {1..10};do curl http://172.18.19.124 ;done #for i in {1..10} ;do mysql -h172.18.19.124 -utest -ptestpass -e'show databases' ;done 不同的服务有相同的调度结果,而且有会话保持,300秒会再次调度 port Affinity分类: 单端口持久(PPC):每集群服务单独定义,并定义其持久性;即保持连接 在一段时间内,将来自同一ip地址请求的同一服务时,始终发往一个RS. 每防火墙标记持久:基于防火墙标记定义持久的集群服务,可实现将多个端口上的应用统一调用,即所谓的port Affinity: 每客户端持久;造一段时间内,基于0号端口定义集群服务,即将客户端对所有的应用的请求统统调度至后端主机,而且可使用持久连接进行绑定.不常用 #ipvsadm -C #ipvsadm -A -t 172.18.19.124:0 -s rr -p #ipvsadm -a -t 172.18.19.124:0 -r 172.18.19.122 -g -w 1 #ipvsadm -a -t 172.18.19.124:0 -r 172.18.19.123 -g -w 1 客户端访问: ssh root@172.18.19.124 使用ssh进行调度 可以使用其他服务进行连接,进行调度
考虑 (1)Director不可用,整个系统不可用;SpoF 解决方案:高可用 keepalived(专用) heartbeat/corosync (重量级) (2)某RS不可用时,Director依然会调度请求至此RS. 解决方案:对个RS的健康状态做检查,失败时禁用,成功时启用; 检测方式: 层次级别越低,精度越低,但效率越高 (1)网络层检测 ping (2)传输层检测 port检测 (3)应用层检测 请求资源方式检测
课外作业:vip于dip/rip不在同一网段的实验环境设计及配置 博客作业:lvs的详细应用,类型,调度方法,内初
原创文章,作者:wencx,如若转载,请注明出处:http://www.178linux.com/55299