高可用负载均衡是什么

集群是什么

集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。

这些服务器之间可以彼此通信,协同向用户提供应用程序,系统资源和数据,并以单一系统的模式加以管理。

当用户请求集群系统时,集群给用户的感觉就是一个单一独立的服务器,而实际上用户请求的是一组集群服务器。


集群技术是一种通用的技术,其目的是为了解决单机运算能力的不足、IO能力的不足、提高服务的可靠性、获得规模可扩展能力,降低整体方案的运维成本(运行、升级、维护成本)。

只要在其他技术不能达到以上的目的,或者虽然能够达到以上的目的,但是成本过高的情况下,就可以考虑采用集群技术。

简单说就是

集群是一堆服务器在一起干活,提供如网站功能。

集群的优点

高性能

一些国家重要的计算密集型应用(如天气预报,核试验模拟等),需要计算机有很强的运算处理能力。以全世界现有的技术,即使是大型机,其计算能力也是有限的,很难单独完成此任务。

因为计算时间可能会相当长,也许几天,甚至几年或更久。

因此,对于这类复杂的计算业务,便使用了计算机集群技术,集中几十上百台,甚至成千上万台计算机进行计算。

假如你配一个LNMP环境,每次只需要服务10个并发请求,那么单台服务器一定会比多个服务器集群要快。

只有当并发或总请求数量超过单台服务器的承受能力时,服务器集群才会体现出优势。

价格有效性

通常一套系统集群架构,只需要几台或数十台服务器主机即可。与动辄价值上百万元的专用超级计算机相比便宜了很多。在达到同样性能需求的条件下,采用计算机集群架构比采用同等运算能力的大型计算机具有更高的性价比。

早期的淘宝,支付宝的数据库等核心系统就是使用上百万元的小型机服务器。

后因使用维护成本太高以及扩展设备费用成几何级数翻倍,甚至成为扩展瓶颈,人员维护也十分困难,最终使用PC服务器集群替换之,比如,把数据库系统从小机结合Oracle数据库迁移到MySQL开源数据库结合PC服务器上来。

不但成本下降了,扩展和维护也更容易了。

可伸缩性

当服务负载,压力增长时,针对集群系统进行较简单的扩展即可满足需求,且不会降低服务质量。

通常情况下,硬件设备若想扩展性能,不得不增加新的CPU和存储器设备,如果加不上去了,就不得不购买更高性能的服务器,就拿我们现在的服务器来讲,可以增加的设备总是有限的。

如果采用集群技术,则只需要将新的单个服务器加入现有集群架构中即可,从访问的客户角度来看,系统服务无论是连续性还是性能上都几乎没有变化,系统在不知不觉中完成了升级,加大了访问能力,轻松地实现了扩展。

集群系统中的节点数目可以增长到几千乃至上万个,其伸缩性远超过单台超级计算机。

高可用性

单一的计算机系统总会面临设备损毁的问题,如CPU,内存,主板,电源,硬盘等,只要一个部件坏掉,这个计算机系统就可能会宕机,无法正常提供服务。在集群系统中,尽管部分硬件和软件也还是会发生故障,但整个系统的服务可以是7*24小时可用的。

集群架构技术可以使得系统在若干硬件设备故障发生时仍可以继续工作,这样就将系统的停机时间减少到了最小。

集群系统在提高系统可靠性的同时,也大大减小了系统故障带来的业务损失,目前几乎100%的互联网网站都要求7*24小时提供服务。

透明性

多个独立计算机组成的松耦合集群系统构成一个虚拟服务器。

用户或客户端程序访问集群系统时,就像访问一台高性能,高可用的服务器一样,集群中一部分服务器的上线,下线不会中断整个系统服务,这对用户也是透明的。

可管理性

整个系统可能在物理上很大,但其实容易管理,就像管理一个单一映像系统一样。在理想状况下,软硬件模块的插入能做到即插即用。

可编程性

在集群系统上,容易开发及修改各类应用程序

负载均衡集群的作用

负载均衡集群为企业提供了更为实用,性价比更高的系统架构解决方案。

负载均衡集群可以把很多客户集中的访问请求负载压力尽可能平均地分摊在计算机集群中处理。客户访问请求负载通常包括应用程序处理负载和网络流量负载。

负载均衡集群运行时,一般是通过一个或多个前端负载均衡器将客户访问请求分发到后端的一组服务器上,从而达到整个系统的高性能和高可用性。一般高可用性集群和负载均衡集群会使用类似的技术,或同时具有高可用性与负载均衡的特点。

负载均衡集群的作用为:

分摊用户访问请求及数据流量(负载均衡)

保持业务连续性,即7*24小时服务(高可用性)。

应用于Web及数据库等服务器的业务

高可用性负载均衡集群

当集群中的一个节点系统发生故障时,运行着的集群服务会迅速作出反应,将该系统的服务分配到集群中其他正在工作的系统上运行。

考虑到计算机硬件和软件的容错性,高可用性集群的主要目的是使集群的整体服务尽可能可用。

如果高可用性集群中的主节点发生了故障,那么这段时间内将由备节点代替它。

备节点通常是主节点的镜像。当它代替主节点时,它可以完全接管主节点(包括IP地址及其他资源)提供服务,因此,使集群系统环境对于用户来说是一致的,即不会影响用户的访问。

高可用性集群使服务器系统的运行速度和响应速度会尽可能的快。他们经常利用在多台机器上运行的冗余节点和服务来相互跟踪。如果某个节点失败,它的替补者将在几秒钟或更短时间内接管它的职责。因此,对于用户而言,集群里的任意一台机器宕机,业务都不会受影响(理论情况下)。


当一台机器宕机时,另外一台机器接管宕机的机器的IP资源和服务资源,提供服务。

高可用性集群常用的开源软件包括Keepalived,Heartbeat等

正向代理

正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。

所以正向代理,是proxy-server 代理了 client,然后与web服务器交互。

通过正向代理访问目标服务器,目标服务器就无法知道真正的client到底是谁。
用途
通过代理服务器,突破client本身的ip访问限制,访问国外资源。
隐藏client真实信息,可以保护client服务器,隐藏自己的ip,免受攻击。

反向代理

反向代理(reverse proxy):是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
用途
隐藏服务端真实IP,保护远端服务器安全。
负载均衡,反向代理服务器可以根据用户请求决定转发给哪一个后端节点服务器。
提高访问速度,反向代理服务器可以缓存大多数静态资源,提高静态请求的解析速度。
提供安全保证,反向代理服务器可以作为应用防火墙,提供https访问认证,防止ddos攻击,用户访问行为分析等。

对比正向代理反向代理

正向代理其实是,代理客户端
帮助客户端访问一些受限的资源,如国外的资料,如企业内部的内网资料。
一般是客户端搭建,如安装某一个代理软件,填入代理服务器的ip、port
此时server无法得知client到底是谁,看到的只能是proxy的IP。


反向代理其实是代理服务端
帮助服务端做负载均衡,安全防护
一般是在服务端搭建,如部署nginx代理服务器。
此时client无法得知server到底是谁,以为自己访问的就是真实的server。

反向代理参数

proxy_set_header Host       $http_host; 
lb服务器将用户访问网站的hosts信息转发给后端节点

proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for ;
将用户真实的ip传递给后端的节点

proxy_connect_timeout 60s;
peoxy和server的连接超时,要求不超过75s;

proxy_send_timeout 60s;
proxy等待server回传数据的超时时间

proxy_read_timeout 60s;
proxy等待server响应的超时;

proxy_buffering on | off;
把server返回的数据先放入缓冲区,然后再返回给client,一边收数据,一边传递,而不是全部接收完再传递。

proxy_buffers  4 128k;
缓冲区的容量参数;

四层负载、七层负载区别

四层模型
四层是没有应用层协议的,基于ip:port找到目标的地址。

[root@lb-5 /etc/nginx]#cat /etc/nginx/nginx.conf 

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

# 四层基于stream{}这个模块即可,无须http协议相关的

stream {
    upstream mysql_pool {
		# 目标机器,后端的ip:port  以及负载均衡的参数
      server 172.16.1.51:3306  max_fails=3 fail_timeout=30s;
      server 172.16.1.52:3306  max_fails=3 fail_timeout=30s;
    }
	# 定义虚拟主机,nginx最基本的功能,就是虚拟主机,得接收请求
	# 访问这个nginx代理机器的3306端口,请求就进入如下
    server {
            listen 0.0.0.0:3306;
            proxy_pass mysql_pool;
    }


}

# 描述下请求转发过程

client 发出登录mysql请求
mysql -uroot -p -h10.0.0.5 -P3306
登录请求发给了代理服务器
↓
nginx四层代理服务器,请求轮询发给后端2个节点
↓ 
一次看到 51机器数据
一次看到52机器数据

对于四层的转发,使用mysql的测试,用了它的3306默认端口
比如 比如数据库的redis,6379,四层转发,用法和这个一样,就是端口不同。
四层负载均衡,会配置了,扣 3  不懂 4
七层负载均衡配置(http)
配置文件,如下的http协议的配置都应该在


/etc/nginx/nginx.conf
# 打标签
http {

	xxxxx;
    
    include /etc/nginx/conf.d/*.conf;
  

}

[root@lb-5 ~]#cat  /etc/nginx/conf.d/proxy.conf 
# 定义一组服务器 nginx反向代理,请求转发给一组服务器
# client是不知道,本次请求,到底是 7 给你返回的,还是8返回的
# client 数据都是 nginx这个代理,发给他的
# 因此实现了反向代理+负载均衡的效果
# 这里的nginx七层反向代理负载均衡,看懂扣 6,不懂7 


upstream  web-pools {
    server 172.16.1.7:8080;
    server 172.16.1.8:8080;
}

server {
    listen 80;
    # 当你访问 
    #   http://wordpress.yuchaoit.cn:80/
    #   协议 http://        域名wordpress.yuchaoit.cn 端口80  
    #  path网页资源路径 /
    
    #  这个http 的url协议规范,看懂扣 1 不懂 2
    # http://wordpress.yuchaoit.cn:80/
    server_name wordpress.yuchaoit.cn;
    	
    location / {
        proxy_pass http://web-pools;
        include /etc/nginx/proxy_params.conf;
    }
}

才能协同工作。


负载均衡策略

lb调度算法
调度算法一般分几类:

第一类是静态调度算法:负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点的健康情况。例如轮询、加权轮询、哈希类型调度算法。
第二类是动态调度算法,负载均衡器会判断后端节点的当前状态,来决定是否分发请求。例如链接数最少的优先分发,响应时间短的优先分发,如least_conn、fail等都是动态调度。
backup
被标记为backup参数的服务器,只有服务器池内的其他机器都无法访问了,才会使用该该机器。
max_failes
允许请求失败的次数,一般和fail_timeout结合用
fail_timeout
经过max_failes失败后服务暂停的时间。
max_conns
限制最大接收的连接数。
rr轮训
按照请求顺序逐一分配给不同的后端节点服务器,如果后端节点宕机,宕机的服务器会被自动从地址池中剔除,新的请求会发给正常的服务器
Weight(权重轮询)
给后端节点服务器增加权重,数值越大,优先获得客户端请求,可以以服务器配置来决定比例大小,从而解决新旧服务器的性能不均衡问题等。
ip_hash
每个请求按客户端IP的hash结果分配,当新的请求到达,将其客户端IP通过哈希算法得到一个唯一值,在随后的客户端请求中,如果客户端的IP哈希值相等,该请求就会固定发给一台服务器。

该调度算法可以解决动态网页中的session共享问题。

注意了使用ip_hash不得再使用weight、backup两个参数,造成冲突了,即使写了也不生效。
url_hash
根据访问url的hash结果分配,同一个url固定发给一个后端节点。
least_conn
该算法根据后端节点的链接数决定分配请求,哪个机器链接数少,就发给谁。
posted @ 2022-07-26 20:05  张开嘴  阅读(160)  评论(0编辑  收藏  举报