nginx负载均衡与高可用keepalived

负载均衡与反向代理

这里是以Nginx的反向代理功能来实现的负载均衡,是对网络七层的请求进行的,即url,请求的文件,目录等。

LVS负载均衡服务器是对网络四层即传输层进负载均衡,不耗流量,配置比较复杂,一般大型企业用

HAproxy 也是负载均衡服务器,既可以对四层也可以对七层进行负载均衡处理。

负载均衡起到分流的作用,防止请求过大对单台服务器,造成负载过度,影响性能和体验,将用户的请求分发到不同的web服务器。这样用户访问服务时,并不知道访问的真实服务器是哪台,反向代理,代理了后面的服务器。

准备

HOSTNAME    IP    说明
lb01    10.0.0.5    Nginx主负载均衡器
lb02    10.0.0.6    Nginx辅负载均衡器
web01    10.0.0.8    web01服务器
web02    10.0.0.7    web02服务器



[root@web01 ~]# /application/nginx/sbin/nginx -V
nginx version: nginx/1.12.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)

web 服务器 nginx.conf 配置

多虚拟主机

#web01 web02 nginx.conf 
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    server {
        listen       80;
        server_name  bbs.lewen.org;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
        access_log  logs/access_bbs.log  main;
    }
    server {
        listen       80;
        server_name  www.lewen.org;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        access_log  logs/access_www.log  main;
    }
}

 

查看

tree /application/nginx/html/ -Ld 1

for name in www bbs blog ;do echo "`hostname` $name.lewen.org"  > /application/nginx/html/$name/lewen.html; done
 
[root@web01 ~]# for name in www bbs blog ;do cat  /application/nginx/html/$name/lewen.html; done
web01 www.lewen.org
web01 bbs.lewen.org
web01 blog.lewen.org

#web01 web02环境准备完成 
[root@lb01 ~]# curl 10.0.0.8/lewen.html
web01 bbs.lewen.org
[root@lb01 ~]# curl 10.0.0.7/lewen.html
web02 bbs.lewen.org
[root@lb01 ~]# curl -H Host:www.lewen.org 10.0.0.8/lewen.html
web01 www.lewen.org
[root@lb01 ~]# curl -H Host:www.lewen.org 10.0.0.7/lewen.html
web02 www.lewen.org

 

负载均衡(反向代理)服务器配置

proxy_set_header 修改反向代理 向后面发出请求的时候的 请求头的信息  让web服务器记录真实的用户ip地址

events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    upstream server_pools {  
         server 10.0.0.7:80  weight=1;
         server 10.0.0.8:80  weight=1;
    }
    server {  
       listen       80;
       server_name  bbs.lewen.org;
       location / {
        proxy_pass http://server_pools; 
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}
    server {  
       listen       80;
       server_name  www.lewen.org;
       location / {
        proxy_pass http://server_pools; 
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}
}

 

Keepalived 高可用服务器

   负载均衡服务器,将前面请求的流量随机的分发到了后端的web服务器,减轻了对一台服务器的压力。但如果负载均衡服务器出现了问题,那么就可能导致,用户无法访问,或读写数据异常。这时候就需要切换到备用的负载均衡服务器,怎么切换呢,keepalived 软件帮我们实现了这点,即在负载均衡服务器的基础上打造高可用的服务器,遇到异常,自动切换负载均衡服务器。

http://www.keepalived.org/manpage.html

 

yum install keepalived -y

 

定义vrrp脚本,用于检测主nginx的状态(HTTP端口),防止脑裂

[root@lb01 conf]# cat /server/scripts/check_lb.sh
#!/bin/bash

if [ `ps -ef |grep nginx|grep -v grep` -eq 0 ];then       # 当发现nginx 服务异常,就停掉,这时keepalived软件就会启动备用服务器,将虚拟IP指向备服务器,进行正常服务
   /etc/init.d/keepalived stop
fi
[root@lb01 conf]# chmod +x /server/scripts/check_lb.sh

keepalived 配置

/etc/keepalived/keepalived.conf

[root@lb01 keepalived]# cat keepalived.conf
global_defs {
   router_id LB01
}

vrrp_script check_lb {                             # 定义vrrp脚本,检测HTTP端口。
    script "/server/scripts/check_lb.sh"           # 检查负载均衡器的状态,当主挂掉后,启动备的均衡服务器
    interval 2                                     # 间隔2秒
    weight 2
}

vrrp_instance VI_1 {
    state MASTER                                   # 主均衡服务器,注意备服务器为BACKUP
    interface eth0
    virtual_router_id 51
    priority 150                                
    advert_int 1                            # 多久问一次主是否活着
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24 dev eth0 label eth0:1              # 虚拟IP
    }
    track_script {
        check_lb                               # 触发检查
    }

}

 

高可用脑裂与解决

  由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为裂脑。

 

导致裂脑发生的原因
一般来说,裂脑的发生,有以下几种原因。
高可用服务器对之间心跳线链路故障,导致无法正常通信。
>心跳线坏了(包括断了,老化)。
>网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)。
>心跳线间连接的设备故障(网卡及交换机)。
>仲裁的机器出问题(采用仲裁的方案)。

  • 高可用服务器对上开启了iptables防火墙阻挡了心跳消息传输。
  • 高可用服务器对上心跳网卡地址等信息配置不正确,导致发送心跳失败。
  • 其他服务配置不当等原因,如心跳方式不同,心跳广播冲突、软件BUG等。

 

解决裂脑的常见方案

在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生。口同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳消息。
当检测到裂脑时强行关闭工个心跳节点(这个功能需特殊设备支持,如Stonith、fence)。相当于备节点接收不到心跳消息,发送关机命令通过单独的线路关闭主节点的电源。
做好对裂脑的监控报警(如邮件及手机短信等或值班),在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短信就有上行和下行的区别。报警信息报到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器,让服务器根据指令自动处理相应故障,这样解决故障的时间更短。
当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务,这个损失是可容忍的。

解决keepalived只基于服务器基本故障

keepalive 只有在keepalive服务器挂掉了,才会将虚拟机IP飘到备服务器。这样显然是不行的,当主nginx挂掉了,我们就应该检测到,主动将主keepaliveg干掉,将虚拟IP飘到备服务器。

写一个脚本来定时监控主的nginx状态。将跟踪检查脚本添加到

[root@lb01 conf]# cat /server/scripts/check_lb.sh
#!/bin/bash

if [ `ps -ef |grep nginx|grep -v grep|wc -l` -eq 0 ];then       # 当发现nginx 服务异常,就停掉,这时keepalived软件就会启动备用服务器,将虚拟IP指向备服务器,进行正常服务
   /etc/init.d/keepalived stop
fi
[root@lb01 conf]# chmod +x /server/scripts/check_lb.sh

 

posted @ 2018-03-08 13:32  元贞  阅读(216)  评论(0编辑  收藏  举报