您的位置:首页 > 运维架构 > 反向代理

负载均衡与反向代理

2019-08-18 22:31 921 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/zhou_xiong1130/article/details/99710596

负载均衡与反向代理

什么是集群?

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

一堆服务器合作干一件事情就是集群的概念。

为什么要使用集群?

  • 高性能

  • 价格有效性

  • 可伸缩性

  • 高可用性

  • 透明性

  • 可管理性

  • 可编程性

  • 性能
    网络服务的工作负载通常是大量相互独立的任务,通过一组服务器分而治之,可以获得很高的整体性能。

  • 性能/价格比
    组成集群系统的PC服务器或RISC服务器和标准网络设备因为大规模生产降低成本,价格低,具有最高的性能/价格比。若整体性能随着结点数的增长而接近线性增加,该系统的性能/价格比接近于PC服务器。所以,这种松耦合结构比紧耦合的多处理器系统具有更好的性能/价格比。

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

  • 高可用性
    在硬件和软件上都有冗余,通过检测软硬件的故障,将故障屏蔽,由存活结点提供服务,可实现高可用性。

当然,用服务器集群系统实现可伸缩网络服务也存在很多挑战性的工作:

  • 透明性(Transparency)
    如何高效地使得由多个独立计算机组成的松藕合的集群系统构成一个虚拟服务器;客户端应用程序与集群系统交互时,就像与一台高性能、高可用的服务器交互一样,客户端无须作任何修改。部分服务器的切入和切出不会中断服务,这对用户也是透明的。
  • 性能(Performance)
    性能要接近线性加速,这需要设计很好的软硬件的体系结构,消除系统可能存在的瓶颈。将负载较均衡地调度到各台服务器上。
  • 高可用性(Availability)
    需要设计和实现很好的系统资源和故障的监测和处理系统。当发现一个模块失败时,要这模块上提供的服务迁移到其他模块上。在理想状况下,这种迁移是即时的、自动的。
  • 可管理性(Manageability)
    要使集群系统变得易管理,就像管理一个单一映像系统一样。在理想状况下,软硬件模块的插入能做到即插即用(Plug & Play)。
  • 可编程性(Programmability)
    在集群系统上,容易开发应用程序

服务器集群技术的特点和功能

高可应用性与可扩展性

1.高可应用性

对于一些实时性很强的应用系统,必须保持服务的24小时不间断运行,而由于软件、硬件、网络和人为等各种原因,单一服务运行环境很难达到这种要求,此时构建一个服务器集群系统是个不错的选择。构建集群的一个的优点是集群具有高可用性,在服务出现故障时,服务器集群系统可以自动将服务从故障节点切换到另一个备用节点,从而提供不间断性服务,保证了业务的持续运行。

2.可扩展性

随着业务量的加大,现有的集群服务实体不能,满足需求时,可以向此集群中动态加入一个或多个服务节点,从而满足应用的需要,增强集群的整体性能,这是集群的可扩展性。

负载均衡与错误恢复

1.负载均衡

服务器集群系统的特点是可以灵活、有效地分担系统负载,通过集群自定义的负载分担策略,将客户端的访问分配到下面的各个节点。例如,可以定义轮询分配策略,将请求平均分配到各个服务节点,还可以定义最小负载分配策略,当一个请求进行时,服务器集群系统判断哪个服务器节点比较清闲,将此请求分发到这个节点。

2.错误恢复

当一个任务在一个节点上好没有完成时,由于某种原因,执行失败,此时,另一个服务节点应该能接着完成此任务,这是服务器集群提供的错误恢复功能,通过错误的重定向,保证了每个执行任务都能有效完成。

心跳监测与漂移IP

1.心跳监测

为了能实现负载均衡、提供高可用服务和执行错误恢复,服务器集群系统提供了心跳监测技术。心跳监测是通过心跳线实现的,可以做心跳线的设备有RS 232 串口线,也可以用独立的一块网卡来跑心跳,还可以是共享磁盘阵列等。心跳线的数量应该为服务器集群节点数减1。需要注意的是,如果通过网卡来做心跳的话,每个节点需要两块网卡,其中,一块作为私有网络直接连接到对方及其相应的网卡,用来监测对方心跳;另一块网卡连接到公共网络对外提供服务,同时心跳网卡和服务网卡的IP地址尽量不要在一个网段内。心跳监控的效率直接影响故障切换时间的长短,服务器集群系统正是通过心跳技术保持着节点的内部有效通信。

2.漂移IP地址

在服务器集群系统中,除了每个服务节点自身的真实IP地址外,还存在一个漂移IP地址。为什么说是漂移IP呢?因为这个IP地址并不固定,例如在两个节点的双机热备中,正常状态下,合格漂移IP位于主节点上,当主节点出现故障后,漂移IP地址自动切换到备用节点上。因此,为了保证服务器的不间断性。在集群系统,对外提供的服务IP一定要是这个漂移IP地址,虽然节点本身的IP也能对外提供服务,但是当此节点失效后,服务切换到了另一个节点,服务IP仍然是故障节点的IP地址,此时服务随之中断了。

集群的分类

  • 负载均衡集群(LBC\LB)常用的

    分担任务

  • 高可用性集群(HAC)常用的

    一个宕机,其他的机器很快就可以继续执行

  • 高性能计算集群(HPC)

    快速处理复杂的运算

  • 网格计算集群(很少用到)

常用的集群软硬件介绍

开源的:Nginx、LVS、Haproxy、Keepalived、Heartbeat

收费的:F5、Netscaler、Radware、A10

什么是负载均衡?

负载均衡(Load Balance)集群提供了一种廉价、有效、透明的方法,来扩展网络设备和服务器的负载、带宽、吞吐量,同时加强了网络数据的处理能力,提高了网络的灵活性和可用性。

搭建负载均衡服务的要求如下(必须满足,否则就没有意义了)

  • 请求分担,一台处理不了,可以有其他节点进行处理
  • 运算分担,一台处理不了,多个节点并行处理
  • 7x24小时运行

负载均衡与反向代理的区别?

负载均衡简单说就是任务分发下去了,其他的就不管了。

反向代理其实某种程度上实现了负载均衡的效果,所以可以算是一个子集。

Nginx负载均衡快速实践

  1. 硬件准备
主机 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
  1. 软件准备

    四台服务器均安装nginx

  2. 搭建web网站用于测试

    在lb_web1和lb_web2上搭建相同的web网站,为了方便测试请在返回结果处进行区分

      lb_web1

      搭建一个虚拟主机,lb.com

    • lb_web2

      同上,搭建一个虚拟主机,lb.com,web服务器应该运行的是统一个网站的源代码

    • lb_nginx1

      修改nginx的配置,

      #负载均衡指向的web服务器连接池
      upstream www_server_pools {
      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
      }
      }
  3. 修改客户端电脑上的hosts文件

    10.211.55.8	lb.com	#配置hosts
  4. 至此,最简单的负载均衡服务就搭建好了,当我们请求lb.com的时候,会发现,每次访问的主机都不一样。

upstream模块介绍

Nginx upstream

Nginx的负载均衡功能依赖于nginx_http_upstream_module模块,所支持的代理方式包括proxy_pass、uwsgi_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

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;

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;
}

高可用实战

准备工作
1.web02
2.web01
3.lvs01
4.lvs02

一:web01、web02配置一模一样的虚拟主机  www.caoliu.com
二.负载均衡配置一模一样的配置

1.两台lvs分别编译安装  keepalived
首先 安装 依赖包
sudo apt-get install libpopt-dev openssl libssl-dev
wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz
tar -zxvf keepalived-1.2.24.tar.gz
cd  keepalived-1.2.24
./configure --prefix=/usr/local/keepalived
make
make install

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

vim /etc/keepalived/keepalived.conf  分别配置

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ #将keepalived 执行命令 复制到 /usr/sbin
keepalived -D  #启动keepalived服务
killall -TERM keepalived #杀掉keepalived进程

master

! Configuration File for keepalived

global_defs {
notification_email {
}
#notification_email_from Alexandre.Cassen@firewall.loc
#smtp_server 192.168.200.1
#smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/chk_nginx.sh"
weight -10
fall 3
rise 2
}

vrrp_instance VI_1 {
state MASTER
interface ens33
mcast_src_ip 192.168.58.18
virtual_router_id 18
priority 150
advert_int 2
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.58.232
}

track_script {
chk_nginx
}
}

backup

! Configuration File for keepalived

global_defs {
notification_email {
}
#notification_email_from Alexandre.Cassen@firewall.loc
#smtp_server 192.168.200.1
#smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/chk_nginx.sh"  #脚本所在位置  检测到nginx是否启动
weight -10 #如果检测失败 那么该服务器 的权重降10
fall 3 #失败3次才是真的失败
rise 2 #成功两次才是真的成功
}

vrrp_instance VI_1 {
state BACKUP
interface ens33
mcast_src_ip 192.168.58.23
virtual_router_id 18  #这个值要跟主保持一致
priority 150
advert_int 2
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.58.232   #这个ip地址要跟 服务器在一个网段内
}

track_script {
chk_nginx
}
}

vim /etc/keepalived/chk_nginx.sh

while:
do
nginxpid=`ps -C nginx --no-header | wc -l`
if [ $nginxpid -eq 0 ];then
`service nginx start`
nginxpid = `ps -C nginx --no-header | wc -l`  #--no-header 去除守护进程  守护进程是不管你启动与否 都会显示这个进程
sleep 3
if [ $nginxpid -eq 0 ];then
`killall -TERM keepalived`
fi
fi
done

裂脑

一台服务器可以拥有多个ip地址 但是一个ip地址只能被一台服务器占用

如果两台服务器拥有同一个ip 导致 容易导致数据丢失 数据冲突等

裂脑出现的原因

1.两台负载均衡服务器 之间心跳线 路故障 或者交换机出现故障等

2.配置有问题

3.脚本出故障检测失败

4.第三方仲裁出故障了

裂脑解决方案

1.双绞线 (不受长度影响 安全性略低)和同轴线缆 (长度短 安全性高)同时连接 检测交换机

2.检测配置文件是否有故障

3.编写脚本 检测nginx 服务是否移动 并恢复nginx服务 或者 两台同时ping 网关 如果ping不通网关证明 问题出在谁身上 然后强制停掉其中一台

4.强制关闭其中一台

5.如果操作第三方存储 可以上锁 如果此刻有线程正在操作 那么等待 直到释放锁 获取锁才操作

动静分离网站集群架构

动静分离的优势

上图能把我们的项目业务进行更好更合理的划分,比如我们的web集群中的服务器偏运算型的,CPU可以快一些,图片集群服务器需要更大的带宽,那么就可以分配更多的带宽来使用,上传集群需要频繁的大文件读写,那么就需要更稳定的磁盘进行管理。

动静分离实战

  1. 硬件准备
主机 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
  1. 全部安装nginx即可

  2. 服务器配置

      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

配置说明

……… //内容略
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: