什么是集群?
集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
——摘自百度百科
集群的好处
1 提高性能
一些计算密集型应用,如:天气预报、核试验模拟等,需要计算机要有很强的运算处理能力,现有的技术,即使普通的大型机器计算也很难胜任。这时,一般都使用计算机集群技术,集中几十台甚至上百台计算机的运算能力来满足要求。提高处理性能一直是集群技术研究的一个重要目标之一。
2 降低成本
通常一套较好的集群配置,其软硬件开销要超过100000美元。但与价值上百万美元的专用超级计算机相比已属相当便宜。在达到同样性能的条件下,采用计算机集群比采用同等运算能力的大型计算机具有更高的性价比。
3 提高可扩展性
用户若想扩展系统能力,不得不购买更高性能的服务器,才能获得额外所需的CPU 和存储器。如果采用集群技术,则只需要将新的服务器加入集群中即可,对于客户来看,服务无论从连续性还是性能上都几乎没有变化,好像系统在不知不觉中完成了升级。
4 增强可靠性
集群技术使系统在故障发生时仍可以继续工作,将系统停运时间减到最小。集群系统在提高系统的可靠性的同时,也大大减小了故障损失。
集群架构图
那么问题来了,我们的集群由N太服务器组成,那么客户端怎么知道有这么多服务器,又该访问哪一台服务器呢?今天的主角Nginx就是用来干这个事情的。
Nginx概述
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
加入Nginx后,我们上面的架构图就变成
准备程序,这次建一个.NetCore WebApi项目做演示
private IConfiguration _configuration;
public WeatherForecastController(ILogger<WeatherForecastController> logger,IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
[HttpGet]
public IEnumerable<string> Get()
{
//dotnet Cluster.dll --urls="http://*:6666" --ip="127.0.0.1" --port=6666
return new string[] { _configuration["port"] };//获取命令行参数
}
新建项目使用原始的WeatherForecastController即可,并且注入IConfiguration以便等下命令行启动程序时获取端口和ip参数,Get方法中返回获得的端口参数。
dotnet Cluster.dll --urls="http://*:6666" --ip="127.0.0.1" --port=6666
dotnet Cluster.dll --urls="http://*:7777" --ip="127.0.0.1" --port=7777
dotnet Cluster.dll --urls="http://*:8888" --ip="127.0.0.1" --port=8888
找到项目所在文件目录cmd,通过命令行启动多个程序,分别为6666端口、7777端口、8888端口
分别访问localhost:6666/WeatherForecast、localhost:7777/WeatherForecast、localhost:8888/WeatherForecast、localhost:9999/WeatherForecast
6666端口、7777端口、8888端口都可以正常访问并且返回了对应的端口号,因为我们并没有启动9999端口号,所以访问失败了。
我们启动了3个不同端口的服务,想要访问的话必须得手动输入端口号。但是实际中,用户是通过域名或者固定ip访问的,不能要求用户手动端口访问。那么久需要Nginx进反向代理并且完成负载均衡。
下载Nginx
下载地址:http://nginx.org/en/download.html
配置Nginx
打开conf文件夹下的nginx.conf文件
添加如下配置
启动Nginx
可以看到我们的URL的8089端口没有变 但是每次访问的服务都是不一样的。成功完成了Nginx的分发。
Nginx的各种策略
1、轮询
我们上面用到的策略就是轮询策略,也是Nginx的默认策略。轮询模式会依次给每个服务器进行分发,相对平均。
2、weight(权重)
我们的服务器配置和各因素会存在性能上的差异,肯定希望把更多的请求分发给性能较高的服务器。那么久可以使用权重策略。
我们只需在原来的配置加上 weight=权重比例 即可。
3、ip_hash
ip_hash 的作用是,根据访问者的ip计算hash值 进行转发,这样就保证了同一个ip的访问者永远经过负载均衡后访问的是同一个服务器。
4、url_hash