经典的网站负载方案及配置

高可用性、可靠性的运营是任何网站所必须面临和解决的问题,现给出如下两种方案来解决网站运营过程中可能会出现的负载均衡问题。
负载均衡,即负载的分流,它可以保证系统的负载可以有效的分配到多台web服务器。从而可以缓解单台服务器负载过大、用户响时间过长及单台服务器宕机后造成服务的不可用。
对于目前的负载均衡,较为简单的策略有如下两种:
1、nginx + keepalived + web服务器
nginx做前端负载均衡器及反向代理服务器;
keepalived做为心跳检测器,用于检测nginx的前端负载均衡器是否可用;
web服务器,用于处理具体的业务逻辑,较常用的有nginx、tomcat、apache等
2、haproxy + keepalived + web服务器
haproxy做为前端负载均衡器;
keepalived做为心跳检测器,用于检测haproxy的前端负载均衡器是否可用;
web服务器功能如下所述。
3、 LVS + ldirectord + heartbeat + web服务器
ldirectord做为前端负载均衡器,用于完成负载调度的任务。
keepalived做为心跳检测器,用于检测ldirectord的前端负载均衡器是否可用;
web服务器功能如下所述。

下面将对上述前两种方案在Ubuntu中的实施做具体的配置。
方案一:nginx + keepalived + tomcat
其中IP的分配如下:
nginx(主): 172.16.11.245
nginx(从):172.16.11.247
tomcat(web server 1) : 172.16.11.142
tomcat(web server 2) : 172.16.11.149
虚拟IP:172.16.11.246

分别对在两台负载均衡器nginx上做如下的配置,即nginx.cfg文件 :

###############################################################################
worker_processes  1;
worker_rlimit_nofile 5000;
events {
        use epoll;
        worker_connections  10000;
}

http {
        include         mime.types;
        default_type    application/octet-stream;
        server_tokens off;
        server_names_hash_bucket_size 128;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 8m;

        sendfile on;
        tcp_nopush     on;
        keepalive_timeout 60;
        tcp_nodelay on;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 128k;
        gzip on;
        gzip_min_length  1k;
        gzip_buffers     4 16k;
        gzip_http_version 1.0;
        gzip_comp_level 2;
        gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;

        log_format access '$remote_addr - $remote_user [$time_local] "$request" $status $bytes_sent $request_time';

        access_log /usr/local/nginx/logs/access.log access buffer=32k;

        upstream examples.testing.com{
                ip_hash;                    #有两种不同方式来分配任务,此处采用ip_hash方式,还有一种weight方式。   
                server 172.16.11.142:8001;  #web server 1  
                server 172.16.11.149:8001;  #web server 2
         }

        server {
                listen  80;
                server_name 172.16.11.246;  #前端虚拟IP地址


                location /examples  {    #通过该地址即可以访问到真正的业务方法
                        proxy_pass http://examples.testing.com;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }
        }
}
#######################################################################################
在配置完成后,采用$nginx -c nginx.cfg即可以利用该配置文件来重启nginx.

在配置完一台nginx负载均衡器后,可以通过该IP地址直接访问:http://172.16.11.246/进入tomcat的首页面,再访问http://172.16.11.246/examples地址,即

可以访问tomcat中的实例。

由于nginx做为前端负载均衡器,所有访问后端web服务的请求都必经过nginx,为了确保nginx的宕机不会造成对后端请求的失败,在此可以采用keepalived做为心

跳检测器,来检测nginx当前是否可用。
它的具体配置如下:

##########################################################################################
vrrp_script chk_nginx {
    script "/opt/nginx_pid.sh"
        interval 2    #每次2秒检查一次
        weight 2
        vrrp_instance VI_1 {
            interface eth0
                state MASTER
                virtual_router_id 51
         priority 101                #101为主,100为从
        virtual_ipaddress{
            172.16.11.246       #虚拟IP地址
        }
        track_script {
            chk_nginx
        }
        }
}
#########################################################################################

#########################################################################################
vrrp_script chk_nginx {
    script "/opt/nginx_pid.sh"
        interval 2    #每次2秒检查一次
        weight 2
        vrrp_instance VI_1 {
            interface eth0
                state MASTER
                virtual_router_id 51
         priority 100                #101为主,100为从
        virtual_ipaddress{
            172.16.11.246       #虚拟IP地址
        }
        track_script {
            chk_nginx
        }
        }
}
#########################################################################################

编写测试脚本nginx_pid.sh

#########################################################################################
cd /opt

vim /opt/nginx_pid.sh

#!/bin/bash

A=`ps -C nginx --no-header | wc -l`        ## 查看是否有 nginx进程 把值赋给变量A

if [ $A -eq 0 ];then                              ## 如果没有进程值得为 零
      /usr/local/nginx/sbin/nginx                 ## 则启动 nginx 服务
      if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then   ##再次判断 nginx进程是否为零
              killall keepalived                  ## 则结束 keepalived 进程
      fi
fi
###########################################################################################

方案二、haproxy + keepalived + tomcat
其中IP的分配如下:
haproxy(主): 172.16.11.245
haproxy(从):172.16.11.247
tomcat(web server 1) : 172.16.11.142
tomcat(web server 2) : 172.16.11.149

虚拟IP:172.16.11.246
分别对在两台负载均衡器haproxy上做如下的配置,即haproxy.cfg文件 :

###########################################################################################
global
        log 127.0.0.1 local0 info
        maxconn 8192
        user haproxy
        group haproxy
        daemon
        spread-checks 4
        tune.maxaccept 4
        tune.maxpollevents 100
        #nbproc 8
        quiet
defaults
        #log global
        #log 127.0.0.1 local0 info
        mode http
        #option httplog
        #option logasap
        #option dontlognull
        retries 3
        option redispatch
        #option persist
        option forwardfor
        maxconn 8192
        timeout connect 50000
        timeout client  50000
        timeout server  50000
        stats uri /haproxy-stats
        stats hide-version
        stats refresh 10m
        stats enable
        stats uri /haproxy-stats
        stats realm Haproxy/ statistics
        stats auth nmting:c23cbfd563
stats refresh 1m

frontend test
        bind 0.0.0.0:80

        acl examples_rule path_beg /examples
        use_backend examples_group if examples_rule

        default_backend default_group

backend default_group
        mode http
        balance roundrobin
        cookie SRV insert indirect nocache
        option httpclose
        option transparent
        option httpchk HEAD /check.jsp HTTP/1.0
        server s1 172.16.11.142:8001 cookie s1 check inter 10000 rise 1 fall 2
        server s2 172.16.11.149:8001 cookie s2 check inter 10000 rise 1 fall 2

backend examples_group
        mode http
        balance roundrobin
        cookie SRV insert indirect nocache
        option httpclose
        option forwardfor
        option transparent
        option httpchk HEAD /check.jsp HTTP/1.0
        server s1 172.16.11.142:8001 cookie s1 check inter 10000 rise 1 fall 2
        server s2 172.16.11.149:8001 cookie s2 check inter 10000 rise 1 fall 2
###########################################################################################

在配置完成后,采用$haproxy -f haproxy.cfg即可以利用该配置文件来重启haproxy.

在配置完一台haproxy负载均衡器后,可以通过该IP地址直接访问:http://172.16.11.246/进入tomcat的首页面,再访问http://172.16.11.246/examples地址,

即可以访问tomcat中的实例。

由于haproxy做为前端负载均衡器,所有访问后端web服务的请求都必经过haproxy,为了确保haproxy的宕机不会造成对后端请求的失败,可以采用keepalived做为

心跳检测器,来检测haproxy当前是否可用。

##########################################################################################
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
        interval 2    #每次2秒检查一次
        weight 2
        vrrp_instance VI_1 {
            interface eth0
                state MASTER
                virtual_router_id 51
         priority 101                #101为主,100为从
        virtual_ipaddress{
            172.16.11.246       #虚拟IP地址
        }
        track_script {
            chk_haproxy
        }
        }
}
#########################################################################################

#########################################################################################
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
        interval 2    #每次2秒检查一次
        weight 2
        vrrp_instance VI_1 {
            interface eth0
                state MASTER
                virtual_router_id 51
         priority 100                #101为主,100为从
        virtual_ipaddress{
            172.16.11.246       #虚拟IP地址
        }
        track_script {
            chk_haproxy
        }
        }
}
#########################################################################################

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值