架设高可用 Web 服务器集群方案有哪些

架设高可用 Web 服务器集群方案有哪些,第1张

1前端放负载均衡 如 狼大人 所说的LVS可, 使用 F5 相关的硬件设备亦可需要注意: 是否需要session 如果用户被打到了与上次访问时不同的物理机上, 会不会受影响 如何让同一个用户的访问打到同一台物理机上还有一种方式是使用反向代理, 使用 Apache, Ngnix 等都可以实现2充分利用DNSDNS 是一份天然的负载均衡方案, A记录可以写多个 例如在北京和上海各有一组机器, 北京前端使用了LVS, 上海亦是, 则可以把北京/上海的LVS同时写到DNS中;3是否需要考虑机房容灾简单的, 可以将狭义的集群, 在多个机房各部署一套, 形成大集群4集群了, 在程序设计中需要注意的地方程序部署在多台物理机上, 需要注意在多台物理机器上的并发, 及信息的同步

一、主从服务器

1、两台服务器。主服务器Master复制数据的更新、插入、删除等 *** 作; 从服务器Slave负责查询(读写分离,减缓服务器压力)

2、主服务器更新数据的同时更新从服务器的数据(数据备份)

3、当主服务器出现文件时,可用从服务器代替主服务器,保证网站的正常运行,同时检测主服务器存在的问题。注意:从服务器仍然只有查询功能,如银行系统更新时只能查询余额,不能存取款。(服务器可用性)

4、当把从服务器真正设置为主服务器时(即主从服务器设置调换),拥有更新数据的功能。

5、MyISAM不支持事务,但查询性能比InnoDB强;InnoDB支持事务,更新 *** 作性能比MyISAM强。因此,主服务器可以设置成MyISAM存储引擎,从服务器可以设置成InnoDB存储引擎(灵活设置存储引擎)

二、负载均衡

1、多台服务器。一个域名映射到多台服务器IP。

2、用户发出请求,提交到负载均衡服务器,由负载均衡服务器发送请求到不同的服务器。

3、负载均衡服务器选取服务器方法(负载均衡算法):

1、轮询:每台服务器轮换

2、加权轮询:为了应对某些服务器性能好,可以让他们的权重高一点,被选中的几率大一些。

3、最少连接:哪台服务器处理的连接少,就发给哪台服务器。

4、随机

4、存在的问题:客户端存在缓存,如果服务器出现故障,客户端报错。

5、分类:DNS负载均衡、>Nginx是一个免费的,开源的,高性能的服务器和反向代理服务器软件,同时它也可以为IMAP和POP3服务器代理,以其高性能,稳定性,丰富的功能,结构简单,低资源消耗的特性换来广大运维者所喜爱。
Nginx与传统的服务器不同,不依赖线程来处理请求。相反,它使用一个更可扩展事件驱动架构(异步)。这种结构资源消耗较小,但更重要的是,可以承受较大的请求负荷。即使你不希望处理成千上万的请求,你仍然可以受益于Nginx的高性能和小的内存占用,以及其丰富的功能。

Nginx的反向代理:
反向代理指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接到客户端,此时代理服务器对外就表现为一个服务器,而此种工作模式类似于LVS-NET模型。
反向代理也可以理解为web服务器加速,它是一种通过在繁忙的web服务器和外部网络之间增加的 一个高速web缓冲服务器,用来降低实际的web服务器的负载的一种技术。反向代理是针对web服务器提高加速功能,所有外部网络要访问服务器时的所有请求都要通过它,这样反向代理服务器负责接收客户端的请求,然后到源服务器上获取内容,把内容返回给用户,并把内容保存在本地,以便日后再收到同样的信息请求时,它会将本地缓存里的内容直接发给用户,已减少后端web服务器的压力,提高响应速度。因此Nginx还具有缓存功能。

反向代理的工作流程:
1)用户通过域名发出访问请求,该域名被解析为反向代理服务器的IP地址;
2)反向代理服务器接收用户的请求;
3)反向代理服务器在本地缓存查找是否存在当前用户所请求的内容,找到则直接把内容返回给用户;
4)如果本地没有用户请求的内容,反向代理服务器会以自己的身份去后端服务器请求同样的信息内容,并把信息内容发给用户,如果信息内容是可以被缓存的,则会将该内容缓存在代理服务器的本地缓存中。

反向代理的好处:
1)解决了网站服务器对外可见的问题,提高了网站服务器的安全性;
2)节约了有限的IP地址资源,后端服务器均可使用私有IP地址与代理服务器进行通信;
3)加速了网站的访问速度,减轻了真是web服务器的负荷。
(一)、调度算法
Nginx的upstream指令用于指定proxy_pass和fastcgi_pass所使用的后端服务器,即nginx的反向代理功能,因此可以将两者结合起来使用以达到负载均衡的目的,而Nginx也支持多种调度算法:
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,则会跳过该服务器分配至下一个监控的服务器。并且它无需记录当前所有连接的状态,所以它是一种无状态调度。
2、weight
指定在轮询的基础上加上权重,weight和访问比率成正比,即用于表明后端服务器的性能好坏,若后端服务器性能较好则可将大部分请求分配给它,已实现其力所能及。
例如:
我后端服务器17223136148配置:E55202 CPU,8G内存
后端服务器17223136148配置:Xeon(TM)280GHz 2,4G内存
我希望在有30个请求到达前端时,其中20个请求交给17223136148处理,剩余10个请求交给17223136149处理,就可做如下配置
upstream web_poll {
server 17223136148 weight=10;
server 17223136149 weight=5;
}
3、ip_hash
每个请求按访问ip的hash结果分配,当新的请求到达时,先将其客户端IP通过哈希算法进行哈希出一个值,在随后的请求客户端IP的哈希值只要相同,就会被分配至同一个后端服务器,该调度算法可以解决session的问题,但有时会导致分配不均即无法保证负载均衡。
例如:
upstream web_pool {
ip_hash;
server 17223136148:80;
server 17223136149:80;
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream web_pool {
server 17223136148;
server 17223136149;
fair;
}
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
upstream web_pool {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

每个设备的状态设置为:
1down 表示当前的server不参与负载,用于ip_hash中
2weight 默认为1weight越大,负载的权重就越大。
3max_fails 允许请求失败的次数默认为1设为0则表示关闭该项功能,当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4fail_timeout 在max_fails定义的失败次数后,暂停的时间。
5backup 可以将其理解为备机,其它所有的非backup机器down或者忙的时候,才会将请求分配给backup机器。所以这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

(二)、指令的使用
1、upstream
声明一组可以被proxy_pass和fastcgi_pass引用的服务器;这些服务器可以使用不同的端口,并且也可以使用Unix Socket;也可以为服务器指定不同的权重。如:
upstream web_pool {
server coolinuz9966org weight=5;
server 17223136148:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
2、server
语法:server name [parameters]
其中的name可以是FQDN,主机地址,端口或unix套接字;如果FQDN解析的结果为多个地址,则每个地址都会被用到。
3、proxy_pass
语法:proxy_pass URL;
该指令用于指定代理服务器的地址和URL将被映射为的URL或地址和端口。即用来指定后端服务器的地址或URL[端口]。
4、proxy_set_header
语法:proxy_set_header header value;
该指令允许重新定义和添加一些将被转移到被代理服务器的请求头部信息。
例如:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
注意:$proxy_add_x_forwarded_for包含客户端请求头中的"X-Forwarded-For",与$remote_addr用逗号分开,如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for等于$remote_addr

顺便补上Nginx的内置变量:
$args, 请求中的参数;
$is_args, 如果已经设置$args,则该变量的值为“?”,否则为“”。
$content_length, >1正向代理:
正向代理,"它代理的是客户端",是一个位于客户端和原始服务器(Origin Server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器)。
然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
11正向代理用途:
访问原来无法访问的资源,如 Google。
可以做缓存,加速访问资源。
对客户端访问授权,上网进行认证。
代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息。
2反向代理:
反向代理它代理的是服务端",主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
21反向代理用途:
保证内网的安全,通常将反向代理作为公网访问地址,Web 服务器是内网。
负载均衡,通过反向代理服务器来优化网站的负载。

1、集群是什么?
① 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。
② 集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。
③ 集群组成后,可以利用多个计算机和组合进行海量请求处理( 负载均衡 ),从而获得很高的处理效率,也可以用多个计算机做备份(高可用),使得任何一个机器坏了整个系统还是能正常运行。集群在目前互联网公司是必备的技术,极大提高互联网业务的可用性和可缩放性。
2、负载均衡集群技术
① 负载均衡(Load Balance):负载均衡集群为企业需求提供了可解决容量问题的有效方案。负载均衡集群使负载可以在计算机集群中尽可能平均地分摊处理。
② 负载通常包括应用程序处理负载和网络流量负载。这样的系统非常适合向使用同一组应用程序的大量用户提供服务。每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。对于网络流量负载,当网络服务程序接受了高入网流量,以致无法迅速处理,这时,网络流量就会发送给在其它节点上运行的网络服务程序。也可根据服务器的承载能力,进行服务请求的分发,从而使用户的请求得到更快速的处理。
3、负载均衡集群技术的实现
负载均衡(Load Balance)
负载均衡技术类型:基于 4 层负载均衡技术和基于 7 层负载均衡技术
负载均衡实现方式:硬件负载均衡设备或者软件负载均衡
硬件负载均衡产品: F5 BIG-IP 、Citrix Netscaler  、深信服 、Array 、Radware
软件负载均衡产品: LVS (Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server)
4、实现效果如图

5、负载均衡分类
负载均衡根据所采用的设备对象( 软/硬件负载均衡 ),应用的OSI网络层次( 网络层次上的负载均衡 ),及应用的地理结构( 本地/全局负载均衡 )等来分类。本文着重介绍的是根据应用的 OSI 网络层次来分类的两个负载均衡类型。
我们先来看一张图,相信很多同学对这张图都不陌生,这是一张网络模型图,包含了 OSI 模型及 TCP/IP 模型,两个模型虽然有一点点区别,但主要的目的是一样的,模型图描述了通信是怎么进行的。它解决了实现有效通信所需要的所有过程,并将这些过程划分为逻辑上的层。层可以简单地理解成数据通信需要的步骤。

根据负载均衡所作用在 OSI 模型的位置不同,负载均衡可以大概分为以下几类:
二层负载均衡(mac)
根据OSI模型分的二层负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应。
三层负载均衡(ip)
一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应。
四层负载均衡(tcp)
在三层负载均衡的基础上,用ip+port接收请求,再转发到对应的机器。
七层负载均衡(>分布式是指不同的业务分布在不同的地方,集群指的是将几台服务器集中在一起,实现同一业务。白话理解的话,比如公司项目上线初期(举例电子商务网站)
初期:用户访问量低,只弄了一台服务器,一个tomcat项目运行一个web工程。
中期:用户访问量提高,服务器崩了,为了解决这个问题,购买服务器,增加服务器数量,然后每个服务器中个各放了一份,使用nginx代理转发。(这就是运用集群原理)
后期:用户访问量不断增加,响应速度变慢,服务器又崩了,在不考虑增加服务器带宽、内存和CPU的情况下如何解决这个问题?先解决响应速度变慢,用户频繁调用数据库,在客户端与数据库之间,使用redis缓存。解决之后,又发现问题:由于每台服务器运行一个tomcat,放着一个web工程,用户有可能在商品详情存在大幅度调用数据库,而订单列表调用幅度小,此时就存在着模块之间耦合度高,一个功能升级其他也需要升级,扩展性差,不能灵活部署。是该考虑项目重构,把项目按照模块分为不同的系统(使用zookeeper进行模块之间通信),例如:订单系统,会员系统、搜索系统、商品信息系统。把每个模块进行拆分,用户在哪个系统访问频繁,就针对哪个系统进行对症下药,增加缓存还是使用其他技术。(这样我们就可以单独对这个模块进行服务性能的提升,不用全部都一起提升。也降低了代码的耦合度,模块之间互不影响,即使后期增加开发人员,也可按照敏捷开发思想只对其负责模块进行开发,效率大大提升)。这样一个web工程就拆分成多个web工程(多个tomcat部署)。那这个项目就可以在一台服务器部署多个工程(不同端口进行通信)或者多台服务器运行单个项目。(这就是分布式原理)
总而言之,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。

简单的说两种方案:
1,一台 nginx 服务器做反向代理,第二台文件服务器,第三台做数据库服务器
2, 一台 nginx 脚本服务器,第二台做主库数据库服务器,第三台做从库数据库服务器加静态服务器。
这三台服务使用一个静态 IP,它们之间的关系为局域网,主服务器挂静态IP,nginxconf 设置域名 sever,访问直接到主服务器,主库数据库服务器限制数据库的读权限,端口为3306,从库数据库限制写权限,端口为 3307;两台数据库服务器进行数据同步,实现数据库读写分离,从库挂载网站静态内容,如 CSS ,JS, images, flash 等静态文件,实现动静分离。
集群的作用主要就是负载均衡,分流负压流量,数据库读写分离也是为了减缓数据库读写压力,动静分离的好处自然是更科学地规划文件分类,便于服务器文件的管理。
但一般来说,这些静态的东西全部用第三方的 SDN 来负载掉。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10275051.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-07
下一篇 2023-05-07

发表评论

登录后才能评论

评论列表(0条)

保存