什么是集群?
简单的说就是指一组相互独立的服务器。利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(单台服务器)都是运行各自的独立服务。
一堆服务器合作干一件事情就是集群的概念。
集群的分类
- 负载均衡集群(LBC\LB)常用的
分担任务- 高可用性集群(HAC)常用的
一个宕机,其他的机器很快就可以继续执行- 高性能计算集群(HPC)
快速处理复杂的运算 rpc- 网格计算集群(很少用到)
什么是负载均衡?
负载均衡(Load Balance)集群提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载、带宽、吞吐量,同时加强了网络数据的处理能力,提高了网络的灵活性和可用性。
搭建负载均衡服务的要求如下(必须满足,否则就没有意义了)
- 请求分担,一台处理不了,可以有其他节点进行处理
- 运算分担,一台处理不了,多个节点并行处理
- 7x24小时运行
负载均衡与反向代理的区别?
负载均衡简单说就是任务分发下去了,其他的就不管了。
反向代理其实某种程度上实现了负载均衡的效果,所以可以算是一个子集。
负载均衡实践
1. 硬件准备
4台虚拟机(有nginx)
主机 | IP | 说明 |
---|---|---|
fzjh_nginx1 | 192.168.134.33 | 主负载 |
fzjh_web1 | 192.168.134.128 | web server |
fzjh_web2 | 192.168.134.131 | web server |
fzjh_web3 | 192.168.134.132 | web server |
2.主负载配置
fzjh_nginx1的nginx.conf
http中配置:
upstream fzjh{
server 192.168.134.128 weight=1;
server 192.168.134.131 weight=1;
server 192.168.134.132 weight=1;
}
server中配置:
location /
{
proxy_pass http://fzjh; #当域名请求发送到这里的时候,他会自动查询连接池里面的主机
proxy_set_header Host $host;#把主机header头发送给轮询的主机
proxy_set_header X-Forwarded-For $remote_addr;#获取真实的ip
}
至此,最简单的负载均衡服务就搭建好了,当我们请求主负载192.168.134.33的时候,会分发给不同的主机处理。此实验并未实现高可用。
3.upstream模块介绍
Nginx的负载均衡功能依赖于nginx_http_upstream_module模块,所支持的代理方式包括proxy_pass、fastcgi_pass、memcached_pass等,新版Nginx软件支持的方式所有增加。本文主要讲解proxy_pass代理方式。
#添加连接池
upstream www_server_pools { #自定义的名称
server 10.211.55.10:80 weight=1; #权重
server 10.211.55.11:80 weight=1; #权重,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
#ip_hash; #ip hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
#fair; 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
#hash $request_uri; 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
#hash_method crc32;
#默认轮询。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
}
#111.110.117.107
#添加连接池
upstream staic { #自定义的名称
server 10.211.55.10:80 weight=1; #权重
server 10.211.55.11:80 weight=1; #权重
}
#配置主机指向
server
{
listen 80;
server_name yourwebname.com;
location / {
proxy_pass http://www_server_pools; #当域名请求发送到这里的时候,他会自动查询连接池里面的主机
proxy_set_header Host $host; #把主机header头发送给轮询的主机
proxy_set_header X-Forwarded-For $remote_addr; #获取真实的ip
}
}
4. upstream调度算法
- rr轮询(默认调度算法,静态调度算法)
- wrr(权重轮询,静态调度算法)
- ip_hash(静态调度算法)
- fair(动态调度算法)
- least_conn
- url_hash算法
- 一致性hash算法
反向代理
新建 proxy.conf文件,内容:
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_cache,给个范例供参考:
location ~ .*\.html$
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
proxy_cache_valid 200 304 12h;
proxy_cache_valid 301 302 1m;
proxy_cache_valid any 1m;
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Accept-Encoding "";
proxy_ignore_headers "Cache-Control" "Expires";
proxy_pass http://backend_server;
expires 5d;
}
在主负载上nginx.conf 文件中对应的location /{} 里include proxy_cache
location / {
proxy_pass http://default_pools;
include proxy.conf;
}
配置说明
……… //内容略
http {
…….. //内容略
client_max_body_size 300m; //允许客户端请求的最大单个文件字节数,它出现在请求头部的Content-Length字段。(可以更改此参数达到限制用户上传文件大小的目的)
client_body_buffer_size 128k; \\缓冲区代理缓冲客户端请求的最大字节数,可以理解为先保存到本地再传给用户。 这个指令可以指定连接请求使用的缓冲区大小,默认值:8k/16k 。如果客户端请求一个文件大于128k,则Nginx会尝试在硬盘上创建临时文件。如果硬盘满了,则会报错。
client_body_temp_path /dev/shm/client_body_temp; \\这个指令指定连接请求试图写入缓存文件的目录路径。
proxy_connect_timeout 600; \\跟后端服务器连接的超时时间,发起握手等候响应超时时间
proxy_read_timeout 600; \\连接成功 _等候后端服务器的响应时间_其实已经进入后端的排队中等候处理。默认值:
proxy_send_timeout 600; \\后端服务器回传时间_就是在规定时间内后端服务器必须传完所有的数据。设置代理服务器转发请求的超时时间,同样指完成两次握手后的时间,如果超过这个时间代理服务器没有数据转发到后端服务器,nginx将关闭连接。
proxy_buffer_size 16k; \\代理请求缓存区_这个缓存区间会保存用户的头信息来提供Nginx进行规则处理。一般只要能保存下头信息即可。默认值:proxy_buffer_size 4k/8k 。设置从后端服务器读取的第一部分应答的缓
冲区大小,通常情况下这部分应答中包含一个小的应答头。
proxy_buffers 4 32k; \\设置用于读取应答(来自后端服务器)的缓冲区数目和大小,告诉Nginx保存单个用的几个
Buffer,最大用多大空间
proxy_busy_buffers_size 64k; \\如果系统很忙的时候可以申请更大的proxy_buffers,官方推荐*2
proxy_temp_file_write_size 64k; \\设置在写入proxy_temp_path时缓存临文件数据的大小,在预防一个工作进程在传递文件时阻塞太长。
proxy_temp_path /dev/shm/proxy_temp; \\类似于http核心模块中的client_body_temp_path指令,指定一个目录来缓冲比较大的被代理请求。
upstream rsyslog.org_pool {
server 192.168.100.104:80 weight=4 max_fails=2 fail_timeout=30s; //为了做测试两台服务器默认性能都一样,平均负载
server 192.168.100.105:80 weight=4 max_fails=2 fail_timeout=30s;
} \\HTTP负载均衡模块。upstream这个字段设置一群服务器,可以将这个字段放在proxy_pass和fastcgi_pass指令中作为一个单独的实体,它们可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。 服务器可以指定不同的权重,默认为1。
server {
listen 80;
server_name www.rsyslog.org; //设置所有web服务器负载的共同域名
index index.html index.htm;
location / {
proxy_pass http://rsyslog.org_pool/; //确定需要代理的URL,端口或socket。
proxy_set_header Host $host;
proxy_redirect off; \\如果需要修改从后端服务器传来的应答头中的"Location"和"Refresh"字段,可以用这个指令设置。
proxy_set_header X-Real-IP $remote_addr; \\这个指令允许将发送到后端服务器的请求头重新定义或者增加一些字段。 这个值可以是一个文本,变量或者它们的组合。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404; \\当后端服务器遇到500、502、503、504、404错误与超时,自动将请求转发给rsyslog.org_pool组的另一台服务器,达到故障转移
}
#确定在何种情况下请求将转发到下一个服务器:
#error - 在连接到一个服务器,发送一个请求,或者读取应答时发生错误。
#timeout - 在连接到服务器,转发请求或者读取应答时发生超时。
#invalid_header - 服务器返回空的或者错误的应答。
#http_500 - 服务器返回500代码。
#http_502 - 服务器返回502代码。
#http_503 - 服务器返回503代码。
#http_504 - 服务器返回504代码。
#http_404 - 服务器返回404代码。
#off - 禁止转发请求到下一台服务器。
}
}
网友评论