负载均衡与反向代理
什么是集群?
简单的说就是指一组相互独立的服务器。利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(单台服务器)都是运行各自的独立服务。
一堆服务器合作干一件事情就是集群的概念。
xml-dtd 5% 金融
<userinfo>
<name type='str'>Majack</name>
<age type='int'>50</age>
<sex>male</sex>
</userinfo>
josn 95%
userinfo={name:'MaJack',age:50,sex:'male'}
为什么要使用集群?
- 高性能
- 价格有效性
- 可伸缩性
- 高可用性
- 透明性
- 可管理性
- 可编程性
集群的分类
- 负载均衡集群(LBC\LB)常用的
分担任务 - 高可用性集群(HAC)常用的
一个宕机,其他的机器很快就可以继续执行 - 高性能计算集群(HPC)
快速处理复杂的运算 - 网格计算集群(很少用到)
常用的集群软硬件介绍
开源的:Nginx、LVS、Haproxy、Keepalived、Heartbeat
收费的:F5、Netscaler、Radware、A10
什么是负载均衡?
负载均衡(Load Balance)集群提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载、带宽、吞吐量,同时加强了网络数据的处理能力,提高了网络的灵活性和可用性。
搭建负载均衡服务的要求如下(必须满足,否则就没有意义了)
- 请求分担,一台处理不了,可以有其他节点进行处理
- 运算分担,一台处理不了,多个节点并行处理
- 7x24小时运行
负载均衡与反向代理的区别?
负载均衡简单说就是任务分发下去了,其他的就不管了。
反向代理其实某种程度上实现了负载均衡的效果,所以可以算是一个子集。
Nginx负载均衡快速实践
快速实践负载均衡架构图
- 硬件准备
主机 IP 说明
lb_nginx1 10.211.55.8 主负载
lb_nginx2 10.211.55.9 辅负载,上面挂了,就快速切换到这里来
lb_web1 10.211.55.10 web server
lb_web2 10.211.55.11 web server
-
软件准备
四台服务器均安装nginx -
搭建web网站用于测试
在lb_web1和lb_web2上搭建相同的web网站,为了方便测试请在返回结果处进行区分-
lb_web1
搭建一个虚拟主机,lb.com -
lb_web2
同上,搭建一个虚拟主机,lb.com,web服务器应该运行的是统一个网站的源代码 -
lb_nginx1
修改nginx的配置,b
#负载均衡指向的web服务器连接池
upstream www_server_pools {
#什么都不添加 只写 ip 是轮询的方式
#轮训是’一人’一次
#weight权重 自己的 值 除以 总和
#ip_hash 根据ip的hash算法,得到一个固定的值,一个IP以后只能访问固定的机器,可以解决session问题
server 10.211.55.10 weight=1;
server 10.211.55.11 weight=1;
}#配置主机指向 server { listen 80; server_name lb.com; location / { proxy_pass http://www_server_pools; #当域名请求发送到这里的时候,他会自动查询连接池里面的主机 proxy_set_header Host $host; #把主机header头发送给轮询的主机 proxy_set_header X-Forwarded-For $remote_addr; #获取真实的ip } } # /usr/local/nginx/conf/nginx.conf # http://10.11.52.61:88 # http://10.11.52.62:88 # http://10.11.52.62
-
-
修改客户端电脑上的hosts文件
10.211.55.8 lb.com #配置hosts -
至此,最简单的负载均衡服务就搭建好了,当我们请求lb.com的时候,会发现,每次访问的主机都不一样。
upstream模块介绍
Nginx 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掉,能自动剔除。
}
#添加连接池
upstream staic { #自定义的名称
server 10.211.55.10:80 weight=1; #权重
server 10.211.55.11:80 weight=1; #权重
}
#配置主机指向
server
{
listen 80;
server_name lb.com;
location / {
proxy_pass http://www_server_pools; #当域名请求发送到这里的时候,他会自动查询连接池里面的主机
proxy_set_header Host $host; #把主机header头发送给轮询的主机
proxy_set_header X-Forwarded-For $remote_addr; #获取真实的ip
}
}
upstream调度算法
(1)rr轮询(默认调度算法,静态调度算法)
(2)wrr(权重轮询,静态调度算法)
(3)ip_hash(静态调度算法)
(4)fair(动态调度算法)
(5)least_conn
(6)url_hash算法
(7)一致性hash算法
反向代理
proxy.conf
负载均衡就是将请求分发到各个公网服务器上 redis 解决请求头或者session
负载均衡+include proxy.conf = 正向
反向代理就是将请求分发到各个内网的服务器上 include proxy.conf
include
包含,看起来更简洁规范
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;
#允许跨域 * 所有的ip地址
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
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;
}
动静分离网站集群架构
动静分离网站集群架构示意图(上图)
动静分离的优势
上图能把我们的项目业务进行更好更合理的划分,比如我们的web集群中的服务器偏运算型的,CPU可以快一些,图片集群服务器需要更大的带宽,那么就可以分配更多的带宽来使用,上传集群需要频繁的大文件读写,那么就需要更稳定的磁盘进行管理。
动静分离实战
- 硬件准备
主机 IP 说明
lb_nginx1 10.211.55.8 主负载
lb_nginx2 10.211.55.9 辅负载,上面挂了,就快速切换到这里来
lb_web1 10.211.55.10 web server
lb_static1 10.211.55.11 static server
lb_upload1 10.211.55.12 upload server
- 全部安装nginx即可
- 服务器配置
- lb_nginx1
主要修改nginx.conf配置文件如下
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream static_pools {
server 10.211.55.10:80 weight=1;
}
upstream upload_pools {
server 10.0.0.10:80 weight=1;
}
upstream default_pools {
server 10.0.0.11:80 weight=1;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_pass http://default_pools;
include proxy.conf;
}
location /static/ {
proxy_pass http://static_pools;
include proxy.conf;
}
location /upload/ {
proxy_pass http://upload_pools;
include proxy.conf;
}
}
} - lb_nginx2
同上即可 - lb_web1
创建虚拟主机lb.com,指向一个web目录,比如/home/wwwroot/1603 - lb_static1
创建虚拟主机lb.com,指向一个web目录,比如/home/wwwroot/1603
还得有一个目录存放图片资源比如:/home/wwwroot/1603/static - lb_upload1
创建虚拟主机lb.com,指向一个web目录,比如/home/wwwroot/1603
还得有一个目录存放上传图片资源比如:/home/wwwroot/1603/upload
- lb_nginx1
配置说明
……… //内容略
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 - 禁止转发请求到下一台服务器。
}
}
[root@rhel6u3-2 ~]# vim /var/named/view/zone/Others.rsyslog.org.zone
www A 192.168.100.106