一、集群cluster
1、集群的产生
为什么需要集群呢?因为一台服务器性能不足,无法满足大量用户的并发访问需求,有两种解决思路。
-
向上扩展
-
向外扩展
所谓的向上扩展就是买更高性能的服务器,比如旧的服务器内存是32G,16核的CPU,我们可以将其替换成更好的服务器,64G的内存,32核的CPU,这就是向上扩展,也叫做纵向扩展。
所谓的向外扩展就是买更多的服务器,多台服务器共同为用户提供服务,这就是集群,买更多的服务器共同为用户提供服务就是向外扩展,也叫做横向扩展。
在实际的生产环境当中,由于成本问题,多使用向外扩展的方式,而且纵向扩展还容易遇到瓶颈,但也不能无限横向扩展,因为协调也消耗很多资源,比如并行比串行要慢!。一个和尚挑水和,两个和尚抬水喝,三个和尚没水喝。
2、集群的类型
集群是为了解决某个特定问题将多台计算机组合起来形成的单个系统。
集群分为三个类型:
- 负载均衡集群
- 高可用集群:keepalived,双机热备
- HPC高性能集群:分布式计算、分布式存储
很多人无法区分负载均衡和高可用,负载均衡并没有提高可用性,比如mysql的主从复制,主数据库负责响应用户的请求,从数据库并没有响应用户的请求,一旦主数据库挂了,从服务器并不能自动顶上,除非我们手工切换,这样没有提高其高可用性,我们可以将高可用性理解为一台主设备挂了,从设备能自动顶上,mysql的主从复制并不能实现这样的效果,但是mysql的主从复制可以将用户的请求合理负载分配,综上所述mysql的主从复制属于负载均衡集群,而不是属于高可用集群。
3、分布式系统
常见的分布式系统有两种:
- 分布式存储:比如云盘
- 分布式计算:ikuai软路由、hadoop
分布式存储的原理是什么呢?比如我们向百度网盘上传了一个了一个1G的视频,这个视频并不是存储在了一台服务器上,而是将其切割成小的数据块,比如每个数据块是16M大小,将这些数据块存储到不同的服务器上,每一个数据块除了存储在当前的服务器上还有产生一个副本存储其它的服务器,副本可以有多个,这样当一台服务器的存储坏了,也没关系,我们可以加一个新的,然后根据其它服务器上的副本推算出坏的这台服务器上的数据,这就是分布式存储。其实你看,这就工作模式就像是raid差不多,只不过是将磁盘替换成了主机。
4、集群和分布式的区别
分布式每个人完成的工作不一样,是把一个大任务拆解开了,每人完成一部分。
集群结构就是所有人所做的事情都是一样的,把这些人都集合起来就是集群,比如那么多的淘宝服务器,就只是为全球的用户提供买东西的服务,如下图:
后面的三台服务器可能提供的服务是一样的。
二、LVS1、为什么使用LVS?
上面我们介绍了集群的产生,集群产生的原因就是横向扩展,但这时面临一个问题?那么多的服务器同时提供服务器,那么用户在访问的时候到底访问的是哪一台服务器?如果所有的用户都访问的是一台服务器,那么集群不就白做了吗?如果用户的并发请求是平均分发的,谁来完成这个工作呢?又是如何完成负载的工作呢?
好了,接下来要出场就是负载均衡技术,负载均衡设备负责分发用户的请求。
负载均衡这个概念在IT领域里面非常的常见,有软件,比如nginx,LVS,还有专门的软硬一体设备,比如F5的负载均衡设备,那么它是如何完成分发用户的请求呢?
当F5收到大量的用户请求之后,根据用户定义好的负载算法,将用户的请求进行分配,算法分好多种,比如平均算法、加权算法等等吧,不一定是平均分配的,比如是可以根据服务器的忙碌程度、服务器的性能等等指标进行负载,F5是专门的负载均衡设备,在分发用户请求方面做的非常出色。唯一的缺点就是贵、贵 、贵 、贵!一台F5大概在几十万左右!而且你只买一台吗?不行呀!负载均衡设备非常的重要,服务器坏了之后F5会主动发现,就算不主动发现我们也可以手工向将某台服务器标识成down状态,这样F5就不会将用户请求分发到这个服务器上了,这样并不耽误用户的访问,但是,但是,如果F5坏了呢!!!!这就存在了单点故障,所以如果买F5的话,一般要买两台, 两台设备之间可以负载,也可以主从,这样的高端设备是自带高可用功能的,这样坏一台不耽误用户的访问。除非比较有钱的公司,一般公司是不愿意花个上百万买这玩意的,F5是软硬一体的,所以他很贵,其实有开源的负载均衡软件,我们可以通过将软件部署在普通服务器上, 这样也能实现负载均衡的效果,普通服务器的价格比F5是要便宜很多,但是普通的服务器本身并不带有高可用功能,怎么办呢?我们就要通过高可用技术来实现,搭配LVS的高可用技术就是keepalived,它们是天生一对,keepalive是如何实现的呢?其实也应该猜出来了,VRRP,VRRP就不说了,太熟悉了。
负载均衡软件有:LVS,nginx,haproxy,我们在这里面着重讲解一下LVS。
LVS是国人开发出来的,由于其非常的优秀,被红帽收录到内核当中,收集到内核当中意味着我们不用额外再安装软件。
LVS是全称是linux virtual server(linux 虚拟服务),它通常是这么部署的:
LVS服务器的外部接口通常是一个公网地址,在DNS做域名的IP指向时,指向的地址就是这个接口,而内部接口用到IP就可以是私网地址,如果非要用公网地址也没问题。
LVS的性能:
LVS是只能工作在四层,通过内核实现负载均衡 ,依托在内核当中的net-filter框架当中,不需要安装什么服务,不需要侦听套字的,因为net-filter的五个勾子函数本身就能分析报文,不受套接字文件的数量,不用扮演客户端,而nginx和haproxy都是应用层的程序,都是工作在七层的,也可以模拟实现四层的功能,注意只是模拟。
LVS实现负载均衡的方式很是简单,就是通过net-filter框架就修改报文内部的IP、端口、MAC来实现负载均衡。
haporxy和nginx最多能打开多少个套节字65535个,因为LINUX系统端口只有这么多,而且报文放置端口的字段也只有这么大,而lvs不受端口的限止,LVS不需要侦听套节字,无论多大的并发,只要设备的足够高,按理说LVS都能抗的住,LVS是负载均衡的大杀器-----性能非常高,性能可以达到硬件负载均衡的60%,用在小型站点就像是高射炮打蚊子,中大规模的公司才会用LVS这种级别的负载均衡,但也不会用LVS,因为虽然性能高,但还是受限于服务器硬件,那种大规模的公司负载均衡通常是硬件的,比如F5。
LVS的缺点:
功能较少,只支持四层协议,不支持正则处理, 无法基于cookie做绑定,无法甚至URL调度 、无法做动静分离。
lvs、nginx、haproxy的区别:
是否是软件?
lvs不是一个软件,而是内核的功能,通过牺牲高层功能实现高性能。
lvs和haproxy都是用户空间的软件
本质的不同?
lvs类似于路由器,其本质是转发,并不充当客户端,对报文的源IP并不做任何改动。
nginx和haproxy在负载均衡的时候会充当客户端,也就是会改动源IP地址。
性能的不同?
LVS是三者性能之最强
nginx和haproxy差不多
2、LVS术语
VS:指的就是LVS服务器,LVS服务器又叫做调度器,其实调度器这个称呼更显得贴切,此外它还有几个名字,virtual server、director server(DS)、dispatcher(调度器)、load,balancer(负载均衡器)。
RS:指的就是真实的服务器,real server、upstram server(上游服务器nginx的叫法)、backend server(后端服务器haproxy的叫法)
CIP:client ip
VIP:VS的外网口IP
DIP:VS的内网接口IP
RIP:real server ip
访问流程:
CIP-----VIP-----DIP----RIP
3、LVS架构
LVS的架构与iptables的架构有些相似。
iptalbe其实是一个规则的编辑工具,用来管理规则的,真正工作的是其实是内核当中net-filter框架当中的五个勾子函数。
LVS也有自己的规则编辑工具,叫ipvsadm,用于管理集群服务和真实服务器,相当于iptalbes命令。然后真正工作的是其实是ipvs,ipvs是工作于内核空间netfilter的INPUT钩子上的框架。
想一下,为什么要放置在INPUT勾子函数那里呢?
我们知道只有目标IP是本服务器的连接才会经过INPUT函数,而用户访问的时候访问的目的IP就是VIP,按理说这个连接会经过INPUT勾子函数,但是LVS服务器并不提供任何服务呀!它是负责分发用户请求,所以我们将LVS框架放到INPUT链的前面,pre-routing后面,目的为了强行改变数据的流向,将原本流经INPUT链的数据改向POST-ROUTING链上,如下图所示:
4、LVS集群的类型
LVS类似其于工作的协议划分的话分为以下两种:
传输层,传输层改变的就是端口,LVS、nginx、haproxy都支持
应用层,只针对特定的协议,http(nginx、httpd、haproxy)、fastcgi(nginx,httpd)、mysql(mysql-proxy)
LVS集群类型分为四种,其实使用最广泛的就LVS-DR类型,其次是LVS-NAT类型,这两种是最常用同的类型,余下的两种我们知道即可。
- LVS-NAT:修改请求报文的目标IP,多目标IP的DNAT。
- LVS-DR:操纵封装新的MAC地址
- LVS-TUN:在原请求IP报文这外新加一个IP首部
- LVS-FULLNAT:修改请求报文的源和目标IP
我们先来讲LVS-NAT:
实际上就是利用了目标NAT转换技术来实现的,将客户端报文的目的IP转换成RS服务器的IP,我们来举一个例子吧!
5、关于会话保持
LVS可以实现连接分发,但是这里面有一个问题。一个用户访问网站时登录了,LVS将其连接分发到RS1服务器上,然后用户刷新了一下浏览器,你说LVS会不会让其连接还是分发到RS1上的呢?如果没有将其分发到RS1的话,那么用户又要重新登录了!用户烦死了!!我们平时通过浏览器访问腾讯视频的时候,登录状态是一直保持着的,它是怎么实现的呢?
第一种办法:同一个用户调度到固定的服务器。
我们可以在LVS上这样设置,将源IP相同的客户端连接定向到同一台真实服务器,可以,这个方法没有问题。
真的没有问题呢?不见得,假如说客户端那边用的是NAT呢?那么多用户的是就是一个源IP,全部定向到RS1服务器上的话,RS1服务器也受不了呀!所以这个方法是不靠谱的,那么应该怎么做才好呢?用cookie,没错,cookie是唯一的,根据cookie进行区分才是真正的好办法!
第二种办法:所有的RS共享所有的会话
怎么共享呢?通过文件服务,如果会话特别多的话,就会占用很多的磁盘空间和带宽了
第三种办法:专门的会话服务器,将所有的会话都保存到一台专门的会话服务器上。
这个专门的会话服务器,比如memcached、redis,这样的会话服务器就很重要了,为了防止单点故障,最好还是要有备份。
关于识别用户身份:
我们需要识别用户身份,比如用户之前浏览了哪些商品。那么如何识别用户的用户的身份呢?
可以通过cookie,服务器给用户一个标识,用户缓存到浏览器。
胖cookie,胖cookie有很大风险,胖cookie里面不仅记录了用户的身份还记录了用户曾经看过哪些内容,容易被360拿走。所以现在cookie仅用作识别用户的身份,至于用户曾经浏览过哪些商品,在服务器本地进行存储,cookie----关联到一个记录,这个记录就叫做会话。
会话会存到哪时呢?存到某一台主机肯定不合适。
三种方法:
LVS可以做到一个用户就绑定某一台服务器,比如IP地址(不精准)、cookie(精准)来判定,缺点是用户正好对应的服务器挂了呢?用户的请求就进不来了。
第二种方法:会话集群,共享会话,客户端到哪台服务都行,缺点是占用的空间太大了,不适合大规模的网站。
第三种方式:用共享存储。
1、最早是基于DNS的负载均衡
DNS的负载均衡其实就是一个域名对应多个IP地址,不同的用户访问同一个域名会返回不同的IP地址,最早的DNS负载均衡就是这么实现的,是静态负载均衡的一种。
优点:我们不用搭建DNS服务器,租用就好了。
缺点:更新速度慢,不能立刻生效;服务器的性能DNS无法得知,无法根据服务器的性能来设置权重。
2、反向代理负载均衡
普通的代理是客户使用代理访问多个WEB服务器, 而这种代理是多个客户使用它访问内部 WEB服务器,因此也被称为反向代理模式。
优点:极大的提高静态界面的访问速度;由于外部服务器不会直接访问到服务器,因此比较安全。
缺点:针对每一次代理,代理服务器必须打开对外和对内两个连接,当连接请求大到一定程度,反向代理服务器容易成为服务瓶颈。
3、基于NAT的负载均衡技术
可用软件和可用硬件实现
最常用的软件是LVS
最常用的硬件就是F5,能够实现负载均衡的硬件又被称为四层交换机,由于其硬件是特殊定制的,因此效率非常好。
LVS不多做介绍了,这一节介绍的LVS就是典型的NAT负载均衡。
优先:灵活方便,功能全面强大
缺点:由于进出数据都要通过负载均衡设备,因此负载均衡器容易成为性能瓶颈。
4、扩展的负载均衡技术
针对NAT负载均衡的缺点,又出现了扩展的负载均衡技术。
目前LVS也支持扩展的负载均衡,其实就是DR模式,来回的路径不一致,减轻负载均衡设备压力。
四、服务器容错技术服务器容错技术是指在服务器硬件或软件出现故障时,仍能完成处理和运算,不降低系统性能,即用冗余的资源使计算机具有容忍故障的能力,可以通过硬件或软件的方式来实现。
服务器软件容错多采用多处理器或者特别设计的具有容错的操作系统来实现,这样的方法主要提供以检查点为恢复基础的恢复机能。具体的实现方法是,是每个运行中的进程都在另一个处理机上具有完全相同,但是不活动的后备进程,当运行中的进程发生了不能恢复的错误时,操作系统将发现这一错误并启用后备进程替换,后备进程从最后一个检查点开始恢复计算。
硬件容错系统应该那就双CPU、内存、通信子系统、磁盘、电源等,确保坏了一个,另一个能自动顶上;而且具有自动故障检测部件、故障隔离部件。
目前服务器的容错技术有三种:集群、双机热备、单机容错
集群不做介绍了,主要看一下双机热备和单机容错是怎么回事?
系统层面之上的东西,包括系统和软件是安装在两台或者两上以上的服务器上,数据放置在独立的磁盘阵列上,两台服务器通过vrrp相互监测,一台坏了,另一台自动顶上。
集群需要多台服务器,双机热备需要两台一模一样的设备,而且故障切换都要有一定的时间,都有局限性,所以又有了单机容错。
单机容错是真正的硬件冗余,关键部分都是两个,一个部件出了问题,另一个部件能够立马顶上,速度非常之快,这才是真正意义上的容错,缺点就是成本较高。
双机热备技术与单机容错技术在适用环境上的不同主要是两者能够实现的可用性的差异决定的,一般,双机热备可以实现99.9%的可用性,而容错服务器可以实现高达99.999%的可用性。因此,从可用性数据来看,双机热备技术大多适用于对于业务连续性要求不是很严格的环境中,如政府,教育以及个别的制造企业中,这些行业对业务的连续性不是那么高。而对于证券、银行对业务的连续性要求非常之高,常采用单机冗余的方式。