标签:lvs 集群
集群介绍
集群是一种并行或分布式系统,该系统包括一个互连的整体计算机集合作为一种单一,统一的计算机资源使用。
集群,是指一组互相独立的计算机,利用高速通信网络组成的一个计算机系统,其中的每个节点都是运行自己进程的独立服务器。这些进程可以彼此通信,对网络客户机来说就形成了单一系统,协同起来向用户提供应用程序,系统资源和数据,并以单一系统的模式加以管理。
高性能、低成本、高可扩展性、高可靠性
负载均衡集群(Load balancing clusters)
以提高应用系统的响应能力,尽可能处理更多的访问请求,减少延迟为目标
高可用性集群(High Availablity clusters)
以提高应用系统的可靠性,尽可能减少中断时间为目标,确保服务的连续性
高性能计算集群(High-performance clusters)
网络计算(grid computing)
1. 互联网企业常用的集群软件有:lvs,keepalived,haproxy,nginx,apache,heartbeat
互联网企业常用的集群硬件有:F5,Netscaler,Radware
2. 企业运维中集群软硬件选择:
1) 业务重要但是技术薄弱,可以出钱买服务的选择硬件负载均衡设备,多为传统的大型非互联网企业,如银行、证券、金融、汽车公司、制造业公司
2) 对于门户网站来说,软硬件都用,如淘宝、新浪,融资企业会选择硬件集群,如58、赶集
3) 中小型互联网企业选择开源软件,雇佣专门人员维护,如51cto、chinaunix.com
LVS是Linux Virtul Server的简写,意为linux虚拟服务器,是一个虚拟的服务器集群系统,可以在unix/linux平台下实现负载均衡集群功能
IPVS(LVS)发展史:
早在2.2内核的时候ipvs就以系统内核补丁的方式出现
从2.2.23开始ipvs就合并到linux内核的常用版本的内核补丁中了
从2.2.24开始ipvs成为linux官方标准内核的一部分。
ipvs工作在kernel当中,所以平时我们无法直接管理,需要用专门的工具ipvsadm,ipvsadm工作在应用程序层,属于最外层
从上图中我们可以看出lvs是在linux内核中实现的,因此被称为linux虚拟服务器,我们使用该软件的时候不能够直接配置内核中的ipvs,而需要使用专门的管理工具ipvsadm或keepalived。
注意:keepalived是管理lvs的工具而且是直接管理lvs并不通过ipvsadm,
负载调度器(load balancer)
服务器地址池(Server pool)
共享存储(shared storage)
名称 | 缩写 | 说明 |
虚拟IP地址(virtual ip address) | VIP | VIP为Director用于向客户端计算机提供服务的IP地址 |
真实IP地址(Real Server IP address) | RIP | 在集群下面节点使用的ip地址 |
Director的IP地址(Director Ip address) | DIP | DIrector 用于连接内外网的IP地址 |
客户端主机IP地址(Client ip Address) | CIP | 客户端的ip地址 |
地址转换(NAT模式)
通过网络地址转换,负载调度器会重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器,真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。调度器需要处理客户端的请求报文和服务器的回应报文
这个过程涉及到地址转换,有两个名词:
DNAT:用户请求的报文,lvs会修改它的目标IP地址
SNAT:真实服务器返回的回应包,lvs会修改它的源IP地址
nat模式最大的问题在于网卡的吞吐量,
NAT模式的特点:
1请求和回应的报文都必须经过LB的重写,然后进行转发
2在LB上配置外网IP地址和内网IP地址,内网IP地址用于和真实服务器通信,
3将DIP设为真实服务器的网关,这样返回报文才会经过LB
4由于接受和返回的报文都经过LB,因此LB的压力会比较大,有可能出现瓶颈
5支持对ip地址和端口的转换
6所有的内部节点只需要配置内网ip地址
注意:在这个过程中LB会记录一个hash表,如果没有hash表的话,一切都乱了
记住两个名词:DNAT、SNAT
IP隧道(TUN模式)
负载调度器把请求报文通过IP隧道(相当于ipip或ipsec)转发至真实服务器,而真实服务器将回应报文直接返回给客户。调度器只处理客户端的请求包报文
工作流程:
1、他的连接调度和管理与NAT一样,只是报文的转发方法不同。
2、LB根据各个RS的负载情况或者连接数的多少,动态的选择RS
3、将原请求报文封装到另一个报文中(这个事直接封装而不是修改源ip或者目的ip),再将封装后的报文发给RS
4、RS解封报文,获得原来目标地址为vip的报文
5、RS发现vip地址被配置在本地的ip隧道设备上,所以就处理这个请求了
6、然后,根据路由表将响应报文发给客户
直接路由(DR模式)
通过改写请求报文的MAC地址,将请求发送给真实服务器,而真实服务器将回应报文直接返回给客户端。调度器只处理客户端的请求包报文,类似TUN模式,但是没有ip隧道的开销,对集群中的真实服务器也没必要支持IP隧道协议
工作流程:
1、报文转发方法和NAT、TUN不同,DR将报文直接路由给RS,
2、根据各个RS的负载情况、连接数多少,动态选择RS
3、不修改目的ip和目的端口,也不封装ip报文,而是将请求的数据帧的MAC地址修改为RS的MAC地址。
4、然后将修改后的数据帧在局域网上发送,
5、因为请求的数据帧的MAC地址是选中的RS的MAC地址,所以RS肯定可以收到该数据帧。
6、从中可以获得该请求的ip报文,
7、当RS发现报文的目标地址是在本地的网络设备上,RS处理这个报文。
8、然后RS根据路由表将处理结果直接发给客户
DR特点:
1、DR修改的报文的目的MAC地址,不是封装MAC地址,源地址目标地址不变
2、处理结果由RS直接发送给客户,因此可以提高集群性能
3、DR通过改写MAC地址实现转发,因此所有RS和LB必须在同一个LAN网内
4、需要注意RS节点的VIP绑定和ARP抑制问题
5、RS节点的默认网关不是DIP,而是出口路由的ip,因为每个RS都配置公网ip
只要能出外网就可以,不一定非得配置外网ip,这点和TUN一样
6、DR只改写目的MAC地址,因此,不能实现端口的改写
7、DR模式下的LB只能是linux或unix,不能使windows,但是RS可以是windows
8、总体讲,DR模式效率高,但配置复杂,访问量不是很大的情况下可以用haproxy或nginx替代
9、直接对外的业务,如web服务,最好使用公网,而对内的服务,如MySQL存储服务,最好使用内网
补充:最近淘宝开源了一个方法叫FULLNAT,传统的NAT只是将目标IP地址进程装换,而fullnat是将目标地址和源地址都进行转换
调度算法决定了如何在这些集群节点之间分布工作负荷
固定调度算法:rr wrr dh sh
动态调度算法:wlc lc lblclblcr SED NQ(后两种官方站点没提到)
算法 | 说明 |
rr | 轮询调度(Round Robin),调度器通过“轮询”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。 |
wrr | 加权轮询(Weighted Round Robin),调度器通过“加权轮询”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。 |
dh | 目的地址哈希调度(destination hashing),以目的地址为关键字查找一个静态hash表来获得需要的RS |
sh | 源地址哈希调度(source hashing)以源地址为关键字查找一个静态hash表来获得需要的RS |
wlc | 加权最少链接数调度(Weighted Least Connections)把权重和连接数比值最小的 RS 作为下一个RS |
lc | 最少链接数调度(Least Connections)IPVS表存储了所有活动的连接,把新的连接请求发送到当前连接数最少的RS上 |
lblc | 基于地址的最小连接数调度(Locality-Based Least Connections) 将来自同一目的地址的请求分配给同一台RS,如果这台服务器尚未慢负荷,否则分配给连接数最小的RS,并以他为下次分配的首先考虑 |
lblcr | 基于地址带重复最小连接数调度(Locality-Based Least Connections with Replication) 对于某一目的地址,对应有一个RS子集,对此地址请求,为他分配自己中连接数最小的RS,如果子集中所有服务器均已满负荷,则从集群中选择一个连接数最小的服务器,将他加入到此子集并分配连接,若一定之间内未做任何修改,则将子集中负载最大的节点从子集中删除 |
SED | 最短的期望的延迟(Shortest Expected Delay Scheduling SED)基于wlc算法。这个必须举例来说了 ABC三台机器分别权重123 ,连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进行这样一个运算 A:(1+1)/1 B:(1+2)/2 C:(1+3)/3 根据运算结果,把连接交给C |
NQ | 最少队列调度(Never Queue Scheduling NQ) 无需队列。如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算 |
3). 调度算法的生产环境选型:
a) 一般的网络服务,如http、mail、mysql等,常用的调度算法是:rr、wrr、wlc
b) LBLC(基于局部性的最少连接)和LBLCR(带复制的结余局部性最少连接)主要用于缓存服务,如web cache、db cache
c) sh、dh可以结合使用在防火墙集群中,他们可以保证整个系统的唯一出入口
d) 最短预期延时调度SED和不排队调度NQ主要是针对处理时间较长的网络服务
实际工作中要根据实际需求选。
1、vip一般配置在lo上,掩码255.255.255.255
2、RS最好有一个外网ip和一个内网ip,外网ip用户给客户发送响应报文,内网ip用户连接数据库、nfs等设备
3、理论上只要RS能出网就可以,不用非得配置外网ip。流量小的话也可以使用nat
4、TUN模式下LB只处理请求报文,因此处理效率可以大幅度提高,但是LB需要封装请求报文,所以会消耗一定的系统资源,TUN适合WAN/LAN
5、TUN模式在LAN环境下的转发不如DR效率高,有的系统还要考虑是否支持ip隧道
6、RS还有绑定vip,配置复杂
7、LAN环境大多采用DR模式,WAN环境可以采用TUN模式,但是WAN环境下更多的采用DNS+haproxy/nginx等代理取代,因此,TUN模式用的很少
8、直接对外的业务,如web服务,最好使用公网,而对内的服务,如MySQL存储服务,最好使用内网
为什么LB和RS必须在同一个局域网内?
因为DR模式是基于Mac地址的,所以必须在同一网段内需要在RS上绑定VIP
问题:如果有多个LB,那么RS上怎么绑定VIP呢?
如果有多个VIP,我们在RS上可以使用lo1、lo2的方式绑定VIP
目前使用最广泛的,RS会直接将处理结果返回给用户,而不经过lvs
降低了lvs压力
即使vip绑定到lo网卡口上也要设置抑制ARP回应。lo绑定vip时子网掩码设为32位的,
特别提示:DR模式是互联网使用最多的模式
附:淘宝开源方法
背景:
lvs当前采用的主要是DR和NAT模式,但这两种模式都要求RS和LB在同一个局域网中,导致部署成本过高,TUN模式虽然可以跨VLAN但是RS上需要部署ip隧道模块,还要联通外网,比较复杂,不易维护
FULLNAT模式:
报文进站时,除了做DNAT外还做SNAT(将用户的ip地址改为LB内网IP地址,)从而实现RS和LB之间可以跨VLAN通讯,RS只需要连接内网即可
FULLNAT工作模式:
1、进站时目标ip改为RIP,源地址改为LOCAL IP
2,出站时目标ip改为CIP,源地址改为VIP
性能上和传统的nat比,转发量下架10%。
FULLNAT的重点是session的管理,
出站的时候可以交给多个LB进行处理,因此各个LB的压力不会很大,但是这中间要解决session的共享的问题
思路:
1、每个session维护9元组,caddr、vaddr、laddr、daddr、增加了localaddress
2、逻辑上采用两个session表
创建in_idx和out_idx(struct ip_vs_conn_idx)结构体变量,2个index指向同一个session
1、out to in:in_dex结构体变量,hash key为caddr/vaddr
2、in to out:out_idx机构提变量,hash key 为daddr/laddr
本文出自 “Study-Everyday” 博客,请务必保留此出处http://studys.blog.51cto.com/9736817/1655919
标签:lvs 集群
原文地址:http://studys.blog.51cto.com/9736817/1655919