LVS全称Linux Virtual Server,即Linux虚拟服务器。它是我国章文嵩博士的一个开源项目。在linux内核2.6中,已经成为了内核的一部分,在此之前的内核需要重新编译内核。
主要用于服务器的负载均衡,它工作在网络4层,开源实现高性能,搞可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置简单,且有多种负载均衡方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外扩展性非常好。
针对高伸缩、高可用网络服务的需求,我们给出了基于IP层和基于内容请求分发的负载平衡调度解决方法,并在linux内核中实现了这些方法,将一组服务器构成一个实现可伸缩的、高可用网络服务的虚拟服务器。
虚拟服务器的体系结构如上图所示,一组服务器通过高速的局域网或地理分布的广域网相互连接,在它们的前端有一个负载均衡调度器(Load Balancer)。负载均衡调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访问一台高性能、高可用的服务器一样。由于我们的负载调度技术是在linux内核中实现的,我们称之为linux虚拟服务器。
项目目标:使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,它具有很好的伸缩性、可靠性和可管理性。
目前,LVS项目已提供了一个实现可伸缩网络服务的Linux Virtual Server框架,如图所示。
IPVS:提供了含有三种IP负载均衡技术的IP虚拟服务器软件。
KTCPVS:基于内容请求分发的内核Layer-7交换机。
Cluster Management:集群管理软件。
可用利用LVS框架实现高可伸缩、高可用的Web、Cache、Mail和Media等网络服务;在此基础上,可以开发支持庞大用户数、高可伸缩的、高可用的电子商务应用。
网络分层
网络七层
OSI七层网络协议,主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data link)、物理层(Physical)。Nginx工作在7层网络模型下。
IP虚拟服务器软件IPVS
在调度的实现技术中,IP负载均衡技术是效率最高的。IPVS软件实现了三种IP负载均衡技术,它们大致原理如下:
Virtual Service via Direct Routing(VS/DR)
VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地提高集群的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连接在同一物理网段上。
Virtual Server via Network Address Translation(VS/NAT)
通过网络地址转换,调度器重写了请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
DR技术是把请求负载给RS1、RS2、RS3之后,直接响应客户端。改写的是MAC地址,响应报文直接响应客户端。
NAT技术是把响应给负载均衡服务器,负载均衡服务器重写源地址再相应给客户端。改写的是IP地址,响应报文响应负载均衡服务器,负载均衡服务器重写响应报文的源地址,再发给客户端。
Virtual Server via IP Tunneling(VS/TUN)
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。
IPVS调度算法
针对不同的网络服务需求和服务调度器配置,IPVS调度器实现了如下八种负载调度算法:
内核Layer-7交换机KTCPVS
在基于IP负载调度技术中,当一个TCP连接的初始化SYN报文到达时,调度器就选择一台服务器,将报文转发给它。此后通过查发报文的IP和TCP报文头地址,保证此连接的后继报文被转发到该服务器。这样,IPVS无法检查到请求的内容再选择服务器,这就要求后端服务器组提供相同的服务,不管请求被发送到哪一台服务器,返回结果都是一样的。但是,在有些应用中后端服务器功能不一,有的提供HTML文档,有的提供图片,有的提供CGI,这就需要基于内容的调度(Content-Based Schdeduling)。
由于用户空间TCP Gateway的开销太大,我们提出了在操作系统的内核中实现Layer-7交换方法,来避免用户空间与核心空间的切换和内存复制的开销。在linux操作系统的内核中,我们实现了Layer-7交换,称之为KTCPVS(Kernel TCP Virtual Server)。
虽然应用层交换处理复杂,它的伸缩性有限,但应用层交换带来以下好处:
LVS集群特点
功能
适用性
后端服务器可运行任何支持TCP/IP的操作系统,包括Linux,各种Unix,MAC/OS和Windows NT/2000等。负载调度器能够支持绝大多数的TCP和UDP协议。
性能
LVS服务器集群系统具有良好的伸缩性,可支持几百万个并发连接。配置100M网卡,采用VS/TUN或VS/DR调度技术,集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统吞吐量可接近10Gbits/s。
可靠性
已在很多大型、关键性的站点得到很好应用,很多调度器运行一年多,未作一次重启。
软件许可证
LVS集群软件按GPL许可证发行的自由软件。
LVS与Nginx对比
keepalived的作用是检测服务器的状态。如果有一台web服务器宕机,或工作出现故障,keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后keepalived自动将服务器加入到服务器集群中,这些工作全部自动完成。
特性
keepalived内部工作分为以下几个部分:
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
VRRP根据优先级来确定虚拟路由器中每台路由器的角色(Master路由器或Backup路由器)。VRRP优先级的取值范围为0到255(数值越大,优先级越高),可配置的范围是1到254,优先级0为系统保留给路由器放弃Master位置时使用,255则是系统保留给IP地址拥有者使用。优先级越高,则越有可能成为Master路由器。当两台优先级相同的路由器同时竞争Master时,比较接口IP地址大小。接口地址大者当选为Master。
keepalived主要有三个模块,core、check和vrrp
在网络层、数据链路层,运行着4个协议:
网络层场景
keepalived在网络层采用的最常见的工作方式是通过ICMP协议向服务器集群中的那个节点发送一个ICMP数据包(类似于ping实现的功能),如果某个节点没有返回响应数据包,那么认为此节点发生了故障,keepalived将报告次节点失效,并从服务器集群中剔除故障节点。
传输层场景
传输控制协议TCP可以提供可靠的数据传输服务、IP地址和端口代表TCP的一个连接端。要获得TCP服务,需要在发送机的一个端口上和接收机的一个端口上建立连接。
keepalived在传输层就是利用TCP协议的端口连接和扫描技术来判断集群点是否正常。比如,对于常见的web服务默认的80端口、SSH服务默认的22端口等,keepalived一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口发生异常,然后强制将此端口对应的节点从服务器集群组中移除。
应用层场景
用户可自定义keepalived的工作方式,keepalived将根据用户的设定检测各种程序或服务是否运行正常,如果keepalived的检测结果与用户设定不一致时,keepalived将把对应的服务从服务器中移除。
集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。
通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。
集群组成后,可以利用多个计算机和组合进行海量请求处理(负载均衡),从而获得很高的处理效率,也可以用多个计算机做备份(高可用),使得任何一个机器坏了整个系统还是能正常运行。集群在目前互联网公司是必备技术,极大提高了互联网业务的可能性和可缩放性。
HA,高可用性集群式通过系统的可靠性和可维护性来度量的。
工程上,通常用平均无故障时间(MTTF)来度量系统的可靠性,用平均维修时间(MTTR)来度量系统的可维护性。于是可用性被定义为:HA=MTTF/(MTTF+MTTR)*100%,即平均无故障时间/总时间,总时间=平均无故障时间+平均维修时间
宕机时间不超过6分钟
具体HA衡量标准:
99%一年宕机时间不超过4天
99.9%一年宕机时间不超过10小时
99.99%一年宕机时间不超过1小时
99.999%一年宕机时间不超过6分钟
高可用工作方式:
高可用的资源分类:
keepalived通过实现VRRP协议来实现地址漂移
主从高可用
双主高可用
keepalived在一个节点上启动后,会生成一个master主进程,这个主进程又会生成两个子进程,分别是:
VRRP双方节点都启动以后,要实现状态转换的,刚开始启动的时候,初始状态都是backup,而后向其它节点发送通告,以及自己的优先级信息,谁的优先级高,就转换为master,否则就是backup。
这时候服务就在状态为master的节点上启动,为用户提供服务,如果,该节点挂掉了,则转换为backup,优先级降低,另一个节点转换为master,优先级上升,服务就在此节点启动,VIP,VMAC都会被转移到这个节点上,为用户提供服务。
全称Content Delivery Network,即内容分发网络。
从上面查询结果可用看出img.alibaba.com.CNAME img.alibaba.com.danuoyi.tbcache.com.后面的CNAME是 由CDN服务提供支持。
本地Cache加速
提高了企业站点(尤其含有大量图片和静态页面站点)访问速度,并大大提高以上性质站点的稳定性
镜像服务
消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量
远程加速
远程访问用户根据DNS负载均衡技术智能自动选择Cache服务器,选择最快的Cache服务器,加快远程的访问速度
宽度优先
自动生成服务器的远程镜像cache服务器,远程用户访问时从cache服务器上读取数据,减少远程访问宽度、分担网络流量、减轻原站点web服务器负载等功能。
集群抗攻击
广泛的CDN节点加上节点之间的智能冗余机制
内容分发网络是一个经策略性部属的系统,包括以下3个要件:
分发服务系统:最基本的工作单元就是cache设备,cache(边缘cache)负责直接响应最终用户的访问请求,把缓存在本地的内容快速地提供给用户。同时cache还负责与源站点进行内容同步,把更新的内容以及本地没有的内容从源站点获取并保存在本地。
cache设备的数量、规模、总服务能力是衡量一个CDN系统服务能力的基本指标
负载均衡系统:主要功能是负责对所有发起服务请求的用户进行访问调度,确定提供给用户的最终实际访问地址。两级调度体系分为全局负载(GSLB)和本地负载均衡(SLB)。GSLB主要根据用户就近性原则,通过对每个服务节点进行”最优“判断,确定向用户提供服务的cache的物理位置。SLB主要负责节点内部的设备负责均衡。
运营管理系统:分为运营管理和网络管理子系统,负责处理业务层面的与外界系统交换所必须的收集、整理、交付工作,包含客户管理、产品管理、计费管理、统计分析等功能。
Domain Name System,DNS是一个分布式、分层次的主机名管理架构,通过配置DNS服务器地址,主机不需要知道对应的ip地址就能通过主机名的形式访问互联网。
DNS利用类似倒状树的目录结构将主机名的管理分配到不同层级的DNS服务器中,经过分层管理,每一级DNS服务器负载部分域名信息,这就减轻了DNS服务器的负载,同时也方便记录的更新同步。
DNS是一个网络服务,因此就有对应的端口,其端口号为53号。DNS查询的时候,是以udp这个较快速的数据传输协议来查询的,但万一没有方法查询到完整的信息时,就会再次以tcp这个协定来重新查询,DNS服务在启动的时候会同时开启tcp的53号端口和udp的53号端口。
DNS在进行区域传输的时候使用TCP协议,其他时候则使用UDP协议。
FQDN(Full Qualified Domain Name):完整主机名,是有主机名和域名构成。例如www.baidu.com当中,www就是web服务器的主机名,baidu.com就是域名,主机名和域名之间用实心号来表示。
DNS是基于C/S架构(多数基于套接字架构C/S架构),对于每一级域名长度的限制是63个字符,域名总长度则不超过253个字符。
DNS系统记录的信息非常多,不过重点就两个:一个是记录服务器所在的NS(name server)标志,另一个是记录主机名对应的A(address)标志。
DNS域名结构
倒状的树结构,在最顶层是一个根服务器,它主要负责顶级域名的管理。
一级域名共分三类,组织域、国家域和反响域,最多可以有127级域名。
每一级的域名服务器只负责对应下级的域的管理,其中根节点是分布在世界各地的13台服务器,其中10台位于美国地区,另外3台设置于英国、瑞典和日本。
DNS解析域名到IP要经过三个阶段:
DNS解析域名三阶段:
本地DNS缓存解析,向本地DNS请求Q1通常是hosts文件,如果查到返回A1,如果没查到,向本地服务器发Q2
本地DNS服务器解析,递归查询,本地服务器有,返回A2,没有向区域服务器访问Q3,查到返回A3,没有向区域服务器缓存查询Q4,如果没查到需要向各级域名服务器查询
根域名及各级域名服务器之间的解析,迭代解析,向13台跟服务器查Q5,根域名会向相应的顶级域名如com查找Q6,如果顶级服务器上有就响应根服务器A6,根服务器再响应给请求A5,告诉它顶级域,请求再发Q7去顶级域查询,顶级域查询相应二级域Q8A8,告诉你是二级还是三级,在哪台二级域名服务器上有A7,发请求到二级域名上查Q9,它会告诉你三级四级啊是哪个ISP具体管理的A5,然后去具体的ISP服务商查询A10,服务商管理大量IP域名列表,会告诉你结果,再一路返回去。
根域、顶级域、二级域都不负责存储具体的域名到IP的转换,只存储去哪个服务器
实现原理:在DNS服务器中为同一个主机名配置多个IP地址,多个IP地址以轮询的方式选择。
DNS服务器软件:bind9
OS:Ubuntu18.04
下载安装bind9
root@f036038f85fa:/# apt-get update
root@f036038f85fa:/# apt-get install bind9
修改本机名字服务器
root@f036038f85fa:/etc/bind# vim /etc/resolv.conf
resolv.conf配置DNS客户,它包含了主机的域名搜索顺序和DNS服务器的地址,每一行应包含一个关键字和一个或多个的由空格隔开的参数。
阿里云中的该文件示例
options timeout:2 attempts:3 rotate single-request-reopen
; generated by /usr/sbin/dhclient-script
nameserver 100.100.2.136
nameserver 100.100.2.138
阿里云自动分配的nameserver
nameserver 表明DNS服务器的IP地址。可以有很多行的nameserver,每一个带一个IP地址。在查询时就按nameserver在本文件中的顺序进行,且只有当第一个nameserver没有反应时才查询下面的nameserver。
domain 声明主机的域名。很多程序用到它,如邮件系统;当为没有域名的主机进行DNS查询时,也要用到。如果没有域名,主机名将被使用,
search 它的多个参数指明域名查询顺序。当要查询没有域名的主机,主机将在由search声明的域中分别查找。domain和search不能共存;如果同时存在,后面出现的将会被使用。
sortlist 允许将得到域名结果进行特定的排序。它的参数为网络/掩码对,允许任意的排列顺序。
查看本机ip
root@f036038f85fa:/etc/bind# ifconfig -a
eth0: flags=4163
inet 172.30.80.8 netmask 255.255.248.0 broadcast 172.30.87.255
ether 02:42:ac:1e:50:08 txqueuelen 0 (Ethernet)
RX packets 27566 bytes 47904091 (47.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 27586 bytes 2595068 (2.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
将nameserver改为本机的ip
options timeout:2 attempts:3 rotate single-request-reopen
; generated by /usr/sbin/dhclient-script
nameserver 172.30.80.8
nameserver 100.100.2.136
nameserver 100.100.2.138
修改 named.conf.local
root@f036038f85fa:/etc/bind# vim named.conf.local
//
// Do any local configuration here
//
// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";
zone "163.com" {
type master;
file "/etc/bind/db.163.com";
};
zone 定义一个区
其中type项的值:
master:表示定义的是主域名服务器
slave :表示定义的是辅助域名服务器
hint:表示是互联网中根域名服务器
资源文件/etc/bind/db.163.com
root@f036038f85fa:/etc/bind# vim named.conf.options
options {
directory "/var/cache/bind";
listen-on port 53 {127.0.0.0;172.30.80.8;};
allow-transfer {none;};
// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0‘s placeholder.
// forwarders {
// 0.0.0.0;
// };
//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
创建域文件
root@f036038f85fa:/etc/bind# vim /etc/bind/db.163.com
$TTL 604800
@ IN SOA 163.com root.localhost. (
1 ; Serial
604800 ; Refresh
1H ; Retry
1W ; Expire
3H ) ; Minimum
;
@ IN NS localhost.
163.com IN NS 172.30.80.8
yes IN A 172.30.80.8
yes IN A 172.30.80.9
yes IN A 172.30.80.10
重启bind9
service bind9 restart
dig
root@f036038f85fa:/etc/bind# dig yes.163.com
; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> yes.163.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35668
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: c53be5121e871df809c1ead65e55d979ee7ec5f45370708e (good)
;; QUESTION SECTION:
;yes.163.com. IN A
;; ANSWER SECTION:
yes.163.com. 604800 IN A 172.30.80.8
yes.163.com. 604800 IN A 172.30.80.9
yes.163.com. 604800 IN A 172.30.80.10
;; AUTHORITY SECTION:
163.com. 604800 IN NS localhost.
;; ADDITIONAL SECTION:
localhost. 604800 IN A 127.0.0.1
localhost. 604800 IN AAAA ::1
;; Query time: 0 msec
;; SERVER: 172.30.80.8#53(172.30.80.8)
;; WHEN: Wed Feb 26 02:35:37 UTC 2020
;; MSG SIZE rcvd: 183
另一台局域网的机器绑定该台主机作为DNS解析服务器
nameserver 172.30.80.8
如果ping yes.163.com的话,会发现不同次的ping,分别会对应172.30.80.8、172.30.80.9、172.30.10等设置好的ip。
DNS
对同一个请求的域名,映射为不同的服务器IP地址
HTTP重定向
HTTP代理(比如浏览器)向web服务器请求某一url后,web服务器根据http响应头信息的location标记来返回一个新的url,然后http代理继续请求访问这个新的url
反向代理负载均衡
反向代理指的是代理服务器来接收对web服务器的连接请求,然后转发给内部网络中不同的web服务器,并将web服务器请求得到的结果返回给请求连接的客户端,以nginx为代表。
NAT负载均衡
将公网地址映射为多个私网地址,解决IP地址紧张,不想让外网知道内网结构的问题
CDN
通过发布机制将内容同步到大量的缓存节点,并在DNS服务器上进行扩展,找到离用户最近的缓存节点作为服务提供点
混合型负载均衡
在有些大型网络,由于多个服务器群内硬件设备、各自的规模、提供的服务等差异,可以考虑给每个服务器集群采用最合适的负载均衡方式,然后又在多个器群间再一次负载均衡或群集起来以一个整体向外界提供服务(即把这多个服务器群当作一个新的服务器群),从而达到最佳性能